notes
  • notes
  • codes
    • 安卓脚本
    • redis入门指南
    • js 原型链
    • 如何发布npm
    • go字符串
    • redis
    • this指向
    • go1.13
    • go by example
    • hook
    • go指南 - 官网
    • git基本操作
  • vim
  • training
    • 9月19日 ubc讲座
    • zby
      • DAY 3 :硬拉 | ZBY
      • DAY 2:卧推 | ZBY
      • DAY 1:深蹲 | ZBY
      • DAY 4 :计划 | ZBY
    • 汉唐
    • 周旋康复课
  • book notes
    • 思考致富
    • 邓普顿教你逆向投资
    • 阮琦
    • 魔鬼经济学
    • 网络是怎样连接的
    • 好奇心
    • 魔鬼约会学5.0
    • 股票作手回忆录
    • 漫步华尔街
    • 码农翻身
    • 十分钟速成课 - 哲学
    • 魔鬼答疑
    • 大话数据结构
    • 魔鬼约会学笔记
    • 算法图解
  • 狼人杀
  • 图书馆
  • typora
  • imovie
Powered by GitBook
On this page
  • 0章 概览
  • 第一章 浏览器生成消息
  • 解析url
  • 向dns查询web服务器的ip地址
  • dns服务器
  • 委托协议栈发送消息
  • 第二章 tcp/ip传数据
  • 创建套接字
  • 连接服务器
  • 收发数据
  • 删除套接字
  • 收发数据小结
  • ip与以太网的包收发操作
  • udp协议
  • 第三章 网线到网络设备
  • 信号在网线和集线器中传输
  • 交换机的包转发
  • 路由器的包转发
  • 路由器附加功能
  • 第四章 接入网和运营商
  • 4.1 ADSL接入网的结构和工作方式
  • 4.2 FTTH
  • 4.3 接入网中使用的PPP和隧道
  • 4.4 网络运营商内部
  • 4.5 跨运营商网络包
  • 第五章 服务器端局域网
  • 5.1 服务器部署地点
  • 5.2 防火墙
  • 5.3 分布式架构来负载均衡
  • 5.4 缓存来负载均衡
  • 5.5 内容分发服务
  • 缓存内容更新方法
  • 第六章 请求到达web服务器,响应返回浏览器
  • 6.1 服务器概览
  • 6.2 服务器的接收操作
  • 6.3 web服务器程序解释请求
  • 6.4 浏览器接收相应消息并展示内容

Was this helpful?

  1. book notes

网络是怎样连接的

Previous魔鬼经济学Next好奇心

Last updated 5 years ago

Was this helpful?

0章 概览

需要在浏览器和web服务器之间通信的机制。

  • 要正确送达通信的对象。因为网络中计算机很多

  • 传输内容要准确,不能丢失或损坏。

即,要把0和1准确搬运到目的地。

把数字信息分割成一个个小块,然后装入“包”packet中运送。相当于信件的运送包裹。

交换机和路由器相当于邮局或快递公司的分拣处理区。根据包的头部信息,来把包接力送到目的地。

第一章 浏览器生成消息

网址,url,uniform resource locator。

  • 开头是浏览器要使用的访问方法

http访问web服务器;ftp访问ftp服务器

image-20191023144640567

解析url

有文件访问文件,如果是目录就访问默认的index或default

目录和文件不能重名,或者说目录就是文件

http协议

客户端和服务器之间交互消息的内容和步骤

  • 访问什么:URI。就是“/dir1/file1.html ”这种

  • 服务器要进行怎样操作:方法。

    • GET:获取文件内容;返回程序的输出数据

    • POST:发送数据

    • PUT:替换URI指定的文件,不存在就创建

    • DELETE:删除文件

get方法能发送的数据只有几百直接,发更多数据需要用post

  • 先返回数据

  • 如果包含图片,在相应位置插入图片标签,留出空间。

    然后再次向服务器请求对应的图片。

    每次只能获取一个文件,即一张图片一个url

  • 浏览器将收集到的内容贴在页面上

向dns查询web服务器的ip地址

浏览器 需要 解析网址、生成http消息、查询服务器对应的ip地址。

再通过 操作系统,把消息发送到网络。

操作系统看不懂域名,需要浏览器先翻译好ip地址。

tcp/ip

多个 子网 通过 路由器 ,连接成了一个大的网络

子网 ,是几台计算机通过 集线器 连接而成。

网络中所有的设备都会被分配一个门牌号,就叫ip地址。

数据从计算机发出,到集线器,转发到最近的路由器,再转发到下一个路由器。不断转发直至到达目的地。

ip地址,是32比特数字。8比特一组分4组。变成10进制然后圆点隔开。

ip地址分为 网络号 和 主机号 两部分,分配关系用子网掩码来表示,1是网络号,0是主机号。

简写子网掩码:一共有多少个1

  • 主机号全0:整个子网

  • 主机号全1:向子网上所有设备发送

域名和ip并用

域名好记,但往往就很长,拿着这个找地址就很麻烦。

因此,人用域名,dns翻译成ip,路由器用ip

socket库来查询ip地址

浏览器向最近dns服务器查询ip,查不到就继续向上查。

如何查询?

电脑上dns客户端,叫dns解析器。查ip就是域名解析

解析器包含在操作系统的socket库中。

socket库

库是一堆通用程序组件的集合。socket库是网络开发的标准库

简言之,就是掉一个api,传入域名,传出的就是ip地址了。

dns服务器地址是事先设置好的,不需要再去查询了。

dns服务器

客户端查询消息:

  • 域名

    邮件是@后的部分

  • 类型

    A是ip地址(address)

    mx是邮件(mail exchange)

域名层次结构

根据域名分层保存。一个句点一层,一层被称为一个 域 。如com域

一个域的信息,作为一个 整体 存在dns服务器中。

一个域 可以划分多个 子域

域名中,越靠右层次越高。

如www.nik.co.jp,jp是分给日本的域;co是日本国内的域;nik是某公司的域;www是服务器名称。

最上层是 根域,没有名字,要表示的话就在最后加一个点,如www.nik.co.jp.一般忽略

查ip的时候,也是从右往左查。因为上级域会记录下级域的dns服务器信息。【简言之就一层层下去查】

根域dns服务器,保存在所有dns服务器中。里面一共存了13个ip地址。

现实中可能上下级域在同一个dns服务器上;也可能一个域在多个服务器上。

