2010-09-14 74 views
12

我想了解一些行爲,我看到在發送UDP數據包的情況下。UDP IP分段和MTU

我有兩個小Java程序:一個傳輸UDP數據包,另一個接收它們。我在兩臺通過一臺交換機連接的計算機之間的網絡上本地運行它們。

兩個網絡適配器上的MTU設置(由/ sbin/ifconfig報告)均爲1500。

  • 如果我發送大小爲< 1500的數據包,我會收到它們。預期。
  • 如果我有1500 <大小< 24258我收到他們發送數據包。預期。我已經通過wireshark證實IP層將它們分解。
  • 如果我發送的數據包大小爲> 24258,他們都將丟失。沒有預期的是當我在接收端運行wireshark時,我沒有看到任何這些數據包。

我能夠看到與ping -s類似的行爲。

ping -s 24258 hostA的作品,但

ping -s 24259 hostA失敗。

有誰瞭解可能發生的情況,或者有什麼我應該尋找的想法?

兩臺計算機正在運行CentOS 5的64位。我使用1.6 JDK,但我並不認爲這是一個編程問題,它是一個網絡或操作系統問題。 IP協議的

+0

你可能有更好的運氣問這在serverfault.com。 – 2010-09-14 19:27:27

+3

wireshark在連接的發送端顯示「size> 24258」的數據包是什麼? – 2010-09-14 19:31:01

+1

@Kaleb我不是wireshark專家,但發送端的捕獲看起來是相同的,無論數據包大小是>還是<24258.我看到分段的IP數據包,但我只看到UDP數據包的小數據包(我有非常小和非常大的數據包的組合)。我發送的數據是二進制數據,因此很難弄清楚哪些IP數據包屬於哪個UDP數據包。我可能會嘗試使用更可預測的數據進行更簡單的測試,並查看wireshark演示。但是直到明天我纔會明白。 @ire_and_curses,謝謝我不確定什麼serverfault完全包含。我可能會在那裏嘗試。 – wolfcastle 2010-09-14 20:42:58

回答

10

實現不要求能夠處理任意大的數據包。理論上,最大可能的IP數據包大小爲65,535個八比特組,但標準只要求實現支持至少576個八比特組。

看起來你的主機的實現支持的最大尺寸遠遠大於576,但仍然明顯小於最大理論尺寸65,535。 (我不認爲交換機應該是一個問題,因爲它不需要做任何碎片整理 - 它甚至不在IP層運行)。

IP標準還建議主機不要發送大於576字節的數據包,除非他們確定接收主機可以處理更大的數據包大小。你應該考慮一下,你的程序發送一個更小的數據包大小是否會更好。 24,529對我來說似乎非常大。我認爲可能有很多主機不會處理那些很大的數據包。

請注意,這些數據包大小限制完全與MTU(數據鏈路層協議支持的最大幀大小)分開。

+1

我不知道實現可能有一個較小的最大數據包大小。你知道如何確定這個值是什麼嗎? 我同意24k是一個非常大的尺寸,我可能不會在部署的系統中發送那麼大的數據包,我只是在測試過程中遇到了這個問題。我可以完全控制部署系統中的網絡(所有計算機/交換機/路由器)。我們使用千兆位以太網,所以如果我們也使用巨型幀,我會收集數據包大小爲9000(UDP頭+有效載荷),而無需IP層分片。 – wolfcastle 2010-09-15 15:41:57

5

我發現這可能是利益的情況如下:

丹的答案很有用,但是請注意,在標題之後,您確實限制爲65507字節。