很多小伙伴在做实验的时候,或许没有注意过,我们在刚配好一个网络之后,第一次用ping命令测试,总是会出现第一个或者前面几个报文超时没有回应的现象:

ping的时候第一个包为什么会丢?

按图配置两台路由器,并作ping测试,设备显示log如下:

R1#ping 10.1.1.2
Type escape sequence to abort.
Sending 5, 100-byte ICMP Echos to 10.1.1.2, timeout is 2 seconds:
.!!!!
Success rate is 80 percent (4/5), round-trip min/avg/max = 1/1/1 ms
R1#

众所周知,在Cisco IOS操作系统上,ping的回显为 “.” 代表在规定时间内没有收到ICMP回应。默认超时时间为 2 秒 。

那么上面显示成功速率为80%,发出五个请求,仅仅收到了四个回应,究竟是为什么呢?

这个问题,我们需要结合数据封装、ICMP、IP、ARP几个内容来进行梳理。


数据的封装结构要完整,才能将报文由物理层的硬件转换为电气信号进行传输;

我们在设备上做ping操作,将由ICMP发起 echo request,并等待接收方的回应;也就相当于这样:你的老板让你一小时之内把两千万人民币给我送来,并等待我的回应,这是一个任务;

出现这种情况的另一个条件就是,R1的ARP缓存中并没有关于R2 E0/0接口的条目,因此当执行数据链路层封装的时候就会产生等待,先由ARP协议去获取目标MAC地址,当获取到目标MAC地址了之后,才能完成数据链路层头部的封装,报文才能发送。

这个过程,就相当于你去通过各种方法打听我的地址一样,在打听到我的地址之前,你是不可能带着两千万现金在大街上闲逛的,只有打听到了我的地址,你才会把两千万装进卡车,然后给我送过来。


现在揭开出现响应超时的奥秘:

事实上,抛开思科快速转发技术不谈,当互联网层(也就是IP)接到传输任务的时候,它会首先做出转发决策,在这个环境中,必然是决定将数据直接从E0/0接口转发给R2。

数据链路层在封装之前要检查目标IP地址是否在本地的ARP缓存中,这里是没有的,于是ARP将会发起一个请求用于获取目标MAC地址,并且丢弃这个数据包


ping的时候第一个包不通这一现象在互联网上的说法各不一致,为此我特别做了一点求证:

在RFC 826号文档中有如下描述:

Packet Generation:
------------------
As a packet is sent down through the network layers, routing determines the protocol address of the next hop for the packet and on which piece of hardware it expects to find the station with the immediate target protocol address. In the case of the 10Mbit Ethernet, address resolution is needed and some lower layer (probably the hardware driver) must consult the Address Resolution module (perhaps implemented in the Ethernet support module) to convert the <protocol type, target protocol address> pair to a 48.bit Ethernet address. The Address Resolution module tries to find this pair in a table. If it finds the pair, it gives the corresponding 48.bit Ethernet address back to the caller (hardware driver) which then transmits the packet. If it does not, it probably informs the caller that it is throwing the packet away (on the assumption the packet will be retransmitted by a higher network layer), and generates an Ethernet packet with a type field of ether_type$ADDRESS_RESOLUTION.

标注的这句话,简单翻译一下(尽量让大家能听懂),就是说:如果没有ARP映射,则地址解析模块将通知调用方(在这里也就是上层的IP)它将会丢弃报文(当然在这里地址解析模块假设的是这个被丢弃的分组将会被高层重传,然而IP并没有数据恢复这个功能)。


另外,也在cisco官方提供的packet tracer模拟器上做了一个实验,如下图所示,图中英文意思为:ARP尝试针对目标IP地址发送一个ARP请求,并且丢弃这个包。

ping的时候第一个包为什么会丢?


在另外的模拟器上做实验并且抓取报文如下:

ping的时候第一个包为什么会丢?

看起来,确实产生了一次ARP解析,然后有四次ICMP交互;


更加详细一点的说,其实当ICMP将数据交给IP要求发出的时候,在互联网层是要经过路由决策的,这一部分并不在本文探讨范围之内,有兴趣的读者可以结合着路由原理和思科快速转发技术思考下图的英文描述。

ping的时候第一个包为什么会丢?


本文依旧本着分享、探讨相互学习的态度拿出来与各位读者共勉。

版权所有,请勿转载。