以太網的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!