在实现c# Tcp穿孔时出现错误-不能在NAT后连接

本文关键字:不能 NAT 连接 错误 实现 Tcp 穿孔 | 更新日期: 2023-09-27 18:16:04

我有一个带有公共Ip地址的服务器和一个用c#语言实现的NAT后面的客户端机器。我试图编程一个tcp孔打孔,但从服务器到客户端制作套接字时出现错误。我的步骤如下:

1)首先,我建立一个套接字连接到公共服务器,并向它发送消息,并开始监听端口17000

2)第二,服务器得到消息并解析它

3)第三,我得到了remoteEndPoint IpAddress &端口号(=Nat路由器Ip &端口)

4)第4次尝试连接到套接字(NAT Ip, NAT端口)并从服务器发送消息到端口17000的客户端=>意味着=我已经创建了套接字到NAT路由器,并希望路由器将我的消息发送到NAT后的客户端

但是我得到了以下错误:"连接尝试失败,因为被连接方在一段时间后没有正确响应,或者由于连接的主机未能响应,已建立的连接失败"

谁能帮我解决这个问题?

在实现c# Tcp穿孔时出现错误-不能在NAT后连接

您的问题可能在这里:

和希望路由器将我的消息发送到nat后的客户端

Nat穿越(如打孔)取决于具体Nat的实现。您假设由于NAT看到了来自客户端端口17000的数据包,并将其映射到某个NAT端口X,那么它将从端口X转发所有数据包回客户端。并不是所有的国家都这样做!

From Microsoft Technet:

定义了以下类型的nat:

  • Cone NAT: NAT转换表项存储内部地址和端口号与外部地址和端口号的映射关系的NAT地址和端口号。一旦NAT转换表项进入地点,入站流量到外部的地址和端口号

  • Restricted NAT: NAT转换表项中存储了内部地址和端口号与公网地址的映射关系外部地址和端口号,用于特定的源地址或特定的源地址和端口号。一个入站数据包匹配外部目的地址的NAT转换表项地址和端口号来自一个未知的外部地址或端口

  • 对称NAT:根据网络的不同,将相同的内部地址和端口号映射到不同的外部地址和端口的NAT

你的冲孔方法将适用于锥体和地址受限的NATs。不用于端口限制的对称NAT的NAT(这可能是NAT在你的情况下)。