【问题标题】:Does binding a socket ensure it's port is always the same?绑定套接字是否确保其端口始终相同?
【发布时间】:2012-02-22 13:12:59
【问题描述】:

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

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

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

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

【问题讨论】:

  • 你的句子是?比例是荒谬的。你能把你所有的问题都放在最后吗,这样我们就可以确保我们回答了......
  • 如果涉及到 NAT,所有的赌注都没有了——那里有一个中间层,它正在改变各种事情。不要寻求保证,接受变化。
  • 抱歉问了这么多问题,这只是我不懂的时候的样子……我会努力解决的。

标签: c# sockets


【解决方案1】:

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

假设您在本地 PC 计算机上绑定到特定端口(甚至端口 0 - 这样操作系统会为您选择一个端口)。所有离开 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:port 地址,则 NAT 会将源端口转换为相同的。这称为“地址无关映射”,是与可能位于 NAT 后面的其他主机建立 P2P 连接的重要特征。

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

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

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

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

有一套用于穿越 NAT 的技术。请阅读STUNTURNICE

【讨论】:

    【解决方案2】:

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

    希望这能回答您的问题。如果没有,我认为我没有像我应该的那样理解这篇文章。

    【讨论】:

      猜你喜欢
      • 2019-07-31
      • 1970-01-01
      • 2021-11-15
      • 1970-01-01
      • 2017-09-15
      • 2021-08-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多