在实际的Java程序中使用IPv6

Dir*_*ker 7 java network-programming ipv6

IPv6使用现在正在慢慢开始,因此我目前正在修复和更新所有为IPv6做好准备的应用程序.

其中一个应用程序是Java编辑器JOSM(http://josm.openstreetmap.de/).即使操作系统使用IPv6,Java也不会在默认配置中使用IPv6.

http://docs.oracle.com/javase/1.5.0/docs/guide/net/ipv6_guide/#using 我设置java.net.preferIPv6Addresses,以true让它使用IPv6.关于互联网连接断开的结果是用户错误报告.

似乎Java只切换到使用IPv6地址而不是IPv4,但不做其他事情.我维护的所有基于C/C++的软件都已更改为检查并尝试所有可用的IP地址,因此只要其中一个地址有效,就会跳过损坏的IPv6(或IPv4)地址.对我来说,看起来Java只尝试一次,这在现实世界中不起作用.

当IPv6通过隧道传输时,OS通常也更喜欢IPv4而不是IPv6.看起来Java也忽略了这个设置.

所以我的问题是:在没有破坏IPv4用户的应用程序的情况下,有没有什么好方法可以让Java应用程序默认使用IPV6.

用户错误报告:http://josm.openstreetmap.de/ticket/8562,http://josm.openstreetmap.de/ticket/8627.

Mic*_*ton 0

所以你这里有两个问题:

  1. 操作系统供应商提供的操作系统带有损坏的默认 IPv6 配置,和/或用户启用了损坏的 IPv6 配置。

  2. 当它不起作用时,他们会错误地责怪你。

您可以在这里做两件事:

  1. 建议用户如何禁用不必要的和损坏的 IPv6 转换机制,例如 Teredo、ISATAP 和 6to4。这些说明在互联网上随处可见。

    如果某些操作系统供应商默认不启用这种垃圾,那就太好了,但这可能要求太多了。

  2. 在您的应用程序中实现 Happy Eyeballs ( RFC 6555 )。这就是现代网络浏览器解决这个问题的方式。

    Happy Eyeballs 指定了一种算法,应用程序通过该算法尝试(几乎)同时通过 IPv6 和 IPv4 进行连接,如果 IPv6 在短时间内无法工作,则返回到 IPv4 连接。该试验的结果也会被缓存几分钟。

    不幸的是,我对 Java 不太熟悉,无法为您提供特定代码来绕过 Oracle 默认情况下向您隐藏的所有有趣内容,但这应该是可行的。

  • @PetrBaudis 我两年前写的。从那时起我就了解到 Java 的网络,说得好听一点,就是一堆热气腾腾的垃圾。在任何其他语言中实现 Happy Eyeballs 都很容易,甚至可以简单地使用“getaddrinfo()”按顺序尝试每个地址,但在 Java 中这似乎是不可能的。我不确定是否有一个好的答案可以让程序继续用 Java 编写。 (2认同)