2013-12-18 55 views
5

我使用常用​​教程移植了一個支持IPv6的應用程序。我決定只爲這兩種協議使用一個套接字偵聽器。現在我意識到我必須正確設置IPV6_V6ONLY(它只能在我的x86 Linux上開箱即用,而不是在我的ARM上)。針對IPv6和IPv4的套接字偵聽器

這真的是要走的路嗎?有人說IPV6_V6ONLY不應該使用(顯然它是過時的,因爲通過電纜的IPv4映射),有人說這兩種協議使用一個套接字是好的。

所以,我很困惑。關於這個問題的現狀是什麼?我誤解了這個問題嗎?

+0

澄清之處:V6ONLY影響軟件處理數據包的方式。它不影響導線上的位。在軟件方面,一切看起來像一個IPv6數據包。如果在網絡上它實際上是一個IPv4數據包,那麼軟件端使它看起來像一個IPv6數據包,並將IPv4地址映射到「:: ffff:」後接32位IPv4地址的IPv6地址。 V6ONLY只會在軟件中改變這一點。在電線上,他們是正常的IPv4和IPv6數據包。線路上永遠不會看到':: ffff:'地址。 –

+0

啊對了,thx澄清。所以它只在線路上被棄用,並且使用'IPV6_V6ONLY'是可能的。如果它支持或不支持,如何處理它是一個不同的討論:) – duedl0r

回答

4

您應該始終將兩個套接字顯式綁定,並將綁定的IPv6套接字與IPV6_V6ONLY綁定。

爲什麼?跨平臺兼容性。

Windows默認情況下要求您明確綁定IPv4和IPv6。僅綁定到IPv6也不會隱式綁定到IPv4。

只有當net.ipv6.bindv6only sysctl設置爲0時,默認情況下Linux纔會隱式綁定到IPv4。像Debian這樣的發行版將此默認值更改爲1,打破了您的假設。

我不記得Mac OS X在這裏做什麼(有人在評論中唧唧喳喳?),但重點是明確綁定到兩個協議並不意外。

+0

'net.ipv6.bindv6only'定義了默認值,如果我沒有使用setsocket設置。如果您在套接字上設置IPV6_V6ONLY,您可以覆蓋它,對嗎?我想知道這是否是邪惡的:)讓我們假設目前我只瞄準linux。 – duedl0r

+1

@ duedl0r最好不要默認;它可以改變,或者系統管理員可以改變它。最好始終明確綁定,或者通過設置用戶可配置的設置。 –

2

這兩種方法都很好。

如果明確綁定v4和v6,則需要設置IPV6_V6ONLY,否則,您需要清除它。默認設置因平臺而異。

某些平臺不支持在v6套接字上接受v4連接,所以爲了最大程度的兼容性,我會採用「雙套接字」方法。