缓存

记住之前查询过的域名,存在或不存在等。设定一个过期时间。

委托协议栈发送消息

浏览器等应用程序,不会自己向ip地址发送消息。

要委托操作系统的内部协议栈,来发送数字信息。

委托过程:

  • 服务器创建套接字(两端接口),等待客户端连接

  • 客户端连接到服务器端

  • 收发数据,通信

  • 断开链接,删除套接字

创建套接字

socket创建完后会返回一个描述符,用来区分不同的套接字。

因为同时可能有很多个连接,如一个程序两个页面就可能连两台服务器。

描述符是socket和应用程序交互,数据收发的通道。

连接阶段

连接需要:描述符、ip地址、端口号

  • 描述符,是计算机内部识别套接字

  • 端口号,是外部的另一方识别套接字

服务器的端口号是固定的,全球统一。

客户端的端口号,是在创建套接字的时候就分配了一个,连接的时候告诉服务器端就行了。

【客户端,生成套接字,给应用程序返回描述符,给服务器端返回端口号】

【感觉套接字,就是双方通信的一层抽象】

通信阶段

应用程序把数据放在自己的内存里,然后送到套接字里面,socket送到服务器端对应的套接字。

服务器端返回消息,会存放到应用程序的内存,里面的接受缓存区,这就相当于给应用程序了。

断开阶段

哪一方断开,另一方就会收到通知,然后也断开,把套接字删除

第二章 tcp/ip传数据

协议栈如何收发数据

  • 应用程序,通过socket固定的api来收发数据。

  • 操作系统内,tcp/udp协议,接受委托执行收发数据操作

  • ip负责把数据切小块,发送出去

  • 网卡等硬件就是实际完成收发操作的。

创建套接字

调用socket创建套接字,会在协议栈内部开辟一块空间,用来存放控制信息。里面一行就是一个套接字。

里面存放如,对方ip和端口;等待重发时间等等信息。

协议栈,就根据这些配置/套接字,来工作。

【换言之,就是存放了该怎样通信的信息】

协议栈把本地套接字与服务器套接字进行连接。

连接服务器

连接是什么?网线一直连着也一直有信号。

连接,就是双方交换控制信息。即能够完成收发操作的必要信息,比如ip地址和端口等。

刚创建套接字,是不知道通信对象是谁的。

  • 应用程序把对方ip地址、端口号,告诉协议栈,写进控制信息里面

  • 对面服务器端也不知道和谁连,于是客户端向服务器端发送消息,告诉自己的ip、端口等等信息

双方交换了控制信息,就完成了连接。

此外,还需要一块用来临时存放收发数据的内存空间,即缓冲区。也是在连接中分配的。

【连接服务器,也就是完成连接的准备】

控制信息是什么

可以分为两类:

  • 客户端和服务器相互联络时,交换的控制信息。

    被记录在互联网包的开头,即头部。

  • 收发数据的缓存

    协议栈的内存空间,中记录的信息。

连接操作的具体过程

服务器ip地址和端口号,传给协议栈中的tcp模块

  • 客户端的tcp模块,创建tcp的控制信息头。表示开始数据收发(SYN=1) 里面包含客户端和服务器端的端口号

  • 信息传给ip模块,专门来发送网络包

  • 网络包到达服务器,服务器的ip模块接收,然后转给tcp模块

  • 服务器tcp模块解析tcp头,找到客户端的端口号对应的套接字

    然后服务器在自己端口中,找一个相同的套接字,就算是连上了。

服务器返回数据给客户端

  • 服务器tcp模块设置SYN=1,ACK=1表示收到了网络包

  • 服务器tcp给ip,ip传,客户端ip收,转给客户端tcp模块

  • 客户端tcp拆开看连接是否成功,成功的话把服务器ip、端口号等写进自己的套接字

然后客户端再发条消息给服务器端,说明自己收到了内容,可以开始通信了

  • 也是同理,tcp/ip -> ip/tcp

这样就建立了连接

收发数据

协议栈会先把数据放在内存的,发送缓冲区中。类似于一个缓存,尽量每次发包都用尽包的长度。

MTU表示包最大长度,包括头;不包括头叫MSS

当然不能等太久发,还有个计时器,一定时间后也会发包。

【感觉有点像公交车,定时发车,人满也发车】

应用程序在发送的时候有可选项,即立刻发送。

拆分数据

每个包前面都要加头,后面跟着拆后的数据

发回ack号来确认收到

tcp头里面会写上序号,收到后对方会拼起来。

ack会返回,某序号之前的数据都已经收到了。

不过初始值是随机的,为了防止别人攻击。

因此在简历连接的时候,还要告诉双方自己的初始值。【这时候拦截一下。。那不还是知道了吗】

返回确认信息,总是要发一下ack号。如果没收到ack号,就要重新发送。

因此网卡、集线器、路由器都没有错误补偿机制,一旦有错就丢弃包,对方也会重新发过来。

如果网断了,几次重新传都没有ack返回,就会强制结束通信,并向应用程序报错。

动态调整等待时间

ack返回慢,就延长等待时间;反正缩短。

不然网络堵塞还疯狂传,就很麻烦。

滑动窗口

发一次等一个ack,太浪费。可以一次发多个。

接收到数据,会先放在接收的缓冲区中。发太多就有可能超过对方处理数据的能力,缓冲区溢出。

  • 连接准备时,要先和发送方说自己最多能接受多少数据,写在tcp头部当中

    能接受最大数据量,叫窗口大小

  • 每次处理完数据,要告诉下发送方已经处理了多少,对方可以算一下最多还能发多少。

    也就是更新一下窗口大小

发送缓存

ack是告诉发送方,自己最后连续的数据到了哪个序号。因此多个ack可以合并

同理,多个剩余空间的窗口大小,也可以合并。

所以都会缓存一下在一起发出去。

处理数据

  • 检查数据和tcp头部,没问题就发送返回ack号

  • 协议栈从接受缓存区当中取出数据,给应用程序。

如果缓存区里面没有数据,就暂时挂起,协议栈去处理其他事情,有了再来拿。【协议栈是搬运工的样子】

删除套接字

所有数据发送完毕的一方会发起断开过程。具体而言就是把fin=1传给对方。对方收到就返回ack。

比如服务器发fin,意思是自己不会再发东西给客户端了,如果客户端发东西给服务器端,也会接受了

相当于这个连接半关闭了

