我正在爲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的套接字發送數據包並通知我,而不是將其分段。
你能解釋一下你想做什麼嗎?當你說「默認情況下,IPv6數據包被髮送方分割」時,數據包大小是多少?什麼是鏈路MTU?你使用的是什麼套接字選項? –
你使用什麼類型的套接字發送數據?聽起來你正在使用IPv6 Raw套接字來獲取MTU,然後使用SOCK_STREAM傳輸實際數據。這將不起作用,因爲SOCK_STREAM套接字將爲您執行碎片。 – Jeff