一、以太網資料幀資訊簡介
以太網有兩種類型的資料幀,一種是Ethernet_II另一種是IEEE802.3。
兩者并沒有明确的規定兩種類型的使用場景,通常都是由協定/應用程式的開發者定義的。
通過觀察發現:
- 應用程式産生的包大多為Ethernet_II
- 部分網絡協定工作時産生的包為IEEE802.3(如:STP産生的BPDU)
DMAC字段(目标的MAC位址)
SMAC字段(發送者的MAC位址)
Type字段(描述Data中的封裝的封包類型)常見類型:ARP[0x0806]、IP[0x0800]、VLAN[0x8100]
Data字段(使用者資料,其中還包含IP報頭、TCP/UDP報頭)
其中的封裝可以看作以下的抽象描述:
【 Data資料 】
【 IP報頭【Data資料】 】
【 IP報頭【TCP報頭【使用者資料】】 】
FCS字段(以太網校驗字段,校驗方法為循環備援檢驗)
二、以太網資料幀長度
以太網資料幀及封裝
以太網幀最短幀長度為64Byte(位元組)、最長1518Byte,當超過1518Byte之後的資料幀就需要進行一個分片處理。
以太網幀所占用的長度為:DMAC+SMAC+Type+FCS=18Byte。
已知最短幀長為64Byte,減去以太網18Byte之後就說明Date字段封裝内容最短需要有46Byte。
46Byte中還包含着IP報頭與TCP或UDP報頭:
- 46Byte減去IP報頭的20Byte=26Byte
- 當内部封裝TCP時:26Byte減去TCP報頭20Byte=6Byte
- 當内部封裝UDP時:26Byte減去UDP報頭8Byte=18Byte
得出的結果大小,也就是實際使用者資料的最小長度。
三、資料填充
如果不滿足最短幀長會怎樣?
以太網幀中的Data字段會自行填充0,直到滿足最短幀長。
疑惑:理論上說以太網幀不滿足最小幀長,Data字段會填充0,但在終端所發送的包中并沒有展現出來。
以下是抓包使用者發送的ICMP資料包結果,可以看了總幀長為45Byte(并沒有将FCS字段長度計算在内),使用者實際長度為3Byte,完全不符合最小幀長度的要求。
網絡裝置這邊,則是能夠正常的進行填充,實作資料幀滿足最小幀長要求
網絡裝置這邊可以看到幀長度為60Byte(加上FCS字段4byte就滿足了最小64Byte幀長了)
如何計算填充多少位元組?
64Byte-18Byte(以太網幀長度)-20Byte(IP報頭)-8Byte(ICMP屬于UDP封包占8Byte)-3Byte(實際發送長度)
=64-18-20-8-3
=15Byte
四、資料分片
以太網幀最短幀長度為64Byte(位元組)、最長1518Byte,當超過1518Byte之後的資料幀就需要進行一個分片處理。
為什麼資料包需要分片呢?
因為有MTU(最大傳輸單元)限制,網絡裝置限制最大傳輸的MTU大小為1500Byte(此處的1500Byte指的是以太網中Data字段大小限制在1500Byte内),超過MTU值的資料包就需要進行分片,将資料包分成小于/等于MTU值大小的資料分片,到了目的地再組裝起來。
換名話講,當以太網幀長度大于1518Byte就需要進行分片。
如果資料包大小大于1518Byte,我強制不分片會怎樣?
會禁止發送該不正常的資料包。