绑定套接字是否确保它的端口始终相同?

时间:2012-01-30 18:42:04

标签: c# sockets

我发现互联网上有关套接字的信息很少。也许是因为我的搜索策略。

将套接字绑定到操作系统/ NAT选择的端点(实际选择的是什么?),确保使用它发送的数据包始终具有相同的源端口?

例如,如果我要创建套接字并将其绑定到Windows选择的端口(即传递新的IPEndPoint(IPAddress.Any,0))然后将两个数据包发送到不同的主机,那么这两个数据包的源端口是一样的吗?

如果是,什么是“NAT端口随机化”?我听说它让NAT为你发送数据的每个主机选择一个新的端口......是这样吗?

2 个答案:

答案 0 :(得分:2)

  

例如,如果我要创建套接字并将其绑定到Windows选择的端口(即传递新的IPEndPoint(IPAddress.Any,0))然后将两个数据包发送到不同的主机,那么这两个数据包的源端口是一样的吗?

让我们说你绑定到特定端口(甚至端口0 - 的本地PC计算机上 - 这样操作系统会为你选择一个端口)。离开PC的所有数据包都将具有相同的源端口。保证。

但NAT - 可能会做一些完全不同的事情。 NAT肯定会将IP地址转换为分配的外部IP地址。而“源端口”将进行“映射”翻译。

大多数(但不是全部)表现良好 NAT会尝试执行以下操作。这不包括通过用户可能手动或通过UPNP设置的端口转发规则设置的行为。

  1. 在重新传输UDP或建立TCP连接时,某些NAT会尝试将内部主机的源端口“映射”到相同的端口值。如果同一NAT后面的另一台主机已经在使用该端口,则并非总是可行。在这种情况下,选择另一个端口。

  2. 对于出站TCP连接,端口映射将在出站SYN数据包离开NAT时发生。源端口映射将在TCP连接的生存期内保持一致。

  3. 如果NAT后面的主机将连续的UDP数据包发送到给定内部的相同的远程IP:端口对,则表现良好的NAT将保持相同的端口映射。也就是说,源端口保持不变。

  4. 大多数表现良好的NAT将保持相同的源端口映射,而与目标IP或目标端口无关。也就是说,如果NAT后面的PC将UDP数据包从本地端口3000发送到两个不同的IP:端口地址,则NAT将转换源端口相同。这称为“地址无关映射”,是与NAT后面的其他主机建立P2P连接的重要特性。

  5.   

    如果是,什么是“NAT端口随机化”?我听说它让NAT为你发送数据的每个主机选择一个新的端口......是这样吗?

    有些NAT表现不佳。他们遇到的主要错误是:

    当NAT维护“地址和端口依赖”映射(也称为“对称NAT”)时。这是NAT为NAT后面的主机与之通信的每个唯一IP:端口对选择随机源端口的位置。因此,两个主机(在不同的对称NAT之后)在没有中继服务的情况下彼此通信变得非常困难。我被告知大多数通过3G进行通信的移动设备都会出现这种情况。

    一些表现不佳的NAT甚至会嗅探数据包的数据,寻找可能包含内部IP地址的协议,然后尝试“修复”数据包,使得在数据包数据中传输的内部IP地址为现在是外部IP地址。这解决了FTP等传统协议的问题。但对于其他应用程序,这可能会产生更多问题。

    有一组用于遍历NAT的技术。请阅读STUNTURNICE

答案 1 :(得分:1)

绑定用于打开用于在计算机上侦听的端口。例如,Web服务器绑定到端口80,因此到端口80的所有传入数据包都访问该服务。它本质上是一种为操作系统中的服务保留端口的方法。所以从这个意义上讲,您的源端口将是您绑定的端口。如果您是访问该服务的人,则通常根本不绑定,因为您使用的是哪个端口并不重要,只有您要连接的端口。

希望能回答你的问题。如果没有,我想我不应该理解这个帖子。