如果对方接受缓冲区里面还有没处理的,就会全部给应用程序

套接字不会马上删除,而是会等待一段时间后再删除。等待可能重传的包全部结束后,再删除。

这是为了防止误操作。

比如,客户端返回的ack丢了,这样的话对方就会再发一次fin。而此时客户端的套接字如果已经删掉了,对应端口就空了。如果恰好被分配到了新的套接字,就会因为这个fin而被删掉。

收发数据小结

1创建套接字

服务器是一直有,就等着客户端

客户端需要建立连接,就回创建一个套接字。

2 连接准备/三次握手

客户端发送tcp包

  • syn=1

  • 初始序号

  • 窗口大小

服务器端返回

  • ack=1

  • 初始序号

  • 窗口大小

客户端返回

  • ack=1

3 数据收发

tcp把消息切分,每一小块前面装上tcp头。

包含序号、上一个包的ack。

如果有清理接受缓冲区,那就加上新的窗口大小

4 断开操作/四次挥手

如果服务器先发送完,就发送fin=1给客户端

客户端返回ack。

此时通道半关闭,服务器不再发,但可以收

客户端不再发也发一个fin给客户端

然后客户端返回ack

套接字再各自协议栈内存中存一会,等到重发时间过了,再删掉

ip与以太网的包收发操作

ip模块是如何收发数据的?

tcp模块把数据加上tcp头后,就委托ip模块发数据。需要指定对方的ip地址。

ip模块就是一个路口,具体的工作由集线器、路由器等网络设备来完成。

ip模块会再往前面加上两个头:ip头和mac头

  • ip头,用于ip协议。里面有对方的ip地址,换言之存了最终目的地。

路由器根据ip协议,查ip表/路由表,获得下一个路由器的ip。然后写入mac头当中。

集线器也查表,查以太网表,具体传输方向。根据以太网协议将包传输到下一个设备。

【感觉,ip头存终点,mac头存下一个中转路由】

【简言之路由器负责查下一个路由的ip,集线器负责查该怎么去】

这么分工是因为,不仅有以太网/mac地址,还肯努次无线局域网、adsl等等。【传输的方法有很多,但传输的工具人都是集线器】

硬件过程

ip模块加上了mac头和ip头,交给 网卡

网卡吧数字信息转换成电信号或者光信号,然后传给下一个集线器/路由器。

他们翻译成数字信号、查表,再转成电/光,然后转给下一个。

接受的时候也是类似

网卡转光/电为数字,传给ip模块,然后ip给tcp,然后tcp拆了头,把数据放到接受缓存区。

ip模块就是一个收发快递的,不管包裹内容(tcp头和数据)是什么,只管传

ip头

  • 自己和对方的ip地址

ip模块不校验地址是不是正确,只负责发送和接受。

确定要用哪块网卡来发信息

  • 协议号

确定包的内容来自哪个模块。如果http请求通过tcp传输,会写06表明是来自tcp

mac头

以太网不能用tcp/ip。以太网的地址是mac地址。

mac头就是给以太网使用的,要写好双方的mac地址

  • 发送方的mac地址,在网卡里面

    一般操作系统启动的时候,网卡驱动程序,会读取网卡mac地址,放在内存里面。

  • 先查一下ARP缓存,没有的话,就在以太网的子网里面,对所有设备广播一下,问一下这个ip地址对应的mac地址是啥。

    就会有人应答,就获取到了,放在ARP缓存当中。

【如果不在一个子网里面,就要靠路由器来转发,发到ip地址所在的子网里面,再广播一下】

当ip地址变化,arp缓存就会和实际内容有冲突,因此arp缓存会在几分钟左右后被删除

很有可能在ip地址刚改变的几分钟之内发生通信异常。

【ip地址可变,而mac地址不可变。ip更多用外网,而mac更多用内网/局域网】

以太网

以太网本质就是一根网线。一台计算机发送信号,会到达所有的设备。

因此要在信号开头加上接受者的信息,即mac头

里面要写双方mac地址和包类型和内容等

有了交换式集线器/交换机,信号的碰撞就不怎么会发生了。因为会根据mac地址精准发送了。

以太网/无线局域网性质:

  • 接收方mac地址

  • 发送方mac地址

  • 以太类型,区分包内容

网卡:转换成光电信号

硬件都要有驱动程序。一般由厂商开发。

硬件也都需要初始化,在操作系统启动的时候会初始化

如错误检查、初始设置、获取网卡mac地址等等。

一块网卡一个mac地址,这是全球唯一的,在生产的时候写入网卡的rom

网卡驱动,从ip模块获取包,会将其复制到网卡内的缓冲区,然后告知网卡的mac模块,要开始发送包了。

mac模块会把包从缓冲区中取出,前面加上报头和起始帧分界符,后面加上帧校验序列

  • 报头:用来同步时钟信号

一般是测量电压/电流变化,来确定0和1。如上边沿或下边沿触发。

如果是连续的1或0,就没法检测。而且距离远的话,传输会有时间差。

因此要把数据信号和时钟信号,叠加在一起发送出去。

对方根据报头,来同步时钟信号,再减出数据信号。

  • 起始帧分界符

接收方会知道,从这个帧开始,提取网络包数据。

分界符会和之前有少许变化

  • fcs帧校验序列

类似于磁盘中使用的crc错误校验码,用来判断数据有没有错误。

会通过一个公式把包从头到尾所有内容进行计算而得出。

集线器发送网络包

  • 集线器,半双工模式

    半双工,就是只能传输或只能接受。

  • 交换机,全双工模式。

    可以同时发送和接受,就没那么多幺蛾子

半双工模式:

如果线路中有信号,就等待;没信号了就开始传输

以太网不会处理信号有没有收到,只管发。

  • mac模块把数字信号转换成电信号,转换速率就是网络传输速率。

  • 由PHY(也有的叫MAU)模块,发送出去。

PHY模块,是用来格式转换的。

以太网对不同网线类型,规定了对应的速率和信号格式。PHY就转换格式

此外PHY还要监控接受线路有没有信号进来。

信号碰撞

如果发送过程中,有别的设备也在发送,就会发生信号碰撞

两组信号叠加,无法区分彼此

此时发送终止,发送阻塞信号,通知其他设备有碰撞。

一般所有设备都会停止发送。

然后根据mac地址会生成随机数,尝试重新发送信号。

