2.5 IP与以太网的包收发操作
2.5.1 包的基本知识

TCP模块在执行连接,收发,断开等操作时,都需要委托IP模块将数据封装成包发送给通信对象。包是由头部和数据两部分构成的,头部包含目的地址控制信息,可以理解为快递包裹的单子,头部后面是数据,相当于快递包裹里的货物

发送方创建完包后,包会被传递到最近的网络转发设备中,转发设备会根据头部中记录的信息判断接下来该往哪里发送,这个过程需要一张表,这张表里记录了每一个地址对应的转发方向,也就是按照头部里记录的目的地址在表里进行查询,并根据查到的信息判断接下来应该发往哪个方向。经过多个转发设备的接力之后,包最终就会到达接收方的网络设备
网络中有路由器和集线器两种不同的转发设备,它们在传输包时有各自的分工
路由器根据目的地址判断下一个路由器的位置,是按照IP规则传输包的设备,IP协议根据目标地址判断下一个IP转发设备的位置
集线器在子网中将网络包传输到下一个路由,是按照以太网规则传输包的设备,子网中的以太网协议将包传输到下一个转发设备

IP协议根据包的目的地查找包的传输方向,从而找到下一个路由的位置。接下来IP协议会委托以太网协议将包传输过去,这时IP协议会查找下一个路由器的以太网地址 MAC地址,并将这个地址写入MAC头部中,这样以太网协议就知道要将这个包发到哪一个路由器上
网络包在传输过程中会经过集线器,集线器是根据以太网协议工作的设备。为了判断包接下来向什么地方传输,集线器有一张用于以太网协议的表,可以根据以太网头部中的目的地信息查出相应的传输方向
接下来,包会到达下一个路由器,路由器中有一张IP协议表,可根据这张表以及IP头部中记录的目的地信息查出来接下来应该发往哪个路由器,还需要查出下一个路由器的MAC地址,并记录在MAC头部中
以太网部分也可替换成别的部分,如无线局域网,ADSL,FTTH等,它们都可以替代以太网的角色帮助IP协议来传输网络包
2.5.2 包收发操作概述
尽管我们说IP模块负责将包给对方,但实际上将包从发送方传输到接收方的工作是由集线器,路由器等网络设备来完成的,因此IP模块仅仅是整个包传输过程的入口

包收发操作的起点是TCP模块委托IP模块发送包的操作,这个委托的过程就是TCP模块在数据块前面加上头部,然后整个传递给IP模块,这部分就是网络包的内容,TCP模块还需要指定通信对象的IP地址
收到委托后,IP模块会将包的内容当作一整块数据块,在前面加上包含控制信息的头部,IP头部和MAC头部。IP头部包含IP协议规定的,根据IP地址将包发往目的地所需要的控制信息,MAC头部包含通过以太网的局域网将包传输至最近的路由器所需的控制信息
接下来,封装好的包会被交给网络硬件,网络硬件可以是主板上的板卡,计算机主板上集成的芯片,统称为网卡。传递给网卡的网络包是1和0组成的数字信息,网卡将这些数字信息转换成电信号或光信号,并通过网线(光纤)发送出去,然后这些信号会到达集线器,路由器等设备,再由转发设备一步步发送到接收方
接收的过程与发送过程相反,信息先以电信号的形式从网线传输进来,经过网卡将其转换成数字信息并传递给IP模块,接下来IP模块将TCP头部加上数据块交给TCP模块
IP模块不关心TCP的操作,对于包的乱序和丢失也一概不知。总之IP的职责就是将委托的东西打包发送或接收
2.5.3 生成包含接收方的IP地址的IP头部
IP头部中最重要的就是IP地址,这个地址是由TCP模块告知的,而TCP又是在执行连接过程中从应用程序中得到这个地址,所以这个地址的最初来源于应用程序,即便应用程序指定了错误的IP地址,IP模块也只能照做

IP头部还要填写发送方的IP地址,一个计算机不一定只有一个IP地址,确切的说,IP地址实际上是分配给网卡的,如果一台计算机有多个网卡,那么它存在多个IP地址,很多服务器都会安装多块网卡,GateWay在TCP/IP中代表路由器
通过路由表可以知道将包交给哪块网卡,这个过程和路由器使用IP表判断下一个路由器位置的操作是一样的。协议号用来表示包的内容来自哪个模块,如果是TCP模块委托的内容,则设置为06,如果是UDP委托的内容,则设置为17,这些都是按照规则来设置的
2.5.4 生成以太网用的MAC头部
生成了IP头部后,接下来IP模块要在IP头部的前面加上MAC头部。IP头部中的接收方IP地址表示网络包的目的地,通过这个地址就可以判断要将包发送到哪里,但在以太网中,TCP/IP是行不通的,以太网在判断网络包的目的地需要使用MAC头部,它包含了发送方和接收方的MAC地址等信息

