【问题标题】:Browser shows IPv6, yet query returns IPv4 -- why?浏览器显示 IPv6,但查询返回 IPv4——为什么?
【发布时间】:2015-09-12 03:04:19
【问题描述】:

一点上下文:为了学习/练习,我正在开发一个网络应用程序,我注意到只有当我向公共 IP 为 IPv4 的人提供 IPv4 地址时,套接字才会正确打开,而对于那些公共 IP 为 IPv6 的人,套接字才会正确打开是 IPv6。

我想通过使用与以下类似的东西来选择正确的过滤器:

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.IOException;
import java.net.URL;
import java.net.MalformedURLException;

public class Test {
    public static void main(String[] args) throws MalformedURLException, IOException { 
        BufferedReader ipTypeChecker = new BufferedReader(
            new InputStreamReader(
                new URL("https://wtfismyip.com/text").openStream()
            )
        );

        System.out.println(ipTypeChecker.readLine());
    }
}

如果我只是简单地 google 我的 ip 是什么,转到 this pagethis page,我的 IP 显示为 IPv6 地址,但如果我使用上面的代码查询这些页面,它会返回一个 IPv4 地址,为什么?

当然,如果我遇到XY problem 的问题,请随时指出我哪里出错了。

【问题讨论】:

  • 不要试图猜测网络架构。许多系统同时具有 IPv4 和 IPv6,或者位于 NAT64 网关之后,或者......等等......让您的应用程序在任何环境中都表现良好。

标签: java sockets networking ipv6 ipv4


【解决方案1】:

根据the documentation,如果两者都可用,Java 更喜欢 IPv4 地址而不是 IPv6 地址:

java.net.preferIPv6Addresses(默认:false)

如果 IPv6 在操作系统上可用,则默认首选项是首选 IPv4 映射地址而不是 IPv6 地址。这是出于向后兼容性的原因...

目标主机有两种地址:

wtfismyip.com.          3600    IN      AAAA    2604:4300:a:2c::1:1
wtfismyip.com.          3600    IN      A       69.30.217.90

这意味着 Java 将选择 IPv4 地址。浏览器通常会更喜欢 IPv6。

【讨论】:

    猜你喜欢
    • 2011-03-08
    • 1970-01-01
    • 2017-11-01
    • 2011-11-17
    • 2018-11-29
    • 1970-01-01
    • 1970-01-01
    • 2020-07-18
    • 2018-07-14
    相关资源
    最近更新 更多