我有專有的應用程序向網絡發送組播數據包。它運行在帶有NIC MTU 1500的linux上。RecvFrom()返回大於發送方NIC的數據包MTU
然後我編寫一個簡單的java程序來使用MulticastSocket類來接收消息。我發現它是DatagramPacket大小是~7900。接收器程序在linux上運行,並使用NIC MTU 1500.
我用C重寫了程序並使用recvfrom()調用,但結果相同。
我不明白爲什麼?數據包大小是否受NIC MTU限制?或者它可以被程序覆蓋嗎?
我有專有的應用程序向網絡發送組播數據包。它運行在帶有NIC MTU 1500的linux上。RecvFrom()返回大於發送方NIC的數據包MTU
然後我編寫一個簡單的java程序來使用MulticastSocket類來接收消息。我發現它是DatagramPacket大小是~7900。接收器程序在linux上運行,並使用NIC MTU 1500.
我用C重寫了程序並使用recvfrom()調用,但結果相同。
我不明白爲什麼?數據包大小是否受NIC MTU限制?或者它可以被程序覆蓋嗎?
碎片和重新組裝發生在UDP協議下面的IP層,所以它基本上被隱藏起來了。您可以通過在不同的數據包大小上設置「不分段」標誌來測試分段。
我想你正在運行專有服務的機器上測試。在這種情況下,Linux機器將允許它們通過本地環回設備進行通信,該環回設備具有64k的MTU。
是否有可能內核碎片的數據包和組裝接收端?
How to find the largest UDP packet I can send without fragmenting?
然而,是它無論如何要知道包是支離破碎?
接收器是另一臺Linux服務器上運行,不能在同一服務器與發件人程序 – 2009-06-04 04:54:17
忘了補充答案:這一過程將需要調用setuid或setgid能夠改變MTU,但它是可能的。 – soulmerge 2009-06-04 04:59:38