1. 程式人生 > >為什麼抓包工具所抓包最小是54位元組而不是60位元組

為什麼抓包工具所抓包最小是54位元組而不是60位元組


根據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子層負責,也就是裝置驅動程式。不同的抓包程式和裝置驅動程式所處的優先層次可能不同,抓包程式的優先順序可能比裝置驅動程式更高,也就是說,我們的抓包程式可能在裝置驅動程式還沒有填充不到64位元組幀的時候,已經捕獲了資料。因此不同的抓包工具抓到的資料幀的大小可能不同。(比如,wireshark抓到的可能沒有填充資料段,而sniffer抓到的就有填充資料段),(不過 根據我的觀察wireshark不同的版本抓獲的最小資料包的大小好像有60位元組也有54位元組的情況.....)