为什么Google会捕获与我的TcpListener不同的IP地址?

时间:2017-02-24 20:20:09

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

我有一个非常简单的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....

enter image description here

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

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

enter image description here

2 个答案:

答案 0 :(得分:9)

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

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

enter image description here

请注意第一个结果 - 2a00:1450:4001:821::2004。这是一个IPv6地址,这是您的操作系统在访问www.google.com时尝试连接的第一个地址,因为现代操作系统更喜欢IPv6 over 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

答案 1 :(得分:1)

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

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