全文概要
写完前面几篇对网络硬件设备以及对应工作机制的介绍之后,我觉得有必要再多有一篇博文对网络中的端到端通信过程进行完整的解析,本文对同一网段内、跨网段主机通信两种情形分别列举两个简单示例,分别描述了通信过程中各硬件设备和网络协议的协同工作流程。
通用流程
网络设备之间的通信首先会经过如下两个步骤:
发送主机应用程序生成数据,准备向外发送一个数据包;
发送主机(TCP/IP协议栈)判断这个数据包的目的地址是否在同一个网段:本机IP地址和目的IP地址分别与本机子网掩码作按位与操作,结果一致则在同一网段,否则两者分别位处不同网段,针对两种不同情况,通信流程也有明显差异。
注意:网关通常指的是路由器的一个物理端口,此时路由器称为“网关路由器”。路由器转发数据包时不会对它的源IP地址和目的IP地址做修改,只会修改MAC地址。
网内通信
网内通信,即通信双方都位处同一网段中,数据传输无需经过路由器(或三层交换机),即可由本网段自主完成。
以下图拓扑为例:
在第一节的两个步骤基础上,若目的主机与发送主机属于同一网段,假设发送主机的ARP表中并无目的主机对应的表项,则发送主机会以目的主机IP地址为内容,广播ARP请求以期获知目的主机MAC地址,并通过交换机(除到达端口之外的所有端口发送,即洪泛(Flooding))向全网段主机转发,而只有目的主机接收到此ARP请求后会将自己的MAC地址和IP地址装入ARP应答后将其回复给发送主机,发送主机接收到此ARP应答后,从中提取目的主机的MAC地址,并在其ARP表中建立目的主机的对应表项(IP地址到MAC地址的映射),之后即可向目的主机发送数据,将待发送数据封装成帧,并通过二层设备(如交换机)转发至本网段内的目的主机,自此完成通信。
具体分析过程参见此篇
网际通信
网际通信,即通信双方分处不同网段,数据传输需经过路由器(或三层交换机)才能完成不同网段的通信。
以下图拓扑为例:
在第一节的两个步骤基础上,若目的主机与发送主机不在同一网段,则需进行以下五个步骤:
假设发送主机的路由表中也无目的主机所在网段对应的表项,发送主机会将此数据包先发送至默认网关,由默认网关完成转发,假设发送主机的ARP表中并无默认网关对应的表项,则进行上一节中相同的ARP过程以获知默认网关MAC地址,之后根据此MAC地址,本机将数据包封装成帧后发送给默认网关。值得注意的是,此数据包的目的MAC地址为默认网关的MAC地址,而目的IP地址仍为目的主机的IP地址,即:源、目的MAC地址在帧转发过程中会被修改为本跳和下一跳的MAC地址,而源、目的IP地址则始终不变;
假设两个通信网段仅通过此默认网关连接(两个网段之间只有默认网关这一跳),默认网关提取数据包的目的IP地址,并查找路由表对应表项,通过与每个表项的掩码(Genmask)进行按位与操作,得到的结果如果与对应目的网段(Destination)相同,在本例中将会找到一个满足要求的路由表项,并发现此表项指示的下一跳(Gateway)的IP地址为0.0.0.0,即说明目的主机属于与该网关的某个端口(由Iface指示)直连的网段,会向该端口转发此数据包,但在此之前,假设网关的ARP表项中并无目的主机对应的表项,那么它还是需要向目的网段广播ARP请求以获知目的主机的MAC地址,并随后以此MAC地址作为目的MAC地址,以路由表项Iface指示的端口的MAC地址为源MAC地址,将数据包封装成帧向目的主机发送。
假设两个通信网段之间包含不止一跳,那么默认网关进行步骤2类似过程,重新封装数据包转发到下一个网关;
直到网关发现目的网段与本机的某个端口直连,再行获取目的主机的MAC地址,并将数据包重新封装成帧发送到目的主机网卡;
目的主机协议栈验证目的IP地址是自身的IP地址后交付给上层应用,自此完成通信。
具体分析过程参见此篇