2012-11-14 27 views
0

我正在爲IPv4和v6編寫一個PMTUD應用程序。我在Ubuntu 12.04上做了這個,但是我想盡可能使它與操作系統無關,這就是我偶然發現問題的地方。使用BSD套接字的IPv6碎片化

默認情況下,IPv6數據包被髮送方分割,我不知道如何關閉此行爲。我發現了一些套接字選項,比如IPV6_MTU_DISCOVER和IPV6_DONTFRAG,但是我在linux/in6.h下找到了這些選項,這對我使用netinet標頭族沒有幫助,它們都不在netinet/in.h下 - 儘管IPV6_MTU_DISCOVER應該是根據this。我錯過了什麼嗎?

編輯:讓我澄清一點。 我有一個socket(AF_INET6,SOCK_RAW,IPPROTO_ICMPV6),我希望發送一個這樣大小的ICMPv6數據包,我會收到一個回覆​​,告訴我它太大了,從那個回覆我將得到路徑MTU。 但是,要真正獲得沿整個路徑的MTU,我還必須考慮傳出設備的MTU。

我使用miredo來隧道IPv6,其具有最小尺寸的設定MTU,例如, 1280.發送一個大於1280的數據包將導致所述數據包碎片化(這一行爲我在Wireshark中觀察到),但我需要使用REFUSE的套接字發送數據包並通知我,而不是將其分段。

+0

你能解釋一下你想做什麼嗎?當你說「默認情況下,IPv6數據包被髮送方分割」時,數據包大小是多少?什麼是鏈路MTU?你使用的是什麼套接字選項? –

+0

你使用什麼類型的套接字發送數據?聽起來你正在使用IPv6 Raw套接字來獲取MTU,然後使用SOCK_STREAM傳輸實際數據。這將不起作用,因爲SOCK_STREAM套接字將爲您執行碎片。 – Jeff

回答

-2

IPv6數據包得到由默認

號TCP數據包獲得默認由發送者和中間路由器分段分段由發送者。

,我不知道如何關閉此行爲。

不能將其關閉。你當然可以嘗試,但唯一的結果將是未交付。如果路由器需要對數據包進行分段並且您不允許,則它將會丟棄數據包。但是,發送主機也需要分段,以適應路徑MTU,並且無法停止。如果您正確地寫入接收器,即期望它正在讀取字節流而不是離散消息,那麼對於數據包是否在傳輸過程中進行分段處理應該沒有什麼影響。

+0

更新了問題,也許我解釋得很糟糕。未送達是期望的結果 - 我需要發送主機放棄數據包,並告訴我這樣做,而不是分段以適應MTU。如果我沒有弄錯的話,那是PMTUD的重點。 – user742925

+0

編號路由器只對第3層起作用,因此在傳統IPv4上或在現代IPv6上,從不在TCP上。這是完全可能的(並且對於調試應用程序來說是完全合理的)通過爲IPv4指定不分段來自己做到這一點。無論如何,IPv6永遠不會被中間路由器碎片化。 –

3

你不需要自己做這個。 MTU發現應該會自動發生。作爲這個的副作用,路徑上的所有設備都必須允許ICMP V6數據包通過。