【问题标题】:node.js http.request and ipv6 vs ipv4node.js http.request 和 ipv6 与 ipv4
【发布时间】:2026-02-08 01:20:17
【问题描述】:

在 node.js 4.x 中为函数 http.request the docs

选项

  • family:解析主机和主机名时使用的 IP 地址系列。有效值为 4 或 6。未指定时,将使用 IP v4 和 v6。

在不指定family的情况下node.js会选择ipv6还是ipv4背后的逻辑是什么?

据我所知,当我没有指定它时,它默认或更喜欢 ipv4,而浏览器,至少,chrome,更喜欢 ipv6

有没有办法让 node.js 在可用时选择 ipv6,还是我必须手动处理?

如果我要手动做应该怎么做?

  • 传入family: 6,如果超时则传入family: 4

  • 发出 DNS 请求并检查我是否获得了 ipv6 地址,然后设置家庭?

【问题讨论】:

    标签: node.js ipv6


    【解决方案1】:

    TL;DR: 似乎 Node 把这个留给了操作系统。

    更长的故事:http.request() 将在后台使用net 模块。可以找到该模块如何处理 DNS 查找 here: "如果家庭不是4 并且家庭不是6 并且没有特殊的getaddrinfo hints 提供,请使用dns.ADDRCONFIG作为默认查找提示”

    dns.ADDRCONFIG 表示:

    返回的地址类型由当前系统支持的地址类型决定。例如,仅当当前系统至少配置了一个 IPv4 地址时,才会返回 IPv4 地址。不考虑环回地址。

    这仍然没有说明选择 IP 地址的顺序,但据我所知,这留给getaddrinfo 的实现。

    AFAIK,如果您同时拥有 IPv6 和 IPv4 接口,将执行两个 DNS 查询来查找主机名:A 用于 IPv4,AAAA 用于 IPv6。可能(但我在这里猜测)第一个成功的查找将提供传递回 Node 的 IP 地址。

    有没有办法让 node.js 在可用时选择 ipv6,还是我必须手动处理?

    您似乎无法从 http.request() 执行此操作,所以是的,我认为您将不得不通过使用 family : 6 执行 DNS 请求来手动执行此操作。

    【讨论】:

    • 我找不到原因,但它并没有把它留给操作系统。 getent hosts hostname 返回 IPv6 地址,但 dns.lookup('hostname') 将 IPv4 地址传递给回调。
    • @nert 我的猜测是解析器将对您的 DNS 服务器执行 IPv4 查找,并且仅将 /etc/hosts 用于 IPv6 部分。
    • 为什么要这样做?如果我将{ all: true } 传递给dns.lookup,那么它会解析所有地址,但IPv4 仍然是第一个。所以我做了dig hostname ANY 并以相同的顺序返回它们。所以看起来节点真的确实把它留给系统,只是其他程序有自己的偏好。所以现在我需要弄清楚其余的。谢谢;)