Node.js中的http.request和IPv6与IPv4

4
在node.js 4.x中,对于http.request函数,文档中表示:

选项

  • family:在解析主机和主机名时要使用的IP地址族。有效值为4或6。未指定时,将同时使用IP v4和v6。
family未指定时,node.js选择ipv6或ipv4的逻辑是什么?
据我所知,如果不指定它,则默认为或更喜欢ipv4,而浏览器(至少是Chrome)更喜欢ipv6。
有没有一种方法让node.js在可用时选择ipv6,还是我必须手动处理?
如果我要手动处理,应该怎么做?
  • 传入family: 6,如果超时则传入family: 4

  • 进行DNS请求并检查是否返回ipv6地址,然后设置家族?

1个回答

7

TL;DR: 看起来 Node 将这个任务交给了操作系统。

更详细的解释: http.request() 在底层使用了 net 模块。该模块如何处理 DNS 查询可以在 这里 找到:"如果家族不是 4 且家族不是 6,也没有提供特殊的 getaddrinfo hints,则默认将 dns.ADDRCONFIG 作为查询提示"

dns.ADDRCONFIG 的意思是:

返回的地址类型由当前系统支持的地址类型确定。例如,只有在当前系统配置了至少一个IPv4地址时才会返回IPv4地址。环回地址不被考虑。
这仍然没有说明IP地址选择的顺序,但据我所知,这取决于getaddrinfo的实现。
如果您同时拥有IPv6和IPv4接口,将执行两个DNS查询来查找主机名:IPv4的A记录和IPv6的AAAA记录。可能(但我猜测)第一个成功的查询将提供传递给Node的IP地址。
有没有办法让node.js在可用时选择ipv6,还是我必须手动处理?
看起来你不能从http.request()中做到这一点,所以是的,我认为你需要通过使用family: 6执行DNS请求来手动处理。

我不知道为什么,但它没有留给操作系统。getent hosts hostname返回IPv6地址,但是dns.lookup('hostname')将IPv4地址传递给回调函数。 - nert
1
@nert 我猜测解析器将针对您的 DNS 服务器执行 IPv4 查找,并仅针对 IPv6 部分使用 /etc/hosts - robertklep
为什么会这样呢?如果我将 { all: true } 传递给 dns.lookup,它就会解析所有地址,但是 IPv4 地址仍然排在第一位。所以我执行了 dig hostname ANY 命令,并以相同的顺序返回它们。因此看起来 Node 确实将其留给系统处理,只是其他程序有自己的首选项。所以现在我需要弄清楚剩下的部分。谢谢 ;) - nert

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接