1. 程式人生 > >linux網路程式設計之TCP/IP基礎(二):利用ARP和ICMP協議解釋ping命令

linux網路程式設計之TCP/IP基礎(二):利用ARP和ICMP協議解釋ping命令

一、MTU

乙太網和IEEE 802.3對資料幀的長度都有限制,其最大值分別是1500和1492位元組,將這個限制稱作最大傳輸單元(MTU,Maximum Transmission Unit)。如果IP層有一個數據報要傳,而且資料的長度比鏈路層的MTU還大,那麼IP層就要進行分片(Fragmentation),把資料報分成若干片,這樣每一片都小於MTU。當網路上的兩臺主機互相進行通訊時,兩臺主機之間要經過多個網路,每個網路的鏈路層可能有不同的MTU,其中兩臺通訊主機路徑中的最小MTU被稱作路徑MTU,Internet上標準MTU為576B(TCP)、512B(UDP)。如何測算路徑MTU? 如下所述:

For IPv4 packets, Path MTU Discovery works by setting the Don't Fragment (DF) option bit in the IP headers of outgoing packets. Then, any device along the path whose MTU is smaller than the packet will drop it, and send back an Internet Control Message Protocol (ICMP) Fragmentation Needed (Type 3, Code 4) message containing its MTU, allowing the source host to reduce its Path MTU appropriately. The process is repeated until the MTU is small enough to traverse the entire path without fragmentation.


下圖是返回的ICMP 錯誤的報文,包含路由器的MTU。


二、乙太網幀格式


其中的源地址和目的地址是指網絡卡的硬體地址(也叫MAC地址),長度是48位,是在網絡卡出廠時固化的。用ifconfig命令看一下,“HWaddr 00:15:F2:14:9E:3F”部分就是硬體地址。協議欄位有三種值,分別對應IP、ARP、RARP。幀末尾是CRC校驗碼。
乙太網幀中的資料長度規定最小46位元組,最大1500位元組,ARP和RARP資料包的長度不夠46位元組,要在後面補填充位。ifconfig命令的輸出中也有“MTU:1500”。注意,MTU這個概念指資料幀中有效載荷的最大長度,不包括幀首部的長度。

三、ARP(address resolution protocol)

在網路通訊時,源主機的應用程式知道目的主機的IP地址和埠號,卻不知道目的主機的硬體地址,而資料包首先是被網絡卡接收到再去處理上層協議的,如果接收到的資料包的硬體地址與本機不符,則直接丟棄。因此在通訊前必須獲得目的主機的硬體地址。ARP協議就起到這個作用。源主機發出ARP請求,詢問“IP地址是10.0.0.1的主機的硬體地址是多少”,並將這個請求廣播到本地網段(乙太網幀首部的硬體地址填FF:FF:FF:FF:FF:FF表示廣播),目的主機接收到廣播的ARP請求,發現其中的IP地址與本機相符,則傳送一個ARP應答資料包給源主機,將自己的硬體地址填寫在應答包中。如下圖所示



每臺主機都維護一個ARP快取表,可以用arp -a命令檢視。快取表中的表項有過期時間(一般為20分鐘),如果20分鐘內沒有再次使用某個表項,則該表項失效,下次還要發ARP請求來獲得目的主機的硬體地址。


注意到源MAC地址、目的MAC地址在乙太網首部和ARP請求中各出現一次,對於鏈路層為乙太網的情況是多餘的,但如果鏈路層是其它型別的網路則有可能是必要的。硬體型別指鏈路層網路型別,1為乙太網,協議型別指要轉換的地址型別,0x0800為IP地址,後面兩個地址長度對於乙太網地址和IP地址分別為6和4(位元組),op欄位為1表示ARP請求,op欄位為2表示ARP應答。

地址解析協議的處理流程如下圖:


四、RARP(Reverse Address Resolution Protocol)

跟ARP相反的協議,主要用於獲取無盤工作站的ip地址,如下圖所示,不再贅述。


五、ICMP(Internet Control Message Protocol)

ICMP協議用於傳遞差錯資訊、時間、回顯、網路資訊等控制資料,如下圖所示。


ICMP報文是封裝在IP資料報文中進行傳輸的,如下圖所示。


具體的型別和程式碼見下圖。


六、利用ARP和ICMP協議解釋ping程式

先看下面的流程圖,再來解釋。


步驟a:應用程式ping會判斷髮送的是主機名還是IP地址,如果是主機名會呼叫函式gethostbyname()解析主機B,將主機名轉換成一個32位的IP地址。這個過程叫做DNS域名解析。
步驟b:ping程式向目的IP地址傳送一個ICMP的ECHO包
步驟c:將目標主機的IP地址轉換為48位硬體地址,在區域網內傳送ARP請求廣播,查詢主機B的硬體地址。
步驟d:主機B的ARP協議層接收到主機A的ARP請求後,將本機的硬體地址填充到應答包,傳送ARP應答到主機A。
步驟e:傳送ICMP資料包到主機B。
步驟f:主機B接收到主機A的ICMP包,傳送響應包。
步驟g:主機A接收到主機B的ICMP包響應包。

參考:

《Linux C 程式設計一站式學習》

《TCP/IP詳解 卷一》