首页 > 解决方案 > UDP打孔混乱

问题描述

嗨,我对 UDP 打孔的工作原理以及如何实现它感到有些困惑。根据这篇维基百科文章: https ://en.m.wikipedia.org/wiki/UDP_hole_punching#Flow 想要建立 p2p 连接的客户端都必须与服务器建立 UDP 对话,以便交换 ip 和打孔. 我感到困惑的是,假设客户 a 想要与客户 b 发起 p2p 对话。客户端 b 如何知道连接到服务器以便客户端交换 IP?这是必需的,否则他们将不知道其他客户端的 IP。我是否以某种方式误解了这个概念?

标签: networkingudphole-punching

解决方案


在常规情况下,对等方没有静态 IP 地址,并且公共端口也使用临时路由规则动态分配,通常有效 1 到 3 分钟。

没有办法猜测双对等点的动态端口,甚至在没有预定义转发规则的情况下也无法立即建立到它的路由。

与经常转录的文档相比,通过路由器 + 互联网服务提供商的打孔实际上是通过将 UDP 数据包发送到公共中介服务器来完成的。

对等点通过重新使用调解器服务器当前看到的公共 ip/端口来相互联系。

中介服务器的路由器必然有到服务器的转发规则,所以服务器是公共可达的,可以发起公共通信。

如果中介服务器没有静态地址,则需要公共 DNS 服务器来解析服务器的动态地址。

为了捕获本地端口映射并将数据包返回到正确的目标,所有三个节点都将维护一个唯一的静态节点标识符到传入数据包的当前 IP/端口的映射;每个客户端需要定期向中介服务器对方发送带有客户端标识符的活动消息;中介服务器以一个活动确认消息进行响应,该消息携带中介服务器的当前公共地址/端口。这里要考虑路由器的可选端口映射规则来获取实际的公共端口。

远程端口的动态调整使得很难有几个独立的通信通道,至少我不知道UDP服务器的fork机制。

如果需要独立的通信通道,例如在 FTP 中,您有一个命令端口和一个流端口,则可以通过逻辑端口扩展数据包协议,并且可以根据逻辑端口分派传入的数据包。

最后还有安全隐患:

1.) 任何嗅探路由路径的任何节点的人都可能劫持通信;他可以从不同的地址向其中一个对等方发送和激活消息,因此将继承对等方的通信流。这里的最小解决方案是向活动消息添加身份验证。

2.) 当然,任何公共网络中的用户数据都必须加密!由于 UDP 数据包传送的不确定性,加密只能在数据包基础上进行,例如 AES/ECB,因此应该选择强加密。


推荐阅读