Jer*_*ner 23 networking ipv6 setsockopt
在IPv6网络中,IPV6_V6ONLY标志用于确保套接字仅使用IPv6,特别是IPv4-to-IPv6映射不会用于该套接字.在许多操作系统上,IPV6_V6ONLY默认情况下未设置,但在某些操作系统(例如Windows 7)上,默认情况下会设置.
我的问题是:引入这面旗帜的动机是什么?是否存在导致问题的IPv4-to-IPv6映射,因此人们需要一种方法来禁用它?在我看来,如果有人不想使用IPv4到IPv6的映射,他们可能根本就没有指定IPv4映射的IPv6地址.我在这里错过了什么?
Ein*_*ein 11
并非所有支持IPv6的平台都支持双栈套接字,因此问题变成了需要最大限度地提高IPv6兼容性的应用程序如何知道支持双栈还是不分离绑定?唯一的通用答案是IPV6_V6ONLY.
忽略IPV6_V6ONLY或在具有双栈功能的IP堆栈之前写入的应用程序可能会发现在双栈环境中与V4分离的绑定失败,因为IPv6双栈套接字绑定到IPv4以防止IPv4套接字绑定.由于协议或应用程序级别寻址问题或IP访问控制,应用程序也可能不期望IPv4 over IPv6.
这种或类似的情况很可能促使MS等人默认为1,即使RFC3493声明0为默认值.1理论上最大化向后兼容性.特别是Windows XP/2003不支持dualstack套接字.
还有一些应用程序不缺少,遗憾的是需要传递较低层信息才能正常运行,因此该选项对于规划最符合要求和现有代码库的IPv4/IPv6兼容性策略非常有用.
最常提到的原因是服务器具有某种形式的 ACL(访问控制列表)的情况。例如,想象一个具有如下规则的服务器:
Allow 192.0.2.4
Deny all
Run Code Online (Sandbox Code Playgroud)
它在 IPv4 上运行。现在,有人在具有 IPv6 的计算机上运行它,并且根据某些参数,IPv4 请求在 IPv6 套接字上被接受,映射为 ::192.0.2.4,然后不再与第一个 ACL 匹配。突然间,访问将被拒绝。
无论操作系统有什么默认设置,在应用程序中明确显示(使用 IPV6_V6ONLY)都可以解决问题。
我不知道为什么它会是默认的;但这是我总是会明确放置的标志,无论默认值是什么。
关于它为什么存在,我猜想它允许您保留现有的纯 IPv4 服务器,并在同一端口上运行新服务器,但仅用于 IPv6 连接。或者,新服务器可以简单地将客户端代理到旧服务器,从而使 IPv6 功能轻松轻松地添加到旧服务中。