36

我正在设计一个在端口 30000 上工作的p2p应用程序。我的路由器不是UPnP,所以我需要将一个端口转发到路由器。但是Skype另一个 p2p 应用程序在我的电脑上没有端口转发。当我用wireshark分析它时,我发现它使用UDP端口48980、58544。我使用的是c++。

这里有一个 python 库,用于Nat PnP 路由器。是否可以以编程方式将端口转发到路由器,而不管路由器和操作系统的类型如何。用 c++ 或任何其他语言做这件事的方法应该是什么。

4

4 回答 4

22

Skype 的工作方式非常有趣。从我读过的(这是不久前)来看,它的工作原理如下:

  • Skype 服务器维护所有用户和 IP 的列表。
  • Skype 用户 A 想与用户 B 通话
  • Skype 用户 A 向用户 B 的 IP 地址发送网络数据包并等待响应。(用户 B 永远不会得到这个数据包)。
  • Skype 用户 A 通知服务器它正在等待响应的 IP/端口组合
  • 服务器通知用户 B 在指定端口上向用户 A 发送响应
  • 建立连接。

这可能过于简化,但最后我检查了一下,这就是它的工作原理。(如果我错了,有人纠正我)。

编辑:修复子弹问题

于 2009-10-08T17:41:12.543 回答
19

UDP打洞是(一种)穿越NAT的方式。

于 2009-10-08T17:35:34.147 回答
3

您必须使用中间服务器,并从客户端启动通信。正如 Yossarian 所提到的,从那时起,一种可能性是 UDP 打孔。根据应用程序的类型(以及它是否是真正的 P2P),您可能会始终将中间服务器保持在适当的位置。

于 2009-10-08T17:41:02.763 回答
0

当无法直接连接时,Skype 使用另一个对等点作为中间点。

即 Peer A 想要连接到 Peer B,但是 Peer B 的所有端口都关闭了,然后通过开放端口的 Peer C 发起通信。

于 2009-10-08T18:05:59.610 回答