假设 Alice 和 Bob 在 nats 后面(两个 nats 可以以某种方式进行交流,而不是奇怪的锥形情况,请解决这个问题)。
两者都在 0.0.0.0 上打开本地 udp 套接字,使用 torrent dht 发现它们的传出 ip:port (http://www.bittorrent.org/beps/bep_0042.html/引导)。
这足以双向发送 udp 数据包吗?比如说打开一个 utp 会话。
或者是否仍然需要尝试从 Alice 连接到 Bob 以及从 Bob 连接到 Alice 来破解可能存在的障碍 (fw / nats)?
答案1
大多数 P2P 程序使用的方法是 打孔,其中中央服务器用于在双方之间传递有关所用端口的信息。利用该信息,双方可以建立与有效端口号的直接连接,以便防火墙或路由器接受传入数据包并将其转发到开放端口。
我认为你的问题更多地与没有中间公共服务器的 UDP over NAT 有关,这是 NAT 遍历这里的问题是,NAT 设备没有自动的方法来确定传入数据包的目标内部主机,因为发起方不知道另一方正在监听的端口号。
为了解决该问题,开发了几种算法 UDP 打洞一些 UDP 打洞算法依赖于双方使用相同的端口。其他算法使用临时 TCP 连接来传递建立 UDP 连接所需的信息。
其他UDP 打洞 这些技术不需要任何端口信息,而是使用算法,双方将开始相互发送,使用多次尝试,并接受至少第一个数据包会丢失的事实。第一次尝试失败后,NAT 设备会记录已向另一台机器发送数据包,因此将允许来自此 IP 地址和端口号的任何数据包通过。该算法在上面链接的 Wikipedia 文章中有详细说明。
这是基于这样的事实:如果从之前尝试建立连接的地址接收到数据包,那么即使该数据包位于与本地方尝试建立连接的端口不同的端口上,它也会将其切换到正确的端口。这让 UDP 数据包能够通过 NAT,因为尝试发送的本地方已经为其建立了 NAT 映射。
所有这些方法的问题在于 NAT 地址转换技术尚未标准化。因此,用于 NAT 穿越的方法通常是专有的且记录不全,并且它们是否有效取决于不同品牌和型号的路由器。
IETF 有一个完整的工作组来定义 NAT 设备应该做什么才能减少混乱:表现 有几种方法可以通过 NAT 设备获取数据,其中一些列在 BEHAVE 页面上。还有眩晕,即插即用,NAT-PMP, 和泰雷多。
答案2
通常,动态 NAT 通过更改原始连接的源端口来映射连接。映射通常也受目标 IP 地址的限制,并且只有来自相同目标的数据包才会映射回来。NAT 甚至可以将相同的源端口多次映射到不同的目标地址。
有了这样的 NAT,Alice 或 Bob 需要配置他们的 NAT(手动或使用 UPnP 等其他方式),将特定的 NAT 端口映射到他们的客户端,以便另一端能够使用指定端口发起连接。建立连接(或使用 UDP 收到第一个数据包)后,其余数据包将照常流动。