在packageTracer中做实验时发现首次ping位于不同网络中的主机时必然会超时,我对此疑惑不解,但是上网没有找到相关解答,于是我通过包跟踪找到了答案,于是将其记录下来,希望对后拉的读者有所帮助。
PS:R0与R1的位置有误
PC1 Ping PC3 的过程
-
首先,当我们在PC1发出Ping命令时,网络层会检查目标地址,发现其网络号与本主机不同,于是会将其数据报先转发给默认网关,于是网络层告诉数据链路层"我要将这份报文发给192.168.1.1".
-
数据链路层收到报文,查找转发表(初始状态转发表为空),发现没有该地址(192.168.1.1)对应的MAC地址,于是数据链路层首先会向本网络广播一份ARP请求报文,向目标IP地址(192.168.1.1)请求它的MAC地址,这也就是为什么首次Ping时pt上显示两个报文,一个是ARP,一个是ICMP。
-
目标主机(路由器)收到报文后,会发送arp响应报文告诉PC1它的MAC地址,PC1收到该报文之后就知道了目标路由的mac地址,于是向目标路由转发网络层交付的报文,到这时候第一次Ping的报文才算正式发出
-
报文转发给R1,R1收到该报文会从路由表中得知该报文需要转发给R0,于是该报文被转发给了R0
-
而R0的arp表中并没有该主机对应的MAC地址,于是R0也会向本网络广播一个arp请求报文,但是与PC1不同的是R0会直接将该Ping报文直接丢弃,而不是等待收到arp响应报文之后在发出,所以目标主机(PC3)并没有受到首次Ping请求!这也就是为什么首次Ping会丢包。这应该也是网络提供不可靠服务的具体体现吧。
-
PC3收到arp请求后会向R0发出arp响应报,于是R0将其记录到自己的arp表中,之后的ICMP报文到该路由便能被正确的转发,所以后续的Ping便不会超时
总结
首次Ping会丢包是因为当路由器发现arp表中没有目标MAC地址时会直接丢弃该包(或许说是帧更合适一些),而之后的Ping不会超时是因为路由器也并不是什么都不做,它会向本网络广播一次arp请求。