确定何时尝试IPv6连接以及何时使用IPv4

caf*_*caf 9 networking ipv6

我正在研究连接到用户指定的公共服务器的网络客户端程序.如果用户给我一个连接的主机名,它同时具有IPv4和IPv6地址(通常是包含两者AAAAA记录的DNS名称),我不知道应该如何决定应该连接哪个地址.

问题是,机器支持IPv4和IPv6是很常见的,但只能通过IPv4实现全局连接.最常见的情况是仅配置IPv6链路本地地址.目前我能想出的最佳选择是:

  1. 首先尝试IPv6地址 - 如果连接失败,请尝试IPv4地址; 要么
  2. 只需让用户将其指定为配置设置("prefer_ipv6"与"prefer_ipv4").

我可以通过选项1看到的问题是连接可能不会立即失败 - 可能需要很长时间才能超时.

Mar*_*wis 9

请尝试IPv6.在绝大多数安装中,如果由于某种原因无法成功,尝试创建IPv6连接将立即失败:

  • 如果系统不支持IPv6套接字,则创建套接字将失败
  • 如果系统支持IPv6,并且配置了链路本地地址,则不会有全局IPv6地址的任何路由表条目.同样,本地内核将报告故障而不发送任何数据包.
  • 如果系统确实具有全局IP地址,但缺少路由所需的某些链接,则源应该收到ICMPv6错误消息,指示无法到达目标; 同样,如果目的地有IPv6地址,但服务没有收听它.

当然,事情可能会中断,例如,如果配置了全局(或隧道)地址,并且错误地过滤掉了ICMPv6错误消息.你不应该担心这种情况 - 也可能是因为IPv4连接在某种程度上被破坏了.

当然,这是值得商榷的你是否真的需要尝试IPv6地址第一 -你还不如尝试一下第二.通常,您应该按照从getaddrinfo返回的顺序尝试地址.今天,系统支持配置选项,让管理员决定从getaddrinfo返回地址的顺序.


Ste*_*e-o 5

在提出这个问题之后,IETF 已经用RFC6555(又名Happy Eyeballs)提出了这个问题的答案。

相关点是客户端和服务器可能都具有 IPv4 和 IPv6,但中间的一跳可能没有,因此不可能可靠地预测哪条路径将起作用。