一个网络数据包的旅程~

1,042 阅读6分钟

谢希仁第七版计算机网络阅读笔记,通过四台主机之间的通信来分析网络包是如何准确的传输的

172.16.0.0/16的网络上有四台主机H1、H2、H3、H4

因此H1的网络通信分为三种情况:

  1. 与处在同一个局域网中的H2通信

在网络开始运行时,H1的ARP高速缓存中显然是没有主机H2的IP地址和MAC映射关系的,所以问题演变为H1是如何知道H2是在本网络的呢?

在发包前,H1知道目的IP地址为172.16.21.2/24,所以H1将172.16.21.2/24与自身的子网掩码255.255.255.0相与AND,得到目的地址的网络号为172.16.21.0,而这与H1自身的网络号相同,故H1发送ARP广播,“我是H1,我的IP为172.16.21.1/24,我的MAC地址为--48位MAC地址--,我想知道IP地址为172.16.21.2/24的MAC地址”,而H2就会给予相应的回应,将自身的MAC地址通过ARP响应分组发送给H1,并将H1与H1的MAC地址写到H2主机的ARP缓存中,而H1也把H2的MAC地址与IP地址映射到H1主机的ARP缓存中;

现在H1知道了H2的MAC地址,那就开始按照MAC帧格式封装IP数据包为帧,填入H1与H2的MAC地址、网络层协议类型为IP协议等信息;

写完帧,并在帧前加好同步码后,(同步码主要用来使得接收方网卡可以在接收帧数据之前先适应发送方网卡的比特率),MAC帧便会从主机H1的网卡发出,经由交换机转发到主机H2,最后H2的网卡便会收到相应的帧并逐层拆包。

  1. H1与不在一个子网但由同一个路由器连接的主机H3通信

H1通过目的IP地址与子网掩码的AND操作可得,H1与H3不在一个局域网中,那么H1会发送ARP请求包获取局域网中路由器R1的MAC地址,并将帧交给R1进行转发,因为一个路由器有两个接口对应着两个IP地址,与H1所在子网连接的IP端口为172.16.21.3/24,与H2所在子网连接的IP端口为172.16.22.2/24;

故当H1的请求包转发到路由器的接口2时,路由器会通过与操作判断请求报的目的IP地址172.16.22.1/24是否与端口2在同一个子网中,显然H3与R1的端口2在同一个子网中,因此路由器会发送ARP请求包,获取到H3的MAC地址并进行相应的转发。

  1. H1与不在一个子网且不是由同一个路由器连接的主机H4通信

与第2种情况类似,只不过在请求包转发到R1的接口2时,通过与操作判断H4不属于接口2所在的局域网中,因此接口2会通过ARP请求包找到路由器R2的MAC地址并进行相应请求包转发,而路由器R2的接口2所在的网络正是主机H4所在的网络,因此会直接进行包的交付。

那么交换机是如何进行同一个局域网间的主机通信呢?

这个问题要从局域网的发展历史来看待:

最开始的局域网中主机数目较少,因此便通过搭建总线型网络使得主机之间可以直接通信,并且为了防止总线信道冲突,通过CSMA/CD载波监听协议进行信道的维护;

而随着局域网的发展,局域网中的主机数目增多,并且主机间的相隔距离较之前变长很多,而这对通信信道的稳定性提出了更高的要求,所以导致了集线器的出现,集线器使得局域网间的主机可以构建星型网络,通过集线器的转发使得主机之间可以相隔更长的距离(100m左右),但是此星型网络在逻辑上仍然是总线型,在同一个时刻只允许一个主机发送数据,集线器工作在物理层,主要用于二进制信号的直接转发,并增强通信链路的稳定性。(这里忽略了路由选择协议)

后来局域网进一步发展,人们通过一个总集线器连接多个子集线器构建更大的网络,但由于集线器工作在物理层且本质上是一个总线型网络的缘故,使得在一个更大的网络中,需要时刻维护很多台主机间的信道冲突问题,因此网络的吞吐率并没有随着网络的增大而增加;

而集线器的问题主要在于(1)其工作在物理层导致它不能将不同子局域网中的信号缓存下来,因为它不知道比特信号应该从哪里开始,到哪里结束;(2)不能读取帧信息也导致其只能向连接在集线器上的所有子局域网发送数据包; 因此解决这个问题的核心在于需要建立一个工作在数据链路层的转发器,而这就是网桥,它能够对于不同子局域网中的发来的数据帧根据MAC帧的目的地址查找网桥中地址表进行转发和过滤,而网桥在不久后被交换机代替了,交换机是网桥的升级,交换机具有多个接口,每个接口可以连接一台主机或另一个交换机;交换机是全双工的,而这使得多个子局域网只要自身网络内没有产生信号碰撞即可与交换机通信,而不需要担心交换机是否被其他子局域网占用,因此提高了网络的总体吞吐量;并且交换机继承了网桥的特点并升级,网桥通过软件实现MAC帧的转发,而交换机是通过硬件自学习更新交换表(即网桥中的地址表),并通过交换表进行帧转发;并且在某个输出端口比较繁忙时,比如局域网1和局域网2等都想同局域网x通信,那么交换机对于局域网x的输出端口就会变得繁忙,而交换机在每个端口处都配置了存储器,用于缓存帧数据,因此不必担心帧因此而丢失的问题。

因此H1发往H2的帧,会通过交换机中的交换表进行转发,如果交换表中没有H2对应的交换机接口信息,那么交换机就会通过向交换机的每个接口发送帧的方式,而只有H2的MAC地址是正确的收下这个包,而交换机会在H2发送响应包的时候将主机H2对应的交换机端口写入交换表中。

至此,一个网络包的旅程便到此圆满结束~