gpt4 book ai didi

c# - 绑定(bind)套接字是否确保其端口始终相同?

转载 作者:行者123 更新时间:2023-12-03 11:58:33 24 4
gpt4 key购买 nike

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

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

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

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

最佳答案

For example if I were to create socket and bind it to a port chosen by Windows (i.e. pass new IPEndPoint(IPAddress.Any, 0)) and then send two packets to different hosts, will the source port of the two packets be the same?



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

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

大多数,但不是全部, 表现良好 NAT 将尝试执行以下操作。这不包括通过用户可能手动或通过 UPNP 设置的端口转发规则设置的行为。
  • 某些 NAT 在重传 UDP 或建立 TCP 连接时会尝试将内部主机的源端口“映射”到相同的端口值。如果同一 NAT 后面的另一台主机已经在使用该端口,这并不总是可行的。在这种情况下,选择另一个端口。
  • 对于出站 TCP 连接,端口映射将在出站 SYN 数据包离开 NAT 时发生。源端口映射将在 TCP 连接的整个生命周期内保持一致。
  • 如果 NAT 后面的主机连续发送 UDP 数据包到 相同的远程 IP:端口对 在给定的内部,表现良好的 NAT 将保持相同的端口映射。也就是说,源端口保持不变。
  • 大多数表现良好的 NAT 将保持相同的源端口映射,而与目标 IP 或目标端口无关。也就是说,如果 NAT 后面的 PC 将 UDP 数据包从本地端口 3000 发送到两个不同的 IP:port 地址,则 NAT 会将源端口转换为相同的。这称为“地址无关映射”,是与可能位于 NAT 后面的其他主机建立 P2P 连接的重要特征。

  • If yes, what's "NAT port randomisation"? I've heard that it makes the NAT select a new port for each host you're sending data to ... is that the case?



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

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

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

    有一套用于穿越 NAT 的技术。请阅读 STUN , TURN , 和 ICE .

    关于c# - 绑定(bind)套接字是否确保其端口始终相同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9069014/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com