再冲突,就等待时间延长一倍。最多十次不行就报告通信错误。

接受返回包

半双工模式下,只要有人发了数据,你就会收到。

因此第一步就是把数据全部收进来。

网卡

PHY模块

  • 根据报头,同步时钟

  • 找到起始帧分界符,后面的信号转换成数字信息。

PHY模块工作,转换格式后交给MAC模块

mac模块

  • 检查末尾的FCS,看看传输的内容对不对

如果不对,就丢弃这个包,假装没收到

  • 检查mac头,这个包是不是给自己的

和网卡的mac地址比较一下,不一样就丢弃

一样的话放入缓冲区中

网卡通知计算机收到了一个包

中断

网卡向扩展总线的中断信号线发送信号,cpu收到中断,会暂时挂起正在处理的任务,切换到中断处理程序。

调用网卡驱动,执行接受。

网卡驱动绑定了网卡的中断号,因此网卡一发出中断请求,网卡驱动就自动调用了。

网卡驱动

网卡驱动从网卡缓冲区中取出包,通过mac头判断协议的以太类型,交给对应协议栈。

多数为tcp/ip协议,对应是0080。

不存在对应协议栈,就直接丢弃。

tcp/ip协议栈

ip模块

  • 检查ip头

看包接收方的ip地址是不是自己(网卡的ip地址)。是就接收。

如果不是,客户端就将错误返回给对方;服务器会像路由器一样,将包转发给对应的ip地址。

  • 分片重组

传输的都是小包,重组成原始包。

接受后暂存在内存空间,等待ip头对应id全部到达,再根据偏移量拼起来。

tcp模块

  • 找到对应套接字

    • 查ip头里面的ip地址、自己ip地址

      理论上tcp模块不应该查ip头,但如果是由ip模块传参过来,那么就会抬高成本,因为这样互相查很频繁。所以就允许越界查询

    • 双方端口号

如果是建立连接/断开链接的 控制包,就返回相应控制包,并通知对应应用程序操作状态。

如果是应用程序数据,返回确认接收的包,数据放入缓冲区,告知应用程序等待来取

udp协议

tcp要确保 可靠。每次发送都要确认对方是否收到。但不是所有场景需要用。

如,视频/音频传输;在线游戏的数据;dns查ip地址等

  • 数据很短,一个包就能装下

    重发也就是重发整个包,也不需要ip模块来分块

  • 传输缺了一些包,也是能接受的。

  • 实时性要求比较高,重发也没意义

    视频已经卡了之类的

udp

  • 不需要建立和断开连接

  • 不需要分块,加上udp头就能发

  • 接受只需要双方ip和端口号

udp经常被防火墙阻止,就不得不用tcp了

第三章 网线到网络设备

计算机发出的网络包,通过 集线器、路由器 等设备转发,最终到达目的地

转发设备,会根据 ip头 里面的控制信息,查表,发到对应目的地。剩下的tcp头以内的,都被视为数据

信号在网线和集线器中传输

网卡PHY(MAU)模块发出电信号,传输过程会遇到,信号衰减、失真 和 噪声。

  • 信号衰减:幅度变小

网线越长,能量损失越大,信号衰减越严重。

  • 失真:拐角变圆

电信号本质是正负电压的变化,频率越高,正负电压变化越大,释放更多电磁波,损失更多能量。

拐角变化最大,损失最多,就会变圆

  • 噪声

变化的磁场会生成电场,生成感应电流,可能与原来电信号不同,导致失真。

用 双绞线 来降噪

  1. 外源性:来自外界设备的电磁波

一根导线相邻两个圈,产生的电流方向相反,整体看可以抵消

  1. 内源性:相邻传输信号线上泄漏的电磁波,串扰

需要让 扭绞间距(节距)有一定差异,这样产生噪声的方向相反,可以抵消。

其他手段:隔板、金属屏蔽网等

集线器广播

集线器会把包,发送到以太网中的全部设备中。不管对错。

收发双方,用的接口都是RJ-45,接受的模块都是PHY

因此想要接收数据,就要 交叉接线。一方输出进入另一方的输入。

  • 集线器的MDI/MDI-X开关,切换输入/输出

  • 反接信号线

集线器,用中继电路,广播到所有端口,到达所有连接的设备。

原封不动的广播,有错也不管。

交换机的包转发

交换机里面相当于有网卡,不过没有对应的mac地址,因为不是计算机。

操作就是通过网卡导入数据,查表,转发到对应端口的网卡上,再发出去。

网卡进入的操作

  • RJ-45

  • PHY接收,转换通用格式

  • mac,转换数字信号、FCS校验错误

  • 放到缓冲区(内存)中

网卡输出操作相反。

如果是半双工,就要检查一下有没有人在传输,不然就碰撞了。

mac地址表的维护

mac地址,和交换机的端口,一一对应

这个表记录的对应情况,有时效,过期删除

  • 每次有信号传进来,刷新对应记录

    新连接的电脑,一开始的建立连接的请求,就会刷新对应记录

  • 如果目标端口,和传入的端口,是一个端口,就丢弃

    不然就形成永动了

  • 如果表里找不到,就全局广播,除了输入信息的源端口。

    把相应的包写入地址表

    也有地址叫 广播地址,发过来直接广播。

交换电路可以多路传输

全双工

交换机特有,同时进行发送和接收

双绞线的发送和接收信号是独立的;交换机端口+网卡,发送和接收也是独立的。

自动协商

没有数据的时候,会填充连接脉冲

  • 检测对方是否连接,是否正常工作(网卡等等)

    网线旁边绿色的灯

  • 自身状态:能支持的工作模式、传输速率

双方根据能支持的最高速率来匹配。

路由器的包转发

路由器也是查表,然后转发到下一个路由器。

路由器基于ip设计,交换机基于以太网设计的。

  • 转发模块

负责判断包的转发目的地。类似于ip模块

查路由表。

  • 端口模块

负责包的收发。类似于网卡

不同硬件端口可以支持收发不同的网络

计算机网卡主要支持:以太网、无线局域网

互联网还包括:ADSL, FTTH,宽带专线等等。

路由器端口,都具有mac地址和ip地址,身份相当于计算机。

路由表

  • 目标ip地址

  • 子网掩码

子网掩码为1的,对应ip地址是网络号,剩下的是主机号。

路由器只找网络号。【相当于只指路给大区,不具体到那个机器】

