wireshark抓包發現1506字節包


以太網的MTU最大為1506字節,但是抓包的時候我卻發現大量的1506的字節包,這讓我百思不得其解

1,TCP的MTU是哪里來的?

TCP的MTU一般使用默認值,當然,程序員也可以自己設定。我們這里討論的是以太網的MTU值,以太網的MTU值為1500。

 

2,以太網的MTU為1500,為什么包長度達到了1506?

以太網的最大傳輸單元是1500,但這個長度是不包含鏈路層的,這個值是鏈路層針對網絡層的設計,我們可以看看鏈路層的幀結構

這里我們討論最常見的以太網幀封裝結構,網絡上99%以上都是以太網幀封裝結構

由以太網幀結構,我們很容易就看出數據鏈路層針對網絡層數據進行了限制,而wireshark的length項是整個幀的長度。

即14+20+20+1452 = 1506

1452這個值我們很容易從抓包的TCP層獲取到

由此,我們得出,TCP層三次握手時候的MSS交換的值取決於網絡層,受限於數據鏈路層協議。

 

在以太網數據幀中,開始的那部分是變長的字段(IP首部和TCP首部,數據部分是固定的,但不影響),把它們移動到尾部(CRC之前),這樣把數據復制到內核時,就可以

把數據幀中的DATA部分映射到一個硬件頁面,節省內存到內存的復制過程。也就是說CRC之后不必要再將已經在內存的DATA再重復復制一遍來使用。TCP數據報的長度是512字節的

整數倍,正好可以用內核中的頁表來處理。

 

 我們注意到一個細節,CRC並未被計數到鏈路層數據長度

CRC是在數據發送期間進行計算的,是對整個幀的校檢,也就是說,當一個幀封流出之后,CRC校檢也隨即完成,故,CRC是不計入鏈路層的。我們設想,如果把CRC放在幀頭部,或幀中,那就需要對整個幀進行2次

操作方可完成,因為幀校檢完成之后,若不附在尾部,必然要進行數據的插入操作。

 

同時我們也知道,一個以太網數據流,最大可達到1500 + 18 即1518字節。

 

END!

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM