大多数P2P程序使用的方法是 打孔 ,
其中中央服务器用于在双方之间传递信息
关于使用的端口。
使用该信息,各方可以建立直接连接
有效的端口号,以便防火墙或路由器接受
并将传入的数据包转发到开放端口。
我相信你的问题更多地涉及UDP over NAT而没有干预
常见的服务器,这是一般的问题 NAT遍历 。
这里的问题是NAT设备没有自动确定方法
自发起以来,传入数据包所指向的内部主机
party不知道对方正在收听的端口号。
为解决这个问题,开发了几种算法 UDP打孔 。
一些UDP打孔算法依赖于使用相同端口的双方。
其他算法使用临时TCP连接来传递信息
建立UDP连接所需的。
其他 UDP打孔 技术不需要任何端口信息,而是使用其中的算法
双方将开始使用多次尝试相互发送,
并接受至少第一个数据包将丢失的事实。
在第一次尝试失败后,NAT设备有了
已经将数据包发送到另一台机器的记录,因此将通过
来自此IP地址和端口号的任何数据包。
该算法在上面链接的维基百科文章中有详细说明。
这是基于如果从地址接收分组的事实
以前曾尝试过连接,然后即使它在a上
与当地政党试图建立的港口不同的港口
连接,然后它将它切换到正确的端口。这让UDP
数据包通过NAT,因为它的NAT映射已经建立
由当地方试图发送。
所有这些方法的问题在于NAT地址转换技术
没有标准化。因此,用于NAT遍历的方法通常是专有的并且记录不良,以及它们是否有效会有所不同
不同品牌和型号的路由器之间。
IETF有一个完整的工作组,定义NAT设备应该做什么,以减少混乱: 表现 有几种通过NAT设备获取数据的方法,其中一些在BEHAVE页面上列出。还有 STUN , 通用即插即用 , NAT-PMP ,和 Teredo的 。