【问题标题】:Will getaddrinfo() return IPv6 addresses first?getaddrinfo() 会先返回 IPv6 地址吗?
【发布时间】:2012-06-28 09:06:46
【问题描述】:

我想使用 getaddrinfo() 读取所有地址(IPv4 和 IPv6)。 我的问题是 getaddrinfo() 是否在列表中返回 IPv6 地址,后跟 IPv4。 假设我将 AF_UNSPEC 传递给 getaddrinfo() 并使用双堆栈。

【问题讨论】:

  • 测试时它会做什么?文件怎么说?答案可能是“无法保证输出的顺序”。
  • 目标地址排序规则在RFC 3484 的第6 节中有详细说明,但我不确定典型的getaddrinfo() 实现是否真的遵循这一点。这些规则需要预测内核将使用哪个源地址来到达特定的目标地址,而这又取决于查询内核以获取实际可用的源地址列表并找出内核的源地址选择算法是如何定制的. getaddrinfo() 真的做到这些了吗?

标签: ipv6 getaddrinfo


【解决方案1】:

正如 Celada 已经评论的那样,RFC 3484 给出了返回结果的建议顺序。

特别是对于 GNU libc,可以通过/etc/gai.conf 控制顺序并自定义为本地策略。

【讨论】:

    【解决方案2】:

    答案就在这里:

    https://www.rfc-editor.org/rfc/rfc6724

    操作系统应该(并且大多数情况下)遵循这个标准或它的先前版本。当getaddrinfo() 选择目标地址时,如果应用程序没有绑定到特定地址,内核会选择源地址。

    默认情况下,全局本地 IPv6 地址优先于所有 IPv4 地址。

    【讨论】:

      【解决方案3】:

      这实际上取决于名称服务器和操作系统。 getaddrinfo() 从名称服务器获取 dns 解析信息。如果您的名称服务器在 IPv4 地址之前排序 IPv6 地址,它将在 IPv4 地址之前返回 IPv6 地址。

      默认情况下,IPv6 地址的优先级高于 IPv4 地址。 @Pavel Simerda 写道-“默认情况下,全球本地 IPv6 地址优先于所有 IPv4 地址。”

      【讨论】:

        猜你喜欢
        • 2010-12-16
        • 1970-01-01
        • 2018-02-10
        • 1970-01-01
        • 2012-02-03
        • 1970-01-01
        • 2022-01-16
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多