目前我通过 IPv4 连接到互联网,我正在使用来自 sixxs.net 的隧道,并且我已经获得子网和一个分配给我的 eth0 接口的 IPv6。
因此,eth0 具有 IPv4 和 IPv6:
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UNKNOWN qlen 1000
link/ether 00:02:XX:XX:61:36 brd ff:ff:ff:ff:ff:ff
inet XXX.XXX.0.22/24 brd XXX.XXX.0.255 scope global eth0
inet6 2a01:XXXX:XXXX::1/64 scope global
valid_lft forever preferred_lft forever
当我尝试连接到某个已准备好 IPv6 的网站时,一切正常,IPv6 是首选,但如果发生某些情况并且 IPv6 不可用,我希望回退到 IPv4。这可能吗?
或者即使程序不支持(例如通过 -4 选项),是否可以暂时强制用户使用 IPv4 而不是 IPv6?
答案1
这应该已经发生了,因为它是(应该是)你的网络的默认行为。
然而,在实践中,有一两件小事可能会造成阻碍。具体操作如下:
假设您要访问某个 URL
www.kame.net
。您的 DNS 应该请求一个AAAA
以及一个A
记录。如果
AAAA
返回记录,则它会尝试连接到 IPv6 地址。如果无法建立连接(主机离线、IPv6 连接中断等)或者不
AAAA
存在记录,则使用 IPv4。
问题可能出现在以下情况:
配置不正确或旧的 DNS 服务器不返回
AAAA
地址,意味着永远不会使用 IPv6。配置不正确的 IPv6 网络(例如,具有可路由的 IPv6 地址(不是链路本地地址),但未发现 RA,或者 RA 不是实际上连接到互联网,则 TCP/IP 堆栈可能需要长达 90 秒的时间才会超时并故障恢复到 IPv4,从而导致其实际上毫无用处。
如果您正在编写自己的应用程序来执行自己的 DNS 查找,那么这也是您应该写入应用程序的行为。但是,如果情况也是如此,那么支持 IPv6 会比这更复杂一些(例如,我们基于 IPv4 构建的日志解析器有一个固定长度的 32 位 IP 地址字段。当然,当我们实现第一个 IPv6 网络时,这个字段就失效了)。