Packet frame 長度分析基於抓包器

2021-07-22 06:05:34 字數 1180 閱讀 8472

做openflow實驗,wireshark抓包長度為169,但是自己算總算不出來為啥是169.。

說明:乙太網(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~65535保留為型別域值(0x0600~0xffff)

6、資料:46~1500位元組

7、幀校驗序列(fcs):4位元組,使用crc計算從目的mac到資料域這部分內容而得到的校驗和。

據rfc894的說明,乙太網封裝ip資料報的最大長度是1500位元組,也就是說乙太網最大幀長應該是乙太網首部加上1500,再加上7位元組的前導同步碼和1位元組的幀開始定界符,具體就是:7位元組前導同步嗎+1位元組幀開始定界符+6位元組的目的mac+6位元組的源mac+2位元組的幀型別+1500+4位元組的fcs。

按照上述,最大幀應該是1526位元組,但是實際上我們抓包得到的最大幀是1514位元組,為什麼不是1526位元組呢?原因是當資料幀到達網絡卡時,在物理層上網絡卡要先去掉前導同步碼和幀開始定界符,然後對幀進行crc檢驗,如果幀校驗和錯,就丟棄此幀。如果校驗和正確,就判斷幀的目的硬體位址是否符合自己的接收條件(目的位址是自己的物理硬體位址、廣播位址、可接收的多播硬體位址等),如果符合,就將幀交「裝置驅動程式」做進一步處理。這時我們的抓包軟體才能抓到資料,因此,抓包軟體抓到的是去掉前導同步碼、幀開始分界符、fcs之外的資料,其最大值是6+6+2+1500=1514。

乙太網規定,乙太網幀資料域部分最小為46位元組,也就是乙太網幀最小是6+6+2+46+4=64。除去4個位元組的fcs,因此,抓包時就是60位元組。當資料字段的長度小於46位元組時,mac子層就會在資料字段的後面填充以滿足資料幀長不小於64位元組。由於填充資料是由mac子層負責,也就是裝置驅動程式。

結論:169 = ip 155+ ethii 14(si 6+di 6+length 2)  , 這裡不包括前導碼+幀起始界定符+最後的fcs,因為這些都是網絡卡做的事情:物理層上網絡卡要先去掉前導同步碼和幀開始定界符,然後對幀進行crc檢驗,如果幀校驗和錯,就丟棄此幀。所以二層抓包器就抓到169byte。

UDP資料報的最佳長度分析

在進行udp程式設計的時候,我們最容易想到的問題就是,一次傳送多少bytes好?當然,這個沒有唯一答案,相對於不同的系統,不同的要求,其得到的答案是不一樣的。首先,我們知道,tcp ip通常被認為是乙個四層協議系統,包括鏈路層 網路層 傳輸層和應用層。udp屬於傳輸層,下面我們由下至上一步一步來看 ...

求結構長度筆試題的分析。

最近作了一些筆試題,發現有一些是求乙個結構的大小。做一下總結 typedef struct tbit a typedef struct tbit b typedef struct tbit c sizeof a 4 sizeof b 6 sizeof c 4,short 相對應結構的偏移量是2的倍數...

分析MySQL資料型別的長度

分析mysql資料型別的長度 mysql有幾種資料型別可以限制型別的 長度 有char length varchar length tinyint length smallint length mediumint length int length bigint length float lengt...