【问题标题】:Why does google captures a different IP address than my TcpListener?为什么 google 捕获的 IP 地址与我的 TcpListener 不同?
【发布时间】:2017-07-15 19:30:20
【问题描述】:

我有一个非常简单的 http 服务器:

TcpListener server = new TcpListener(System.Net.IPAddress.Any, 80);
server.Start();
var client = server.AcceptTcpClient();
var ip = client.Client.RemoteEndPoint;
// ip address in here is: 166.72.162.85

// etc. read request and write response....

我正在使用连接到 AT&T 3G 网络的手机发出该请求。而我的服务器检测到ip地址166.72.162.85

现在这是我的问题。我问这个问题主要是为了学习。为什么谷歌捕获了不同的IP地址? 如何使用我的 TcpListener 捕获 2600:387:9:3::c7?

【问题讨论】:

    标签: c# network-programming ip-address ipv6 httplistener


    【解决方案1】:

    看起来您在双堆叠网络上 - 您同时拥有 IPv4 和 IPv6 连接,这有点像同时连接到两个独立的“互联网”。

    您的服务器可能只能从这些“互联网”之一访问 - IPv4 互联网。两者都可以访问 Google。我们可以通过将www.google.com 解析为 IP 地址来轻松检查。这是我机器上的结果:

    注意第一个结果 - 2a00:1450:4001:821::2004。这是一个 IPv6 地址,这是您的操作系统在访问 www.google.com 时尝试连接的第一个地址,因为现代操作系统更喜欢 IPv6 而不是 IPv4。因此,您与 Google 的连接通过 IPv6 进行,这将看到您来自您的 IPv6 地址 (2600:387:9:3::c7)。

    当连接到您的纯 IPv4 服务器时,连接是通过 IPv4 进行的 - 从您的 IPv4 地址(166.72.162.85)到服务器的 IPv4 地址。

    要使用 IPv6 访问您的服务器,您需要使其可以通过 IPv6 访问:

    • 运行服务器的计算机必须具有公共 IPv6 地址
    • 客户端必须直接通过其 IPv6 地址或具有AAAA record 的域名(这是 IPv6 地址的 DNS 记录)访问机器
    • 最重要的是,您需要确保您的服务器软件绑定到机器的 IPv6 地址。您的代码绑定到System.Net.IPAddress.Anywhich is equivalent to 0.0.0.0,意思是“任何 IPv4 地址”。相反,您需要绑定到IPAddress.IPv6Any,它等同于0:0:0:0:0:0:0:0(或::),意思是“任何IPv6 地址”。

    顺便说一句,您可以尝试通过https://ipv4.google.com/ 从仅限 IPv4 的 Google 获取您的 IP。它应该返回与您在服务器中看到的相同的 166.72.162.85

    【讨论】:

      【解决方案2】:

      Google 显示的是 IPv6 地址,您的代码显示的是 IPv4。

      请注意,您还可以在接收端看到不同的 IP,具体取决于流量到达那里的路由,例如,如果涉及代理,您会看到代理的 IP,而不是源的实际 IP。

      【讨论】:

      • 如何使用我的代码捕获 IPv6?那就是说我的手机有两个ip?我对 IPv6 知之甚少
      • 我看到链接显示了答案。直到明天我才能给你积分:/。感谢您的帮助!
      • 仅仅更改代码可能还不够。 OP 必须确保绑定到 IPv6 地址,并连接到服务器的 IPv6 地址。
      猜你喜欢
      • 2018-09-23
      • 2021-01-03
      • 1970-01-01
      • 1970-01-01
      • 2015-06-09
      • 1970-01-01
      • 2021-11-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多