ARP 數據包格式分析


獲取目標IP的物理地址.

 

1.ARP數據包格式

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

ARP數據報的格式如下所示

2011-09-14-15-37

 

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

2.例子分析

請求幀如下(為了清晰在每行的前面加了字節計數,每行16個字節):

以太網首部(14字節) 
0000: ff ff ff ff ff ff 00 05 5d 61 58 a8 08 06 
ARP幀(28字節) 
0000:                                           00 01 
0010: 08 00 06 04 00 01 00 05 5d 61 58 a8 c0 a8 00 37 
0020: 00 00 00 00 00 00 c0 a8 00 02 
填充位(18字節) 
0020:                               00 77 31 d2 50 10 
0030: fd 78 41 d3 00 00 00 00 00 00 00 00

以太網首部:目的主機采用廣播地址,源主機的MAC地址是00:05:5d:61:58:a8,上層協議類型0x0806表示ARP。

ARP幀:硬件類型0x0001表示以太網,協議類型0x0800表示IP協議,硬件地址(MAC地址)長度為6,協議地址(IP地址)長度為4,op為0x0001表示請求目的主機的MAC地址,源主機MAC地址為00:05:5d:61:58:a8,源主機IP地址為c0 a8 00 37(192.168.0.55),目的主機MAC地址全0待填寫,目的主機IP地址為c0 a8 00 02(192.168.0.2)。

由於以太網規定最小數據長度為46字節,ARP幀長度只有28字節,因此有18字節填充位,填充位的內容沒有定義,與具體實現相關。

應答幀如下:

以太網首部 
0000: 00 05 5d 61 58 a8 00 05 5d a1 b8 40 08 06 
ARP幀 
0000:                                           00 01 
0010: 08 00 06 04 00 02 00 05 5d a1 b8 40 c0 a8 00 02 
0020: 00 05 5d 61 58 a8 c0 a8 00 37 
填充位 
0020:                               00 77 31 d2 50 10 
0030: fd 78 41 d3 00 00 00 00 00 00 00 00

以太網首部:目的主機的MAC地址是00:05:5d:61:58:a8,源主機的MAC地址是00:05:5d:a1:b8:40,上層協議類型0x0806表示ARP。

ARP幀:硬件類型0x0001表示以太網,協議類型0x0800表示IP協議,硬件地址(MAC地址)長度為6,協議地址(IP地址)長度為4,op為0x0002表示應答,源主機MAC地址為00:05:5d:a1:b8:40,源主機IP地址為c0 a8 00 02(192.168.0.2),目的主機MAC地址為00:05:5d:61:58:a8,目的主機IP地址為c0 a8 00 37(192.168.0.55)。

實際在開發板上的測試結果:

開發板發送給pc機實際抓包的結果一致:

發送60字節 ok 
0000  ff ff ff ff ff ff 08 90  90 90 90 90 08 06 00 01   ........ ........ 
0010  08 00 06 04 00 01 08 90  90 90 90 90 c0 a8 00 fa   ........ ........ 
0020  00 00 00 00 00 00 c0 a8  00 64 00 00 00 00 00 00   ........ .d...... 
0030  00 00 00 00 00 00 00 00  00 00 00 00               ........ ....   

抓包軟件實際顯示發送的數據為:

收到42字節arp響應包但是實際上是64個字節? 
0000  08 90 90 90 90 90 00 1e  c9 45 61 9e 08 06 00 01   ........ .Ea..... 
0010  08 00 06 04 00 02 00 1e  c9 45 61 9e c0 a8 00 64   ........ .Ea....d 
0020  08 90 90 90 90 90 c0 a8  00 fa  

開發板調試打印的結果: 
interrupt : st=1 status=1  len= 40 
receive data len=64 
08 90 90 90 90 90 00 1e c9 45 61 9e 08 06 00 01 
08 00 06 04 00 02 00 1e c9 45 61 9e c0 a8 00 64 
08 90 90 90 90 90 c0 a8 00 fa

00 00 00 00 00 00 00 00 
00 00 00 00 00 00 
00 00 00 00 0a 
1f b2 53

現在有個問題:

在上文表述過以太網規定最小數據長度為46字節但是實際抓包的分析只有42個字節,這個怎么解釋:

答:46個字節指的是以太網的幀,關鍵的是不包含以太網的首部也就是說14個字節的首部+28個字節的ARP響應幀(由於不夠46個字節需要加上一些填充位,但是這些數據沒有意義)+18個字節的填充位+4個字節的CRC校驗位=64個字節,也就是說抓包得到的42個字節,實際在開發板上調試得到的數據為64個字節是正確的

原文地址:http://www.cnblogs.com/xmphoenix/archive/2011/09/14/2176323.html


免責聲明!

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



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