幀的資料字段的最小長度位46位元組。如果ip資料報小於46位元組,資料報必須被填充到46位元組。當採用填充時,傳遞到網路層的資料報括ip資料報和填充部分。網路層使用ip資料報首部中的長度欄位來去除填充部分。
當資料幀到達網絡卡時,在物理層上網絡卡要先去掉前導同步碼和幀開始定界符,然後對幀進行crc檢驗,如果幀校驗和出錯,就丟棄此幀。如果校驗和正確,就判斷幀的目的硬體位址是否符合自己的接收條件(目的位址是自己的物理硬體位址、廣播位址、可接收的多播硬體位址等),如果符合,將幀交給
「裝置驅動程式
」做進一步處理,將幀的資料字段的內容傳遞給網路層。這時我們抓包的軟體才能抓到資料,因此,抓包軟體抓到的是去掉前導同步碼、幀開始分界符、fcs之外的資料。
乙太網中,ip資料報長度最小為46位元組,負載不足46位元組,在資料幀的末尾補0,但是補充的0屬於乙太網層,不屬於資料部分。所以wireshark顯示的資料幀最小長度是14位元組 + 46位元組 = 60 位元組。
對於icmp報文,當icmp 請求報文的 payload 小於 18 位元組時,icmp響應報文會填充0, 但是它們有效負載的長度還是相同的.
計算方法: 46 - ip首部(20位元組)-icmp首部(8位元組) = 18 位元組。
最大傳輸單元(mtu):指由ip包頭和資料部分組成的ip資料報長度。
乙太網中, mtu 設定為 1500。所以icmp負載長度最大值為
mtu(1500位元組) - ip首部長度(20位元組)-icmp首部長度(8位元組) = 1472 位元組
當icmp負載長度超過1472位元組,icmp 報文會被分片。如下圖所示:
其中,幀354的負載大小為1480位元組,等於icmp最大負載長度(1472位元組) + icmp首部長度(8位元組)
分片前 icmp報文長度為1513位元組 = 1480位元組 + 33 位元組
對應的資料幀:
幀354的長度1514 = 乙太網幀首部(14位元組) + ip首部(20位元組) + icmp首部(8位元組)+ icmp 負載長度(1472位元組)
幀355的長度67位元組 = 乙太網幀首部(14位元組) + ip首部(20位元組) + 負載長度(33位元組)
可見,幀355的長度67位元組中不包含icmp首部,使用scapy解析該資料報時找不到icmp首部。
參考:wireshark捕獲ip分片資料報實踐
ping 包長度及 mtu
網路資料報最大長度 MTU 分片
1 資料鏈路層對資料幀的長度都有乙個限制,也就是鏈路層所能承受的最大資料長度,這個值 稱為最大傳輸單元,即mtu。以乙太網為例,這個值通常是1500位元組。2 對於ip資料報來講,也有乙個長度,在ip包頭中,以16位來描述ip包的長度,也就是說,乙個ip包,最長可能是65535位元組。3 結合以上兩...
乙太網資料幀(802 3)最大與最小長度
乙太網 ieee 802.3 幀格式 1 前導碼 7位元組0x55,一串1 0間隔,用於訊號同步 2 幀起始定界符 1位元組0xd5 10101011 表示一幀開始 3 da 目的mac 6位元組 4 sa 源mac 6位元組 5 型別 長度 2位元組,0 1500保留為長度域值,1536 6553...
最小資料庫sqlite學習
三 開啟cmd命令視窗。進入到sqlite的安裝目錄 shell版本的目錄中 執行命令 sqlite3 mydb.db,即建立了乙個資料庫名稱為mydb的資料庫 四 建表 create table t person p id integer,p name text 30 p age integer ...