当两个客户端都在NAT之后时,如何创建P2P连接
本文关键字:何创建 创建 P2P 连接 NAT 两个 客户端 之后 | 更新日期: 2023-09-27 18:29:37
是否可以在两个客户端之间建立直接连接,这两个客户端都在不同的NAT后面?当然,我意识到在某种程度上,具有公共IP的服务器是必不可少的,但我不希望它成为代理。看看下面的场景:
- 我不想与配置网络设备有任何关系。我只想用代码来做
- 我不希望服务器参与文件传输过程(出于性能原因)
- 我们有:客户端A、客户端B和服务器S,看起来有点像:
A-[路由器1]-S-[路由器2]-B
- A连接到S并授权
- B连接到S并授权
- A想向B发送文件
- A请求S连接到B
- S(这里有魔法吗),A现在和B有了联系
- A开始发送文件
- S关闭(或者至少文件传输旁路为)
- A和B之间仍然有联系
- A继续向B发送文件
我的问题:
- 这可能吗
- 如何做到这一点
- 遇到过可以做到这一点的示例项目吗
我找到了WCF/WPF聊天应用程序,但它原来是一个代理。
我还发现了一些建议使用UPnP和NAT Traversal的帖子,但没有人直接回答我的第一个问题,所以我没有深入研究
您正在寻找的"神奇部分"称为NAT打孔。不幸的是,这个主题有点过于宽泛,无法在这里全面解释如何完成它,但现在知道了正确的术语至少应该能够让你开始寻找正确的教程。
以下是UDP打孔页面中的算法摘要。
设A和B是两个主机,每个主机都在自己的专用网络中;N1和N2是具有全局可达IP地址P1和P2的两个NAT设备P2;S是一个在全球知名的公共服务器可达IP地址。
- A和B各自开始与S的UDP会话;NAT设备N1和N2创建UDP转换状态并分配临时外部端口号X和Y
- S检查UDP数据包以获得N1和N2使用的源端口(外部NAT端口X和Y)
- S将P1:X传递给B,将P2:Y传递给A
- A向P2:Y发送数据包,B使用与S对话相同的源端口向P1:X发送数据包指向另一台主机的NAT
- 如果任一主机接收到数据包,则打孔成功,并且两台主机都可以通信
如果两个主机都具有受限锥形NAT或对称NAT,则外部NAT端口将与S使用的端口不同路由器,外部端口是按顺序选取的通过猜测附近的港口来建立对话。
它是否有效在很大程度上取决于两个端点的NAT路由器的行为,很可能你的大部分使用都是配对的,而且两个端点都有不"打孔友好"的路由器。
在你的情况下,我会让我的软件按顺序尝试这些步骤。
- 检查我们是否可以直接连接(用户进行了手动端口转发)
- 使用UPnP并打开端口
- 使用某种形式的穿孔,使用公共服务器作为中间人
- 使用另一个打开端口的对等节点作为数据的代理(超级节点)
- 使用我主持的服务器作为代理来转发数据