谢希仁第七版计算机网络阅读笔记,通过四台主机之间的通信来分析网络包是如何准确的传输的
172.16.0.0/16的网络上有四台主机H1、H2、H3、H4

- 与处在同一个局域网中的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协议等信息;


- 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地址并进行相应的转发。
- H1与不在一个子网且不是由同一个路由器连接的主机H4通信
与第2种情况类似,只不过在请求包转发到R1的接口2时,通过与操作判断H4不属于接口2所在的局域网中,因此接口2会通过ARP请求包找到路由器R2的MAC地址并进行相应请求包转发,而路由器R2的接口2所在的网络正是主机H4所在的网络,因此会直接进行包的交付。
那么交换机是如何进行同一个局域网间的主机通信呢?
这个问题要从局域网的发展历史来看待:
最开始的局域网中主机数目较少,因此便通过搭建总线型网络使得主机之间可以直接通信,并且为了防止总线信道冲突,通过CSMA/CD载波监听协议进行信道的维护;

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

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

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