1. 程式人生 > >ping的時候第一個包為什麽會丟?

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請求,並且丟棄這個包。

技術分享圖片


在另外的模擬器上做實驗並且抓取報文如下:

技術分享圖片

看起來,確實產生了一次ARP解析,然後有四次ICMP交互;


更加詳細一點的說,其實當ICMP將數據交給IP要求發出的時候,在互聯網層是要經過路由決策的,這一部分並不在本文探討範圍之內,有興趣的讀者可以結合著路由原理和思科快速轉發技術思考下圖的英文描述。

技術分享圖片


本文依舊本著分享、探討相互學習的態度拿出來與各位讀者共勉。

版權所有,請勿轉載。

ping的時候第一個包為什麽會丟?