IP地址是类似于现实中地址的层次结构,而MAC地址可以看作一个整体。以太类型字段和IP头部中的协议号类似,以太类型就表示后面内容的类型,以太网包的内容可以是IP,ARP等协议的包
发送方的MAC地址就是网卡本身的MAC地址,MAC地址是网卡产生时写入ROM里的,只需要将这个值读取出来写入MAC头部即可。但虽然知道接收方的IP地址,但必须要有接收方MAC地址才可以传输,所以需要执行根据IP地址查询MAC地址的操作
2.5.5 通过ARP查询目标路由器的MAC地址
ARP 地址解析协议,在以太网中有一种叫广播的方法,可以把包发给连接在同一以太网的所有设备,ARP就是用广播对所有设备询问
路由器用来指向包下一次该向哪里发送,MAC地址用来在以太网中明确设备的位置,路由器和发送主机,接收主机也都具有MAC地址,集线器用来在以太网中传输包

如果对方和自己在同一个子网中,那么上面的操作就可以得到对方的IP地址,然后将这个MAC地址写入MAC头部,MAC头部就完成了(如果路由表的设置正确,那么对方应该在同一子网中,否则对方无法做出ARP响应,这时包的发送操作就会失败)
如果每次查询都要广播一次,那么网络中会产生很多ARP包,为此将查询结果放在ARP缓存中,避免重复多次查询拥塞网络。在发送时,先查询一下ARP缓存,如果保存了对方MAC地址,则直接使用,没有再询问。但当IP地址发生变化时,ARP缓存的内容就不能再使用,所以ARP缓存中的数据要在几分钟后删除一次,再进行查询及缓存
将MAC头部加在IP头部的前面,整个包就完成了,整个打包的过程由IP模块负责,如果将包在交给网卡之前,IP模块能够完成整个打包工作,那么网卡只要将打包好的包交出去即可,这样同一块网卡可以支持各种类型的包
2.5.6 以太网的基本知识

以太网是一种为多台计算机能够彼此自由和廉价地相互通信而设计的通信技术,这种网络的本质其实就是一根网线。a中使用的收发器的设备,它的功能是将不同网线之间的信号连接起来,因此当一台计算机发送信号时,信号会通过网线流过整个网络,最终到达所有的设备。这就好像所有人在一个大房子里,一个人说话,所有人都可以听见
但我们无法知道一个信号是发给谁的,因此需要在信号的开头加上接收者的信息,也就是地址,与接收者地址匹配的设备就接收这个包,这样包就可以送到目的地。通过MAC头部中的接收方MAC地址,就能知道包是发给谁的,而通过发送方MAC地址,就能知道包是谁发出的,此外,通过以太类型就可以判断包里装了什么类型的内容
现在所说的以太网指的是c类结构,采用交换机普及开来,现在信号只会流到根据MAC地址指定的设备,而不会到达其它设备。根据MAC地址传输包这一点并没变,因此MAC头部的设计得以保留。这些性质也适用于无线局域网,可以用无线局域网代替以太网
以太网中的各种设备也是基于以太网规格来工作的,以太网和IP一样,并不关心网络包的实际内容
2.5.7 将IP包转换成光或电信号发送出去
IP生成的网络包只是存放在内存中的一串数字信息,需要将数字信息转换成电或光信号,才能在网线上传输,这才是真正的数据发送过程。负责执行这一操作的是网卡,但网卡也无法单独工作,要控制网卡还需要网卡驱动程序

网卡和其它硬件一样,不是通电后立刻开始工作,而是和其它硬件一样,都需要先初始化。网卡的ROM中保存着全世界唯一的MAC地址,这是在生产时就写入的。网卡中保存的MAC地址会由网卡驱动程序读取并分配给MAC模块
2.5.8 给网络包再加3个控制数据
网卡驱动从IP模块获取包后,会将其复制到网卡内的缓冲区中,然后向MAC模块发送发送包的命令,接下来MAC模块将包从缓冲区中取出,并在开头加上报头和起始帧(包)分界符 SFD,在末尾加上用于检测错误的帧校验序列 FCS
报头是一串0,1交替出现的比特序列,它的作用是确定包的读取时机,起始帧分界符用来确定帧的起始位置,末尾的帧校验序列用来检查包传输过程中因噪声导致的波形紊乱,数据错误
FCS的检查过程就是将从包从开头到结尾的所有比特套用公式计算出FCS,然后和包末尾带的FCS对比,如果正常发送,两者结果一致,如果中途受到了噪声干扰而导致波形紊乱,则两者值产生差异,这个包被当作错误包被丢弃

