1. 程式人生 > >UNIX網路程式設計——利用ARP和ICMP協議解釋ping命令

UNIX網路程式設計——利用ARP和ICMP協議解釋ping命令

一、MTU

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

二、乙太網幀格式

                     


       其中的源地址和目的地址是指網絡卡的硬體地址(也叫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包響應包。