如果几个网络号归一个路由器管,那么还会把多条记录合并成一条。

  • 网关

  • 接口/端口

  • 跃点计数

    距离目标ip要跳转多少次,越小距离越近

路由表维护

mac表是每次连接的时候自动维护

路由表维护和转发是分开的

可以手动维护,也可以自行维护

路由器的收发

只要是以太网,那么端口的硬件和收发操作都会和网卡是一样的。

  1. 丢弃mac头

    因为其作用就是把包送到路由器

  2. 查表转发

  3. 子网掩码1的数越多,优先匹配 因为跳转后的主机数量就会越少

  4. 跃点计数,少的优先匹配

  5. 无法找到匹配记录,就发给 默认路由、默认网关

子网掩码0.0.0.0,换言之优先级最低

  • TTL -1

每个包都有有效期,记录在ip头里面,即TTL, time to Live。

一般64或128,每经过一个路由器就减1,变成0后就丢弃。

这是为了防止死循环

  • 拆分数据

输出端口的最大长度,可能小于输入端口

如果ip头中记录,可以分片,就分片;不然丢弃,然后返回报错

tcp头+数据,对ip来说就是数据。

每一段前面都会加一个ip头

这就需要重新计算校验和,不过拍以太网通信线路本身错误校验很强大,一般没人管这个值。

  1. 发送

不同端口的发送方法不同

如果是以太网:

  • 根据下一个ip,arp缓存/arp查对方mac

如果没有记录下一个ip,说明下一站就是目的地,就把ip头里面的目标ip当作下一个ip

  • mac地址、以太类型,写入ip头

  • 转成电信号,发送

路由器和交换机的区别

路由器负责指挥往哪传,交换机负责具体传输。

路由器的ip,负责找到下一个路由器在哪;交换机具体把包传到下一个路由器。

交换机不一定通过以太网传,也可以无线局域网等。

不同网络,执行传输方法不同,但都是靠ip来指挥。

路由器附加功能

路由器附加两个功能:地址转换、包过滤

地址转换

本来互联网,是一台设备一个地址,但很快地址就不够用了。地址重复就会导致数据传输出错。

提出的解决方法,是构建内网和外网。

把一些设备聚在一起变成内网,然后他们相互连接,对外而言,他们就是一个ip节点。这样就能无限扩展了。

两个内网互不干涉,因此也就能取相同的ip地址,反正也访问不到。

在内网内,叫私有地址;内网外,叫公有地址

内网可以用的ip,就是当年分ip剩下的。。然后就专门给内网用了。

路由器的地址转换,就是把ip地址和端口号,改写成内网的ip地址和端口号。也是一个查表转换的过程

对外,就是同一个ip地址+不同端口号;

对内,就把不同端口号,转换成对应ip地址+端口号。这是为了增加内网的设备数量。

  • 内网访问互联网,那么就可以直接把对应写进表里面

    路由器会随机选一个空闲端口来匹配公有地址。

  • 互联网访问内网,除非有连接,不然是找不到对应的设备。

    只能向通信的端口发送网络包。

    这样可以防止非法入侵。除非主动允许,不然无法进入。

也可以设置默认路由,即专门和外网访问的服务器,手动添加公私对应的ip

包过滤

对包进行转发的时候,根据mac头、ip头、tcp头内容,根据规则决定是否转发还是丢弃。

这是 防火墙 的主要原理。

第四章 接入网和运营商

4.1 ADSL接入网的结构和工作方式

互联网基本结构,和家庭、公司网络,是相同的

不同点:

  • 距离很远,以太网线无法连接;

  • 路由表维护方式不同

接入网

通过 互联网接入路由器,就进入了互联网【类似于互联网入口】

接入网,是连接 互联网 与 家庭、公司网络 的通信线路

ADSL, FTTH等

ADSL

不对称数字用户线。假设在电线杆上的金属电话线,上传/下载速率不同

互联网接入路由器,丢弃mac头,根据ip查表转发

以太网:加上mac头、PPPoE头、PPP头

简言之,不同通信线路用不同的头。电话线要用PPP头,转成电信号用PPPoE协议

发给ADSL Modem,即调制解调器

作用是拆分数据成很多小格子,成为信元。用ATM技术,用于电话线传输。

其实不用拆分,但很多运营商已经投入了很多钱在ATM上,所以就用了

转换成电信号

方波容易失真,因此采用正弦波。转换被叫做 调制

  1. 振幅调制。不同振幅代表0/1

    四个振幅级别,可以表示四个数00/01/10/11

  2. 相位调制,不同相位表示0/1

    相位也可以划分很多个

划分太细容易失真

两个联合起来,一个波就可以表达很多信息,相当于提高传输效率

多个频率的波叠加

合成后,可以用滤波器来分开

越高频越容易失真,因此可以动态调节一个波的信息量。噪声小就多加一点比特。

动态调节过程,叫训练/握手

上行/下行分配了不同的频段,导致不同的速度

分离器

adsl传输通过电话线,传出去,分离器合成两个信号;接收的时候,分离器再分开

adsl用高频信号,电话语音信息用低频

相当于阻隔两方信息的东西

电话电缆

电话局附近埋了很多连进来的电缆,被称为 电缆隧道

DSLAM

接收电信号,转换成数字信息的 信元。

相当于很多ADSL Modem整合在了一起。而且自带滤波的功能。

一般不用以太网接口,而是ATM接口。专门接受 信元

BAS

【就是加强版路由器,虽然叫服务器】

  1. 用atm接口,把信元转换成原始的包。

  2. PPPoE头的作用就是送达BAS,因此到这后被丢弃。取出ppp头后面的数据。

  3. 在ppp头前加水到专用头,一般是L2TP

隧道专用路由器

然后被转发到互联网内部

4.2 FTTH

光纤到户。光纤就两种状态,1和0,亮或暗

将数字变成电信号、再变成光信号。

接收也是如此,光变电变数字

单模和多模

  • 单模,一根光纤传导一条光线,失真少,成本高,距离远。

  • 多模,一根光纤传多条光线,失真多,越远越多,信号越来越宽。成本低。

一般是在建筑物内用多模,远距离用单模。

光纤原理

光传进光纤,只有很小一部分才能前进。

  • 入射角较小才能全反射;

  • 传输过程中相位要一致,不然会干涉抵消

单模,就是只有一个光

多模,有很多光线

ffth连接方法

直连

光纤直接连到最近电话局。

  • 光纤收发器/终端盒

    把以太网包的电信号直接转成光信号,没有信元。

  • 多路光纤收发器(电话局内)

    转成电信号

  • BAS接收,发送到互联网内部

上行下行用同一条光纤,通过光的不同相位,来分离信号。

分路

  • ONU,电信号转光信号,也是终端盒

  • 分光器

    类似于 集线器,光纤连到多个用户,然后一起传到电话局

    还有一个避免上传时碰撞的作用

    下行的数据也会到达每个用户手上,根据ONU头来识别

  • OLT,配合ONU来避免信号碰撞

  • BAS

4.3 接入网中使用的PPP和隧道

BAS作用1:用户认证和配置下发

网络包通过ADSL或FTTH到达BAS。这是接入网路由器。

输入用户名和密码,登陆后才能访问互联网。BAS就是登陆的窗口,用的是PPPoE协议实现。

原始的PPP拨号上网

  1. 拨打电话,通过广播来找BAS的mac地址

  2. 接通后,输入用户名和密码

    加密传输:CHAP;不加密:PAP

    如果是光纤传输,基本不可能在传输中被窃听,最多是路由器和ADSL Modem窃听。

  3. 用户名密码通过RADIUS协议从RAS发送

  4. 校验正确,返回配置信息,就可以连接了

    配置:ip地址、dns服务器地址、默认网关ip地址等等

要给计算机分配一个公有地址

PPPoE传输ppp

ppp传输需要容器,要记载一下报头、fcs、信号格式等等信息。

PPPoE,就是以太网包重新设计的规格。用来装PPP数据

BAS作用2:通过隧道发包给运营商

BAS收到网络包,去掉mac头和PPPoE头,取出数据扔进隧道。

隧道,另一头会原样把包吐出来。出口是 网络运营商的路由器

  • 基于tcp

  • 基于封装

不分配ip地址的无编号端口

一对一链接,不用判断转发地址,网关地址不用了写了

也可以不用给端口分配ip地址

互联网接入路由器:地址转换

bas下发的参数,配置在了路由器上面,转发包的时候要进行地址转换

换言之,公有地址是分配给路由器的,计算机会被分配一个私有地址

也可以直接让计算机接受来自BAS的PPPoE消息,计算机就有了公有地址。

但这可能导致计算机被攻击。

其他协议

PPPoE,需要把PPP消息装进以太网包,再拆成信元

PPPoA,直接把PPP消息装入信元,这能增加MTU,即传更多数据

换言之,不能用以太网传输,BAS需要有收发PPP消息的对应设备。(接口更贵就没普及)

  • ADSL Modem和USB接口连接,和计算机成为一体。没有普及。

  • ADSL Modem和路由器整合,广泛普及。但有地址转换的问题

此外,也可以不用PPP协议来下发TCP/IP配置信息,比如能用DHCP协议

直接把以太网包变成ADSL型号

更加简单,没有用户名密码,无法切换运营商,但头小,传输效率高。

4.4 网络运营商内部

pop和noc

进入互联网内部,内部就是一堆路由器,由多个运营商网络管,他们之间相互连接。

互联网入口是POP,即接入点。

NOC可以当成更高性能的POP,也就是个高级路由。

先到达运营商pop的路由器。

不同接入网类型,有不同类型的路由器。

  • 专线

不需要用户认证、配置下发,一般路由器就行

  • 电话等拨号上网

RAS,需要对用户拨电话的动作进行应答,PPP协议进行身份认证和配置下发

  • PPPoE的ADSL/FTTH

    BAS,负责和用户的身份认证和配置下发

pop路由器和bas相连,只负责包转发。即一般路由器即可

  • PPPoA的ADSL

DSLAM连ATM交换机(处理信元),连ADSL运营商的BAS,连运营商POP的路由

接入网路由器需要大量端口,需要连接很多数量的线路。传输速度可以比较低。

NOC和POP需要大量吞吐数据,因此线路效率和性能要高

NOC把收到的数据,转发到离目标更近的pop,或是转发到其他运营商

线路连接

pop和noc往往在一幢建筑物中的机房里,还有一堆服务器。

如果近可以直连,或者用光纤连接

光纤可以复用,因此可以租借。有专门的通信线路服务公司。会把光纤一部分通行能力租借给客户。

4.5 跨运营商网络包

到达pop路由,还是一样,各种转发直到目的地。

  • 如果是同一个运营商,那么可以直接转发到web服务器所在的pop,再继续转发到web服务器

  • 如果不是一个运营商,先发到运营商,再层层转发

更新路由表

路由器自动更新路由表,和周围路由器交换路由信息。

  • 转接:全部告诉对方,对方可以绕过你和你身后的人连接

  • 对等:只告诉双方相关的路由信息,因此只能相互发包

    也可以通过IX,即运营商的路由器

公司中,路由器是寻找最短路由,因为不用收费,所有路由都是平等的节点。

运营商之间,为了区分谁交了钱,就需要阻止某些来源的网络包。

互联网中,可以指定路由交换对象。

路由交换是在特定路由器之间一对一进行的,交了钱才能给你路由信息。

判断路由,也要加上优先级权重,不仅仅看什么路子最短。

IX:运营商之间的路由器

一个中心设备,减少线路数量。

IX所在大楼,有自主发电设备,抗震。往往NOC也在这里面

IX是具有大量高速以太网端口的二层交换机。就是更快更高级的交换机

第五章 服务器端局域网

5.1 服务器部署地点

网络包从互联网到达服务器。

  1. 服务器直接在公司网络上

pop、接入网、服务端路由器,直接进入服务器

  • ip地址不足

  • 不安全。服务器相当于在裸奔

  • 部署防火墙

防火墙,只允许发往指定服务器、指定应用程序的网络包通过,屏蔽其他包。

  1. 部署在运营商数据中心,直接租运营商提供的服务器

  2. noc或ix直连,访问速度快

  3. 各种配套设施齐备,还会送防火墙和监控数据之类的。

5.2 防火墙

阻止网络包流入流出,以及地址转换。

防火墙主要是用包过滤模式。

除非必需服务,不然一律不让过。

只允许访问服务器的数据通过

通过控制信息过滤,接收方地址为本地,且端口号是80,才能进入

发送方是本地ip,且端口号是80,才能出去

控制端口号,是为了不让其他服务连上互联网,只提供web服务。

禁止服务器主动连接互联网

