这个谈话有解决办法。总结;
- 有时,DNS 查找或与已解析地址的后续连接存在问题
- 您不想在连接到 IPv4 地址之前等待连接到 IPv6 地址超时,反之亦然
- 您不想在查找 A 记录之前等待查找 AAAA 记录超时,反之亦然
- 您不希望在等待 AAAA 和 A 记录之前停止,然后再尝试连接您首先返回的任何记录。
解决方案是同时独立地查找 AAAA 和 A 记录,并独立连接到已解析的地址。首先使用任何连接成功。
执行此操作的最简单方法是允许网络 API 使用按名称连接网络 API 为您执行此操作。例如,在 Java 中:
InetSocketAddress socketAddress = new InetSocketAddress("www.example.com", 80);
SocketChannel channel = SocketChannel.open(socketAddress);
channel.write(buffer);
幻灯片说明在这一点上说:
在这里,我们从主机和端口创建了一个名为 InetSocketAddress 的不透明对象,然后当我们打开该 SocketChannel 时,它可以在幕后完成,做任何必要的事情,而应用程序永远不会看到 IP 地址。
Windows 也有按名称连接的 API。我这里没有代码片段。
现在,我并不是说这些 API 的所有实现都必须在今天做正确的事情,但如果应用程序正在使用这些 API,那么随着时间的推移,这些实现可以得到改进。
与 getaddrinfo() 和类似 API 的不同之处在于,它们从根本上无法随着时间的推移而改进。API 的定义是他们返回给你一个完整的地址列表,所以他们必须等到他们有完整的列表才能给你。getaddrinfo 无法返回部分列表,然后再给您更多。