1. 程式人生 > >【 TCP/IP 】乙太網(RFC 894)幀格式、 ARP資料報格式、 IP資料報格式

【 TCP/IP 】乙太網(RFC 894)幀格式、 ARP資料報格式、 IP資料報格式

乙太網(RFC 894)幀格式

乙太網的幀格式如下所示:


其中的源地址和目的地址是指網絡卡的硬體地址(也叫MAC地址),長度是48位,是在網絡卡出廠時固化的。用ifconfig命令看一下,“HWaddr 00:15:F2:14:9E:3F”部分就是硬體地址。協議欄位有三種值,分別對應IP、ARP、RARP。幀末尾是CRC校驗碼。

乙太網幀中的資料長度規定最小46位元組,最大1500位元組,ARP和RARP資料包的長度不夠46位元組,要在後面補填充位。最大值1500稱為乙太網的最大傳輸單元(MTU),不同的網路型別有不同的MTU,如果一個數據包從乙太網路由到撥號鏈路上,資料包長度大於撥號鏈路的MTU了,則需要對資料包進行分片(fragmentation)。ifconfig命令的輸出中也有“MTU:1500”。注意,MTU這個概念指資料幀中有效載荷的最大長度,不包括幀首部的長度。

 ARP資料報格式

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

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

ARP資料報的格式如下所示


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

下面舉一個具體的例子。
請求幀如下(為了清晰在每行的前面加了位元組計數,每行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
679
填充位( 位元組)
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)。

如果源主機和目的主機不在同一網段,ARP請求的廣播幀無法穿過路由器,源主機如何與目的主機通訊?

 IP資料報格式

IP資料報的格式如下(這裡只討論IPv4)


IP資料報的首部長度和資料長度都是可變長的,但總是4位元組的整數倍。對於IPv4,4位版本欄位是4。4位首部長度的數值是以4位元組為單位的,最小值為5,也就是說首部長度最小是4x5=20位元組,也就是不帶任何選項的IP首部,4位能表示的最大值是15,也就是說首部長度最大是60位元組。8位TOS欄位有3個位用來指定IP資料報的優先順序(目前已經廢棄不用),還有4個位表示可選
的服務型別(最小延遲、最大呑吐量、最大可靠性、最小成本),還有一個位總是0。總長度是整個資料報(包括IP首部和IP層payload)的位元組數。每傳一個IP資料報,16位的標識加1,可用於分片和重新組裝資料報。3位標誌和13位片偏移用於分片。TTL(Time to live)是這樣用的:源主機為資料包設定一個生存時間,比如64,每過一個路由器就把該值減1,如果減到0就表示路由已經太長了仍然找不到目的主機的網路,就丟棄該包,因此這個生存時間的單位不是秒,而是跳(hop)。協議欄位指示上層協議是TCP、UDP、ICMP還是IGMP。然後是校驗和,只校驗IP首部,資料的校驗由更高層協議負責。IPv4的IP地址長度為32位。
前面講了乙太網幀中的最小資料長度為46位元組,不足46位元組的要用填充位元組補上,那麼如何界定這46位元組裡前多少個位元組是IP、ARP或RARP資料報而後面是填充位元組?