网络是怎样连接的-读书笔记-用电信号传输 TCP/IP 数据-IP与以太网包收发

IP与以太网包收发

以下内容是数据链路层和网络层上的传输,从TCP将包交给IP开始,到包在集线器上传输,再到回接的一个过程。

包的基本概念

包是由头部和数据两部分构成的,头部包含目的地址等控制信息,大家可以把它理解为快递包裹的面单;头部后面就是委托方要发送给对方的数据,也就相当于快递包裹里的货物。包被创建完毕后,会被发往最近的网络转发设备,转发设备则会根据这个头部信息判断接下来应该发往哪里。

而转发设备一般分为两种,路由器和集线器。集线器是按照以太网规则传输包的设备,而路由器是按照IP规则传输包的设备,因此我们也可以作如下理解:
(1)IP 协议根据目标地址判断下一个 IP 转发设备的位置
(2)子网中的以太网协议将包传输到下一个转发设备
回到包上,TCP/IP包包含以下头部:
(1)用于以太网协议的MAC头部
(2)用于IP协议的IP头部
从架构上说,IP协议是比以太网协议更高层的,以太网协议是IP协议的委托对象,也可以被换成其他的转发方式如无线网络等,他们有如下的工作方式:
(1)发送方要把对象的IP写到包中,这样IP协议就可以根据这一IP地址查询包的传输方向,从而找到下一个路由器的地址。
(2)在这个基础上,IP协议就把下一个路由器的以太网地址,即MAC地址写到MAC头部当中,这样以太网协议就知道包要发到哪里去了。
(3)集线器是根据以太网协议工作的设备,为了判断包接下来往哪里传输,集线器里有一张用于以太网协议的查询表。网络包在传输的过程中会经过集线器,通过集线器查询到相应的传输方向。
(4)到达下一个路由器后,重复上述过程,查询到再下一个路由器的MAC地址,改写当前MAC,传出去。

包收发操作概览

IP模块仅仅是整个包传输过程的入口而已,实际的传输操作都是由底层的路由器、集线器等网络设备完成的。
包的收发操作的起点是TCP模块委托IP模块发送包的操作,首先加上TCP的头部,然后托付给IP模块。
IP模块会添加IP头部和MAC头部两种头部,封装为一个包,这就是IP模块的工作。
接下来包被交给网络硬件(可能是插在计算机主板上的板卡,也可能是笔记本电脑上的 PCMCIA 卡,或者是计算机主板上集成的芯片),统称为网卡。传递给网卡的网络包是由一连串 0 和 1 组成的数字信息,网卡会将这些数字信息转换为电信号或光信号,并通过网线(或光纤)发送出去,然后这些信号就会到达集线器、路由器等转发设备,再由转发设备一步一步地送达接收方。
而收的过程是反过来的,网卡接受物理信号并转换为数字信息,然后上交给IP模块,IP模块剥离出MAC头部和IP头部,上交给TCP模块。
总的来说,IP模块不管你拿到的是什么数据,都一视同仁,发出去就完事了,至于这些数据有没有乱序、丢了没丢也是不管的。

生成包含接收方IP地址的IP头部

包的头部一定要包含的是目标IP地址,这个地址是由 TCP 模块告知的,而 TCP 又是在执行连接操作时从应用程序那里获得这个地址的,因此这个地址的最初来源就是应用程序。还有一个很重要的是发送方的IP地址,而若发送方具有多块网卡时,其具有多个IP地址,需要进行选择,这个选择过程是通过查询路由表进行的。

表中,Network Destination和Netmask对应于目标IP,Interface是网卡的IP,Gateway是下一个路由器的IP。
在这个表中,我们首先通过Network Destination和Netmask确定下对应的条目。然后,使用Interface的IP作为原地址将包发到Gateway的IP的路由器上。
表的第 1 行中,目标地址和子网掩码 A 都是 0.0.0.0,这表示默认网关,如果其他所有条目都无法匹配,就会自动匹配这一行 B。
接下来还需要填写协议号,它表示包的内容是来自哪个模块的。例如,如果是 TCP 模块委托的内容,则设置为 06(十六进制),如果是 UDP 模块委托的内容,则设置为 17(十六进制),这些值都是按照规则来设置的。

生成以太网用的 MAC 头部

