2014-02-15 72 views
2

我發出找到MTU值從我的Linux主機在我的服務器:爲什麼java發送一個大小超過最大MTU大小的tcp包並且工作正常?

ping -s 1312 my.sever.com --> 100% successful 
ping -s 1313 my.sever.com --> 100% failed 

所以,我認爲我的最大MTU是1340(1312 + 28)。

但是,當我從我的java客戶端捕獲到該服務器的http文章時,我可以在wireshark中看到一個大小爲的tcp包,整個請求/響應成功。

4 0.054168000 my.ip -> server.ip TCP 1354 80 59060 [TCP segment of a reassembled PDU] 

我想知道如何在封裝尺寸>最大MTU尺寸的情況下取得成功?

謝謝,

+1

碎片? –

+0

通過閱讀_「重組PDU」_我認爲它是確實的碎片。 –

+0

Java與它無關。 Java不能控制TCP段或IP數據包的大小。 – EJP

回答

2

因特網協議實現數據報分段,分解成更小的碎片,從而使數據包可以形成能夠以更小的最大傳輸單元通過節點比原來的數據報大小。在路由器接收的協議數據單元比下一跳的MTU大的情況下,它有兩個選項:刪除PDU和發送ICMP消息,該消息指示所述條件包太大,或片段的IP包。

0

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

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

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

相關問題