node.js http.request and ipv6 vs ipv4



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

选项

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

当未指定family时,node.js选择ipv6或ipv4的逻辑是什么?

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

有没有办法让node.js在可用时选择ipv6,或者我必须手动使用?

如果我要手动操作,该怎么办?

  • family: 6中通过,如果超时,则在family: 4中通过?

  • 发出DNS请求,检查我是否能拿回ipv6地址,然后设置家庭?

TL;DR:看来Node将此问题留给了操作系统。

长话短说:http.request()将在引擎盖下使用net模块。该模块如何处理DNS查找可以在此处找到:"如果系列不是4,系列也不是6,并且没有提供特殊的getaddrinfo提示,则使用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请求来手动做到这一步。

最新更新