利用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詳解 卷一》


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM