node.js http.request和ipv6与ipv4

在node.js 4.x的函数http.request 文档说

选项

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

当没有指定family时,node.jsselectipv6或ipv4的逻辑是什么?

据我可以告诉什么时候我不指定它默认是或更喜欢ipv4,而浏览器,至less铬,更喜欢ipv6

有没有办法让node.jsselectipv6可用时,还是我必须手动?

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

  • 通过family: 6 ,如果超时然后通过family: 4

  • 做一个DNS请求,并检查我是否得到一个ipv6地址,然后设置家庭?

TL; DR: Node似乎将这一切留给了操作系统。

更长的故事: http.request()将使用引擎盖下的net模块。 这个模块如何处理DNS查找可以在这里find: “如果family不是4 ,family不是6 ,并且没有提供特殊的getaddrinfo 提示 ,则使用dns.ADDRCONFIG作为默认查找提示

dns.ADDRCONFIG意思是:

返回的地址types由当前系统支持的地址types决定。 例如,如果当前系统至lessconfiguration了一个IPv4地址,则仅返回IPv4地址。 不考虑环回地址。

这仍然没有说什么IP地址将被挑选的顺序 ,但据我所知,这是留给执行getaddrinfo

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

有没有办法让node.jsselectipv6可用时,还是我必须手动?

它看起来不像你可以从http.request()这样做,所以是的,我想你将不得不通过执行一个family : 6的DNS请求手动family : 6