2011-11-03 71 views
2

嗯,我看到一個奇怪的東西,這不是我所期望的TCP理論。 客戶端進行握手時,MSS(最大段大小)爲1360,窗口大小爲64K,但Linux服務器發送的TCP數據包包含4KB,7KB,8KB的超過1360的數據包,我期望它小於1360個字節爲什麼Linux服務器對TCP數據包的響應超過了客戶端請求的MSS

我做一個tcpdump和再看到它是Wireshark

沒想到Server發送每個TCP數據包超過1360個字節觀測到這一點, 我錯了地方在我的理論瞭解TCP的工作原理?

+0

這裏的術語很混亂。沒有'TCP數據包'這樣的東西。有IP數據包和TCP段。這是什麼? – EJP

回答

2

首先,@fernacolo聲明不要混淆MSS和MTU。

也許您的界面的通用分段卸載已啓用 - 閱讀here瞭解更多信息。

0

檢查您是否將MSS與MTU混淆。數據包大小受MTU限制,而不受MSS限制。完整的TCP數據包包含MAC頭,IP頭,TCP頭,TCP選項和有效載荷。所以,TCP數據包可能比MSS好。

0

如果你正在捕獲服務器上的數據包,那麼你可能會看到TCP發送比MTU更大的數據段。然而,線路上的數據包只有MTU大小。您可以通過在網絡設備(交換機)上捕獲來驗證這一點。或者在遠程(客戶端)機器上捕獲數據包將顯示每個數據包爲< = MTU。

此行爲是由於啓用了TSO/GSO的事實,TCP段被網卡硬件拆分爲MTU大小的數據包。由於tcpdump在軟件層捕獲,因此看到比MTU大的段被髮送到NIC卡以供進一步傳輸。

如果您禁用NIC的tso/gso,那麼您將看到所有傳出數據包爲< = MTU大小(更可能是pMTU大小)。