如何在UDP连接中绕过NAT/防火墙

3
我正在编写语音聊天应用程序,但问题在于当客户端使用路由器时防火墙会阻止连接。
我已经通过TCP连接解决了这个问题,但使用UDP连接我不知道如何解决这个问题。
我尝试了通过以下步骤进行UDP打洞:
  1. 客户端A向服务器发送IP和用户名
  2. 客户端B向服务器发送IP和用户名
  3. (服务器)向客户端B发送客户端A的信息-以开始语音聊天
  4. (服务器)向客户端A发送客户端B的信息-以开始语音聊天
但是这只能工作一次,很多时候无法工作,我不知道为什么。需要帮助。

尝试使用小型UDP数据包。例如,每个UDP数据包最多1000字节。 - markAnthopins
2个回答

3
NAT穿透需要一个外部的“撮合”服务器,并且在除了非对称路由器和防火墙之外的所有路由器上都可以使用。简单地说,这些“对称”的路由器会在你改变目标IP或端口时每次更改你的数据的出站/入站端口,有效地抵消了服务器试图进行的“匹配”。
还有其他“巧妙”的方法可以实现穿透,但它们缺乏一致性。
我建议您了解NAT类型(Assymetric,Symmetric,Full cone,Restricted cone,Port restriceted cone)之间的差异。还要确保您了解STUN,它允许您识别客户端所操作的NAT类型。最后,您应该了解UPnP,这是大多数路由器都具备的功能,允许程序自动注册并打开端口,无需用户通过路由器界面手动完成。

1
有用的信息。但您是否打错了字?“除了非对称”意味着它需要对称性,然后您又说对称路由器会使其无效?这在您的答案中是矛盾的。 - Bram

3
你正在尝试进行UDP打洞。但是一些具有对称NAT的路由器,打洞非常困难且不一致(如果可能的话)。在维基百科上阅读有关不同NAT的内容,您将获得更多见解。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接