用电信号表达数字信息时,我们需要让0和1两种比特分别对应特定的电压和电流,通过电信号来读取数据的过程就是将这种关系对应颠倒过来,即通过测量信号的电压和电流变化,还原出0和1两种比特的值
2.5.9 向集线器发送网络包
加上报头,起始帧分界符和FCS后,就可以将包通过网线发送出去,发送信号的操作分为两种,一种是使用集线器的半双工模式(某时刻只能进行发送或接收其中一种操作),另一种是使用交换机的全双工模式(发送和接收同时并行)
MAC模块从包头开始将数字信息按每个比特转换成电信号,然后由PHY/MAU(物理层装置/介质连接单元)的信号收发模块发送出去,在这里数字信息转换成电信号的速率就是网络的传输速率。接下来,PHY/MAU模块将信号转换成可以在网线上传输的格式,并通过网线发送出去。可以认位PHY/MAU模块的功能就是对MAC模块产生的信号进行格式转换
PHY:物理层装置,100Mbits/s以上的以太网中的信号收发模块
MAU:介质连接单元,以前低速连接的信号收发模块
集线器采用半双工模式,在发送信号的过程中,接收线路不应该有信号进来,一旦发生这种情况,两组信号就会相互叠加,无法彼此区分开来,这就是所谓的信号碰撞,此时发送操作终止。采用交换机的全双工工作模式没有信号碰撞的问题
2.5.10 接收返回包
在使用集线器的半双工模式以太网中,以太设备发送的信号会到达连接在集线器上的所有设备,所以操作的第一步就是接收所有以太网中的所有信号
信号的开头是报头,通过报头的波形同步时钟,然后遇到起始帧分界符开始将后面的信号传换成数字信息。接收与发送相反,先是PHY/MAU模块开始工作,将信号转换成通用格式并发给MAC模块,再轮到MAC模块从头开始将信号转换成数字信息,并放到缓冲区中。当到达信号的末尾时,还需要检查FCS
如果FCS也没有问题,则检测此包中的MAC头部中接收方地址是否与自己的MAC地址相同,如果一致则将包放入缓冲区,接下来网卡会告诉计算机收到了一个包
通知计算机的操作使用了一种叫做中断的机制,如果网卡不通知计算机,计算机不知道包已经接收到了,需要使用中断来打断计算机正在执行的任务,让计算机注意到网卡中发生的事
网卡驱动被中断程序调用后,会从网卡的缓冲区取出收到的包,并通过MAC头部中的以太类型字段判断协议的类型,按照协议类型将包交给对应的协议栈,协议栈判断这个包该交给哪个应用程序,并进行相应的处理
2.5.11 将服务器的响应包从IP传递给TCP
如果Web服务器返回了一个网络包,网卡驱动会将其交给TCP/IP协议栈来处理。首先是IP模块的工作,先检查IP头部,确认格式是否正确,再查看接收方IP地址,如果地址一致,那么就可以接收这个包
IP协议具有一个分片的功能,由于网线和局域网只能传输小包,因此需要将大的包切分成多个小包,如果接收到的包是经过分片的,那么IP模块会将它们还原成原始的包,这个过程叫分片重组
接下来包会交给TCP模块,TCP根据IP头部中的接收方和发送方IP地址,以及TCP头部中的接收方和发送方端口号查询相应套接字。找到对应套接字后,就可以根据套接字中记录的通信信息,执行相应操作。如包的内容是应用程序数据,则返回确认接收的包,并将数据放入缓冲区,等待应用程序读取
2.6 UDP协议的收发操作
2.6.1 不需要重发的数据用UDP更高效
TCP的工作方式十分复杂,因为我们需要将数据高效且可靠的发送给对方,为了实现可靠性,我们需要确认对方是否收到了我们发送的数据,如果没有,需要再发一遍
当数据很短时,用一个包就可以装的下,就可以使用UDP协议。向DNS服务器查询IP地址的时候使用的是UDP协议。只要我们发送了数据,对方一般都会给出答复,将回答的数据当作接收确认就可以,不需要专门的接收确认包
2.6.2 控制用的短数据
像DNS查询等交换控制信息的操作基本可以在一个包的大小范围内解决,这种场景就可以使用UDP代替TCP。UDP没有TCP的接收确认,窗口等机制,因此在收发数据之间也不需要交换控制信息,不用建立和断开连接的过程,只要将数据前面加上UDP头部,然后交给IP发送即可
UDP只是单纯地发送包而已,并不像TCP一样对包的状态进行监控,所以协议栈也不知道有没有发生错误。但这样也不会出什么问题,因此出错就不会收到对方的答复,应用程序会注意到这个问题,并重发一遍数据
2.6.3 音频和视频数据
发送音频和视频的时候,也可以使用UDP。如果使用TCP,可能因为确认响应出错,重发时消耗一定的时间。因此重发的数据可能已经错过了播放的时机,重发数据也就没有用了
音频和视频数据中少了某些包并不会产生严重的问题,只是有一些失真或卡顿,一般都可以接收
1462

被折叠的 条评论
为什么被折叠?