这是避免服务器中恶意软件污染其他服务器。

发起连接请求的时候,tcp控制为syn=1, ack=0

禁止第一次连接请求,也就禁止了服务器主动连接外面的互联网。

udp协议,完全无法区分开

因为没有连接操作,所以无法限制。

或者可以用 包过滤 以外的过滤方法。

公司内网

公司内网和互联网、公开区域之间,都要有包过滤

【感觉就是平行的几个地方,不过人为设置了流入流出的限制】

地址转换

公司内网都是私有地址,外面就访问不到了,只能通过防火墙

如果被拦截,那么就会阻止,并记录丢弃。用来分析非法入侵。

这些事情路由器也能做到,只不过防火墙规则复杂且需要记录。

因此衍生出了专用的软硬件来维护。

规则简单且丢弃阻止记录的话,路由器也可以。

防火墙无法检查包内容,就算能也无法抵御未知的风险

因此只能尽可能发现bug,然后频繁更新

5.3 分布式架构来负载均衡

增加带宽,服务器性能跟不上怎么办?

多台服务器来分担负载

负载均衡机制

dns服务器来分配

每次通过dns查询服务器ip,就轮着给服务器的ip地址,即 轮询round-robin

平均分配访问

  • 如果有故障,就无法跳过了

  • 如果一个操作需要横跨多个页面,这么轮询就无法执行

负载均衡器

用负载均衡器的ip,代替web服务器的ip。

dns注册的ip就是负载均衡器的ip。就对外假装自己是服务器。【其实就是反向代理】

对服务器来说,负载均衡器就是客户端。负载均衡器会分配把请求分配给哪台服务器。

  • 服务器负载情况

    • 定时采集cpu、内存等

    • 定时发送测试包,测试响应时间

    • 设置性能指数,计算出服务器性能

  • 如果要横跨多个页面,就必须把请求发送到同一台服务器上。

原本web服务器是用来放静态文件的,因此不需要判断请求的相关性。

可以通过cookie来判断

5.4 缓存来负载均衡

把整个系统,按功能划分为不同的服务器。web、数据库、缓存等等。

缓存类似于负载均衡器,对外为web服务器,对web服务器为客户端。把访问进行中转。

  1. 缓存服务器的ip注册到dns服务器上,这样客户端就会直接访问缓存服务器,连接套接字等等操作

  2. 缓存检查请求内容,查一下数据是否已经在缓存中了

    1. 如果不存在,就转发给web服务器。也是创建套接字等等操作 【应该是新建一个请求,或者修改一下请求,只把想要的数据问服务器要】

      把响应消息保存到缓存中,并记录保存的时间。

    2. 如果存在。就在请求头里面加一行if-modified-since,询问用户数据是否已经变化了

      服务器会根据最后更新时间来比较,有没有变化。没有就返回304

      有的话,就返回最新的数据,保存在缓存中

正向代理:伪装客户端

最早是在客户端一侧缓存,尽可能压榨低速接入网的能力。

顺便也是防火墙,阻止互联网和公司内网、阻止上外网的包。

接受公司内网的包,查看内容,判断是否允许访问外网,然后转发到互联网。

正向代理,需要在浏览器设置“代理服务器”

浏览器把所有请求发送给代理服务器,根据URI里面填写的完整字段来访问

反向代理:伪装成服务器

正向代理,设置麻烦,容易故障,因此把代理放在服务器端。

可以是dns服务器解析引导

URI中目录名与web服务器进行关联,能转发不包含完整网址的请求信息。

浏览器不需要设置代理也能使用。

透明代理

客户端没感觉,请求随便发,但是在必经节点上,有代理给你转发。

比如互联网的接入口

更像是缓存

5.5 内容分发服务

缓存放在哪?

  • web服务器前,可以管理,但流量不会少

  • 客户端局域网,无法管理,流量会少

  • 互联网接入口,可以通过运营商管理,流量也少

放在pop的缓存服务器,是公开的,任何人都能访问。而且必须在所有pop都部署,数量太大。

因此有专门从事部署缓存服务,并租借给web服务器的厂商,叫内容分发服务CDSP

客户端访问web服务器,其实是在访问缓存服务器。

如何找到最近的缓存

  • dns服务器来分配,根据路由信息计算距离

  • 重定向,计算距离

类似于路由器的转发,如web服务器没数据,转发到另一台服务器上。【找个服务器问一下】

客户端请求,先通过dns,发到重定向服务器。重定向服务器会收集各个路由信息,计算最近缓存服务器,再返回给客户端地址。(加一个location字段)

这样会增加http消息次数。但精度较高。

也可以根据网络包往返时间,来估算距离。

缓存内容更新方法

  • 第一次访问,缓存是无效的

  • 如果每次查询数据都要问web服务器有没有更新,其实也会拥堵。

因此,当web服务器数据更新,就要立刻通知缓存服务器。

如果是动态生成的页面,那么静态的元素能存就存

第六章 请求到达web服务器,响应返回浏览器

6.1 服务器概览

服务器启动后,要做各种准备工作,才能接受客户端访问。

服务器和客户端有什么区别?

硬件和操作系统不同,网络相关接口都是一样的。服务器还能同时和多台客户端通信。客户端也能当服务器。

服务器程序结构

程序分为, 等待连接模块 和 通信模块

  • 服务器初始化后,等待连接模块运行,创建套接字。等待连接

  • 客户端发起连接,启动通信模块,复制一个自己然后移交连接的套接字。

  • 接下来就用已连接的套接字通信

通信模块和客户端的连接,是一一对应的。

可以实现启动几个通信模块,发起连接时挑一个连接。

调用socket库

数据收发层面,socket库不分客户端和服务器。不过只有一方等待连接,另一方才能发起连接。

因此一般发起连接,是客户端,等待连接,是服务器。

客户端

  • 创建套接字

  • 连接服务器端的套接字

  • 收发数据

  • 断开管道并删除套接字

服务器端

  • 创建套接字,分配内存空间

把端口写入套接字中

  • listen等待连接

  • accept接受连接

给套接字创建一个副本,连接对象的控制信息写入套接字中。

每次都是用副本来连接,原来的套接字继续等

通过双方ip地址、端口号,来指定唯一的套接字。

描述符,在套接字刚创建好的情况下,在应用程序和协议栈之间,指代套接字的

6.2 服务器的接收操作

