【问题标题】:Socket listener for IPv6 and IPv4IPv6 和 IPv4 的套接字侦听器
【发布时间】:2014-01-06 14:27:03
【问题描述】:

我使用流行的教程移植了一个支持 IPv6 的应用程序。我决定对这两种协议只使用一个套接字侦听器。现在我意识到我必须正确设置IPV6_V6ONLY(它只适用于我的 x86 linux 开箱即用,但不适用于我的 ARM)。

这真的是要走的路吗?有人说不应该使用 IPV6_V6ONLY(显然它已经过时了,因为 IPv4 映射在网络上),有人说为两种协议使用一个套接字很好。

所以,我很困惑。这个问题的现状如何?我是不是理解错了问题?

【问题讨论】:

  • 澄清一点:V6ONLY 会影响软件处理数据包的方式。它不会影响电线上的位。在软件方面,一切看起来都像一个 IPv6 数据包。如果在网络上它实际上是一个 IPv4 数据包,那么软件端使它看起来像一个 IPv6 数据包,并将 IPv4 地址映射到 IPv6 地址,即::ffff:,后跟 IPv4 地址的 32 位。 V6ONLY 仅在软件中对此进行更改。在网络上,它们是普通的 IPv4 和 IPv6 数据包。 ::ffff: 地址永远不会在网络上看到。
  • 啊,对,谢谢你的澄清。所以它只在网络上被弃用,使用IPV6_V6ONLY 是可能的。如果支持或不支持如何处理它是一个不同的讨论:)

标签: c++ sockets ipv6 ipv4


【解决方案1】:

无论哪种方式都很好。

如果显式绑定v4和v6,需要设置IPV6_V6ONLY,否则需要清除。默认设置因平台而异。

某些平台不支持在 v6 套接字上接受 v4 连接,因此为了获得最大的兼容性,我会采用“双套接字”方法。

【讨论】:

    【解决方案2】:

    您应该始终显式绑定两个套接字,IPv6 套接字与IPV6_V6ONLY 绑定。

    为什么?跨平台兼容性。

    默认情况下,Windows 要求您明确绑定 IPv4 和 IPv6。仅绑定到 IPv6 也不会隐式绑定到 IPv4。

    默认情况下,当您在 IPv6 上绑定时,Linux 也会隐式绑定到 IPv4,前提是 net.ipv6.bindv6only sysctl 设置为 0。 Debian 等发行版将此默认值更改为 1,这打破了您的假设。

    我不记得 Mac OS X 在这里做了什么(请在 cmets 中有人唧唧喳喳?),但关键是明确绑定到这两种协议不会让人感到意外。

    【讨论】:

    • net.ipv6.bindv6only 定义默认值,如果我不使用 setsocket 设置它。如果您在套接字上设置 IPV6_V6ONLY ,您可以覆盖它,对吗?我想知道这是否是邪恶的 :) 让我们暂时假设我只针对 linux。
    • @duedl0r 最好不要假设默认值;它可以更改,或者系统管理员可以更改它。最好始终显式绑定,或者通过用户可以设置的可配置设置。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-06-09
    • 2015-03-05
    • 1970-01-01
    • 2017-09-03
    • 1970-01-01
    • 2012-07-27
    • 2016-11-19
    相关资源
    最近更新 更多