MAC 头部的开头是接收方和发送方的 MAC 地址,大家可以认为它们和 IP 头部中的接收方和发送方 IP 地址的功能差不多,只不过 IP 地址的长度为 32 比特,而 MAC地址为 48 比特。

MAC头部其实看上去比较简单,只要填好三个东西即可,发送的MAC查自己网卡,发送类型就发送类似填上去,目标MAC则要查路由表,然后看看Gateway的IP,然后执行IP地址查询MAC的操作。

通过 ARP 查询目标路由器的 MAC 地址

Address Resolution Protocol是全名,顾名思义就是查询MAC地址的。
ARP利用广播的方法,向所有的设备发送查询消息,问目标IP是谁的,然后对应的人就会回应消息。当然,前提是处在同一个子网当中。

不过每次都这样查询就很累,最实惠的方法还是查表记录了。我们会将查询结果放到一块叫作 ARP 缓存的内存空间中留着以后用。也就是说,在发送包时,先查询一下 ARP 缓存,如果其中已经保存了对方的 MAC 地址,就不需要发送 ARP 查询,直接使用 ARP 缓存中的地址,而当 ARP 缓存中不存在对方 MAC 地址时,则发送 ARP 查询。

但缓存的东西不是一直可信的,例如当 IP 地址发生变化时,ARP 缓存的内容就会和现实发生差异。为了防止这种问题的发生,ARP 缓存中的值在经过一段时间后会被删除,一般这个时间在几分钟左右。

以太网的基本知识

以太网是一种为多台计算机能够彼此自由和廉价地相互通信而设计的通信技术。一个以太网内,各个计算机设备通过某种方式连接起来。(物理)

当一台计算机发送信号时,信号就会通过网线流过整个网络,最终到达所有的设备。这就好像所有人待在一个大房间里,任何一个人说话,所有人都能够听到,同样地,这种网络中任何一台设备发送的信号所有设备都能接收到。所以要让接受者能准确识别到给自己的信号,就要在信号开头加上接受者的信息。
为了控制这一操作,我们就需要使用MAC头部。通过 MAC 头部中的接收方 MAC 地址,就能够知道包是发给谁的;而通过发送方 MAC 地址,就能够知道包是谁发出的;此外,通过以太类型就可以判断包里面装了什么类型的内容。以太网其实就这么简单。QAQ
后来,通信技术发生了变革,用一根主干网线、或者是集线器连起来所有的设备这种方式被抛弃,而使用交换机的方式逐渐流行起来。交换机就负责识别MAC头部,只转交给对应的设备,不会发给其他人。因为依然要用到MAC地址以识别设备,所以这个设计仍然保留着。
将包发送到 MAC 头部的接收方 MAC 地址代表的目的地,用发送方 MAC地址识别发送方,用以太类型识别包的内容。因此,大家可以认为具备这3个性质的网络就是以太网!!!

将IP包转换成电或光信号发送出去

网卡的主要结构如下:

网卡的 ROM 中保存着全世界唯一的 MAC 地址,将这个值读出之后就可以对 MAC 模块进行设置,MAC 模块就知道自己对应的 MAC 地址了。
网卡驱动从 IP 模块获取包之后,会将其复制到网卡内的缓冲区中,然后向MAC 模块发送发送包的命令。接下来就轮到 MAC 模块进行工作了。
MAC 模块会将包从缓冲区中取出,并在开头加上报头和起始帧分界符,在末尾加上用于检测错误的帧校验序列。

报头是一串像 10101010…这样 1 和 0 交替出现的比特序列,长度为56比特,起始帧分界符则是8比特,它的作用是确定包的读取时机。

末尾的 FCS(帧校验序列)用来检查包传输过程中因噪声导致的波形紊乱、数据错误,它是一串 32 比特的序列,是通过一个公式对包中从头到尾的所有内容进行计算而得出来的。当原始数据中某一个比特发生变化时,计算出来的结果就会发生变化。在包传输过程中,如果受到噪声的干扰而导致其中的数据发生了变化,那么接收方计算出的 FCS 和发送方计算出的 FCS 就会不同,这样我们就可以判断出数据有没有错误。

向集线器发送网络包

加上报头、起始帧分界符和 FCS 之后,我们就可以将包通过网线发送出去了。发送信号的操作分为两种,一种是使用集线器的半双工模式,另一种是使用交换机的全双工模式。
在半双工模式中,为了避免信号碰撞,首先要判断网线中是否存在其他设备发送的信号。如果有,则需要等待该信号传输完毕,因为如果在有信号时再发送一组信号,两组信号就会发生碰撞。
首先,MAC 模块从报头开始将数字信息按每个比特转换成电信号,然后由 PHY或者叫MAU的信号收发模块发送出去。在这里,将数字信息转换为电信号的速率就是网络的传输速率,例如每秒将 10 Mbit 的数字信息转换为电信号发送出去,则速率就是 10 Mbit/s。
接下来,PHY(MAU)模块会将信号转换为可在网线上传输的格式,并通过网线发送出去。
以太网不会确认发送的信号对方有没有收到。根据以太网的规格,两台设备之间的网线不能超过 100 米,在这个距离内极少会发生错误,万一发生错误,协议栈的 TCP 也会负责搞定,因此在发送信号时没有必要检查错误。
最后,是碰撞处理。理论上来说,在发送信号时接受线路不应该有其他信号进来,但总是有可能的,这种情况叫做信号碰撞。这种情况下,继续发送信号是没有意义的,因此发送操作会终止。为了通知其他设备当前线路已发生碰撞,还会发送一段时间的阻塞信号,然后所有的发送操作会全部停止。等待一段时间之后,网络中的设备会尝试重新发送信号。但如果所有设备的等待时间都相同,那肯定还会发生碰撞,因此必须让等待的时间相互错开。具体来说,等待时间是根据 MAC 地址生成一个随机数计算出来的。当网络拥塞时,发生碰撞的可能性就会提高,重试发送的时候可能又会和另外一台设备的发送操作冲突,这时会将等待时间延长一倍,然后再次重试。以此类推,每次发生碰撞就将等待时间延长一倍,最多重试10次,如果还是不行就报告通信错误。

接收返回包

在使用集线器的半双工模式以太网中,一台设备发送的信号会到达连接在集线器上的所有设备。
首先,PHY(MAU)模块会将信号转换成通用格式并发送给 MAC 模块,MAC 模块再从头开始将信号转换为数字信息,并存放到缓冲区中。当到达信号的末尾时,还需要检查 FCS。
然后,如果 FCS 校验没有问题,接下来就要看一下 MAC 头部中接收方MAC 地址与网卡在初始化时分配给自己的 MAC 地址是否一致,以判断这个包是不是发给自己的。我们没必要去接收发给别人的包,因此如果不是自己的包就直接丢弃,如果接收方 MAC 地址和自己 MAC 地址一致,则将包放入缓冲区中。到这里,MAC 模块的工作就完成了,接下来网卡会通知计算机收到了一个包。
最后,通过中断机制通知操作系统,中断处理程序读出缓存内容即可。

将服务器的响应包从 IP 传递给 TCP

服务器返回的包的以太类型应该是 0800,因此网卡驱动会将其交给 TCP/IP 协议栈来进行处理。接下来就轮到 IP 模块先开始工作了。
第一步是检查 IP 头部,确认格式是否正确。
如果格式没有问题,下一步就是查看接收方 IP 地址。如果接收网络包的设备是一台 Windows 客户端计算机,那么服务器返回的包的接收方 IP 地址应该与客户端网卡的地址一致,检查确认之后我们就可以接收这个包了。
但如果发现,IP地址不是自己的,而客户端又不负责对包进行转发(服务器可以),那一定发生了什么奇奇怪怪的错误了,IP模块就通过ICMP 消息将错误告诉发送方。

实际上IP模块还有一个分片重组的功能,将大包分成小包,这些小包拥有同样的ID,拥有各自的偏移量,接收方可以根据这些信息组合成为一个大包。

到以上为止,IP模块的工作就结束了,然后包被交给了TCP模块。TCP模块会根据IP头部中双方的IP地址,以及TCP头部中双方的端口号查询套接字,找到套接字后就可以根据其通信状态执行相应的操作了。如果包的内容是应用程序数据,则返回确认接收的包,并将数据放入缓冲区,等待应用程序来读取;如果是建立或断开连接的控制包,则返回相应的响应控制包,并告知应用程序建立和断开连接的操作状态。

posted @ 2020-12-14 19:37  HermioneGranger  阅读(349)  评论(0)    收藏  举报