网卡收到信号,还原成数字信息

  • 从报头分离出时钟信号,进行同步,并延长时钟信号

  • 每个时钟周期检测信号变化方向,还原成数字信息

  • 根据包尾的 帧校验序列FCS 检验错误,错误就丢弃

  • 检查mac头,是不是发给自己的,不是就丢弃

  • 保存在网卡内的缓冲区中

  • 通过中断,通知cpu参与

操作系统

  • cpu暂停当前任务,运行网卡驱动,读取网卡缓冲区的包

    cpu如果根据协议,调用不同协议栈

    如ip协议,调用tcp/ip协议栈,转交包

ip模块

  • 检查ip头,是否规范,是否发给自己,不是就转发或丢弃

  • 检查有没有分片

    如果有分片,就暂存在内存中,等所有分片到达,再组装成原始包

  • 查看ip头协议号,转交下一个模块

    如06协议号,转交TCP模块;11转交UDP

tcp模块

发起连接的包,SYN=1

查看tcp头

  • 检查接收方端口号,当前端口有没有等待连接的套接字,没有就返回错误包

  • 如果有就创建套接字的副本,写入控制信息,分配收发缓存的内存空间

    生成确认的ack号,交给ip发送

已经连接的包

  • 根据四个信息,找到套接字。

  • 对比套接字中保存的信息,看数据收发状态是否正常

  • 来的包是不是在等待的下一个序号。

    如果一致,就提取数据,放到接收缓冲区中,与上一个序号拼接(每次有包就会拼接,ip则是全到再拼)

  • 生成应答tcp头,计算ack号,给ip发送(一般会等一段时间,合并发送)

在数据到之前,应用程序会一直用socket库的read,等待数据到达接收缓冲区。一旦完成接收就获取了数据。

断开连接

  • tcp生成fin=1的tcp头

  • 客户端收到后,返回ack号,调用close,生成fin=1的tcp头给服务器

  • 服务器返回ack号

断开操作完成

套接字过段时间就删除

6.3 web服务器程序解释请求

将请求的URI转换成实际文件名

不同的方法,根据uri,读取不同的文件

web服务器公开目录和实际目录不一样,是一个虚拟目录,实际目录映射成这个目录的

因此根据uri找目录,还要翻译一下,才能读取文件返回

不仅能翻译目录,也能按照规则翻译文件名

cgi程序

可能返回的不是静态文件,而是一个程序

浏览器会从请求消息中,取出数据,交给操作系统运行程序,然后返回结果给web服务器。web服务器获得相应,就会返回给客户端。不会过问内容。

如果是get,数据在uri后面;如果是post,数据在消息体中。

程序处理数据,可能需要查数据库等,运算出结果。

web服务器的访问控制

web服务器,根据请求信息的内容判断数据源,并从中获取数据返回给客户端

可以从URI中,根据规则允许或禁止访问

  • ip地址

  • 域名

    ip反过来向dns服务器查域名。一般还需要根据域名再查一次ip看看是否一致

    因为可以再dns注册假域名来攻击,就要双重检查

    问题是比较慢

  • 用户名和密码

一般请求不包含用户名和密码,因此会发一条消息给客户端,要求提供用户名和密码。

如果是CGI认证,可能是需要用户填写表单

浏览器把用户名和密码,放入请求中,重新发送

返回消息

web服务器,用write,把响应消息写给协议栈,给出套接字,对应哪条通信。

协议就会拆分网络包等等等

6.4 浏览器接收相应消息并展示内容

客户端接收数据

  • 网卡还原成数字信息

  • 协议栈组装网络,取出响应

  • 消息转交给浏览器

  1. 需要根据数据类型,来调用不同的程序,来展示。

数据类型一般是写在了Content-Type里面

Content-Type内容,也是全球统一管理的,主类型/子类型

Content-Type: text/html

  1. 需要解码解压缩

压缩和编码技术,是写在了Content-Encoding里面了。

但仅仅靠这俩是不够的,因为有可能写错。需要综合判断

如,文件扩展名,文件抬头等等

浏览器显示页面

浏览器解释标签含义,实际的显示操作,由操作系统完成。浏览器只需要发出指令。

图片标签,需要向服务器请求文件。返回后会嵌入到标签所在位置。

image-20191023163401539
image-20191023163832730
image-20191023170127859
image-20191023201114921
image-20191023201027690
image-20191023201152175
image-20191023202405562
image-20191023203438506
image-20191023205632096
image-20191024153136838
image-20191024192624155
image-20191024203954154
image-20191119161249884
image-20191119161306595
image-20191025164353409
image-20191025164548658
image-20191025165342110
image-20191025170531257
image-20191026162958988
image-20191026165420135
image-20191026164350932

接收方mac地址,需要根据对方ip地址来查询

image-20191028161134825
image-20191028161917320
image-20191028163605680
image-20191028172055309
image-20191028172323104
image-20191028172427721
image-20191028175405182
image-20191107190108684
image-20191107191602837
image-20191107191953849
image-20191107192338461
image-20191107192351987
image-20191107193309339
image-20191107200422587
image-20191107200939057
image-20191108160316878
image-20191108170250269
image-20191108171439381
image-20191109140830813
image-20191109141025136
image-20191109150536795
image-20191109173624042
image-20191109173636561
image-20191109173822481
image-20191109175121989
image-20191109175511393
image-20191109175719089
image-20191109180054862
image-20191111142504214
image-20191111142540993
image-20191112072317178
image-20191112072403173
image-20191112072427048
image-20191112072616547
image-20191112072624607
image-20191114085536289
image-20191114191218983
image-20191114092354242
image-20191114092405574
image-20191114092417028
image-20191114093036469
image-20191120132646447
image-20191120132634063
image-20191120133414652
image-20191120134212633
image-20191120135859461
image-20191120140456751
image-20191120140633096
image-20191120165023357
image-20191120165447238
image-20191120173136923
image-20191120205804421
image-20191120210140018
image-20191120210248676
image-20191122084224862
image-20191122084535695
image-20191122084545647
image-20191122085204321
image-20191123093053276
image-20191123102052316
image-20191123102446912
image-20191123103755193
image-20191123110128976
image-20191123110117610
image-20191123110902776
image-20191123111304277
image-20191123111359763
image-20191123115106317
image-20191123130539144
image-20191123130739215
image-20191123131728147
image-20191123131736360
image-20191123131745442
image-20191123131756184
image-20191028161601138