绑定套接字是否可以确保其端口始终相同?

2024-01-02

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

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

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

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


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

假设您在本地 PC 计算机上绑定到特定端口(甚至端口 0 - 以便操作系统为您选择一个端口)。所有离开 PC 的数据包都将具有相同的源端口。有保证。

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

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

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

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

  3. 如果 NAT 后面的主机向该地址发送连续的 UDP 数据包相同的远程IP:端口对在给定的内部,行为良好的 NAT 将维护相同的端口映射。即源端口保持不变。

  4. 大多数表现良好的 NAT 将维护相同的源端口映射,无论目标 IP 或目标端口是什么。也就是说,如果 NAT 后面的 PC 将 UDP 数据包从本地端口 3000 发送到两个不同的 IP:port 地址,NAT 会将源端口转换为相同的。这称为“地址独立映射”,是与可能位于 NAT 后面的其他主机建立 P2P 连接的一个重要特征。

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

有些 NAT 表现得不太好。他们的主要错误是:

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

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

有一套穿越 NAT 的技术。请阅读STUN http://en.wikipedia.org/wiki/STUN, TURN http://en.wikipedia.org/wiki/TURN, and ICE http://en.wikipedia.org/wiki/Interactive_Connectivity_Establishment.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

绑定套接字是否可以确保其端口始终相同? 的相关文章

随机推荐