当两个客户端都在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发送文件

我的问题:

  1. 这可能吗
  2. 如何做到这一点
  3. 遇到过可以做到这一点的示例项目吗

我找到了WCF/WPF聊天应用程序,但它原来是一个代理。

我还发现了一些建议使用UPnP和NAT Traversal的帖子,但没有人直接回答我的第一个问题,所以我没有深入研究

您正在寻找的"神奇部分"称为NAT打孔。不幸的是,这个主题有点过于宽泛,无法在这里全面解释如何完成它,但现在知道了正确的术语至少应该能够让你开始寻找正确的教程。

以下是UDP打孔页面中的算法摘要。

设A和B是两个主机,每个主机都在自己的专用网络中;N1和N2是具有全局可达IP地址P1和P2的两个NAT设备P2;S是一个在全球知名的公共服务器可达IP地址。

  1. A和B各自开始与S的UDP会话;NAT设备N1和N2创建UDP转换状态并分配临时外部端口号X和Y
  2. S检查UDP数据包以获得N1和N2使用的源端口(外部NAT端口X和Y)
  3. S将P1:X传递给B,将P2:Y传递给A
  4. A向P2:Y发送数据包,B使用与S对话相同的源端口向P1:X发送数据包指向另一台主机的NAT
  5. 如果任一主机接收到数据包,则打孔成功,并且两台主机都可以通信

如果两个主机都具有受限锥形NAT或对称NAT,则外部NAT端口将与S使用的端口不同路由器,外部端口是按顺序选取的通过猜测附近的港口来建立对话。

它是否有效在很大程度上取决于两个端点的NAT路由器的行为,很可能你的大部分使用都是配对的,而且两个端点都有不"打孔友好"的路由器。

在你的情况下,我会让我的软件按顺序尝试这些步骤。

  1. 检查我们是否可以直接连接(用户进行了手动端口转发)
  2. 使用UPnP并打开端口
  3. 使用某种形式的穿孔,使用公共服务器作为中间人
  4. 使用另一个打开端口的对等节点作为数据的代理(超级节点)
  5. 使用我主持的服务器作为代理来转发数据

当两个客户端都在NAT之后时,如何创建P2P连接