udp - 选择 UDP 打洞的端口号

标签 udp port p2p nat hole-punching

我有一个奇怪的问题。我有一个成功运行的 C++ (boost asio) P2P 应用程序,它可以在大多数 NAT 上运行。问题是,当我将初始启动端口号指定为 1000 时,它会检查 1000 是否空闲,否则加一并选择一个端口并开始握手。但是,当我有 10000、20000 或任何其他巨大端口号时,打洞在端口受限锥形 NAT 上不起作用。

这怎么可能?我很确定这与代码无关。最近,它在我的一位 friend 的全锥 NAT 上也不起作用,但它在许多其他全锥 NAT 上都有效。可能是什么原因?关于 NAT 的行为方式,我是否遗漏了什么?

最佳答案

  1. 在许多 NAT 实现中,都有适当的保护规则来防止一台主机占用 WAN 接口(interface)上的大部分端口,例如就像描述的那样here .

  2. 根据路由器的不同,NAT 表条目具有不同的生命周期,并且可以分配给单个客户端的端口数量始终存在限制(我见过从 128 到 4096 的数字)。

因此,我认为当您需要使用高端口时,源 IP 地址的 NAT 表已经满(或几乎满),其中包含来自旧连接或来自其他应用程序的连接的条目,因此路由器决定拒绝或无法适应您端口的新 NAT 条目。

但是,可以肯定的是,我会尝试在受控环境中重复这一过程,收集 NAT 两侧的 Wireshark 转储并分析数据包。如果可能的话,启用路由器日志并查看它们也会很有帮助。

我知道这不是“ Elixir ”,但希望它能对您有所帮助。

关于udp - 选择 UDP 打洞的端口号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15834226/

相关文章:

python - 如何使用bash启动多个tornado实例

video - 直播网站背后的技术是什么?

udp - 使用 STUN 打洞

udp - Linux splice() 返回 EINVAL ("Invalid argument")

node.js - 如何在没有URL中的端口号的情况下使用Traefik + Docker + Nodejs访问我的API?

java - Android线程刚刚停止

port - System.Net.HttpListenerException : Failed to listen on prefix 'http://localhost:8080

javascript - 浏览器中的客户端服务器?

c - 如果目的地不存在,sendto() 不会生成错误

python - 套接字Python 3 UDP ConnectionResetError : [WinError 10054] An existing connection was forcibly closed by the remote host