2009-10-08 95 views
31

我正在设计一个p2p应用程序,它适用于端口30000.我的路由器不是UPnP所以我需要转发一个端口到路由器。但是Skype另一个p2p应用程序在我的电脑上无端口转发。当我用wireshark分析它时,我发现它使用UDP端口48980,58544。我正在使用C++。Skype如何在没有端口转发的情况下工作?

在python here有一个库,它可以为Nat PnP路由器。是否有可能以编程方式将端口转发到路由器,而不考虑路由器和操作系统的类型。应该用C++或其他语言来实现它。

回答

20

Skype的作品在一个非常有趣的方式。从我读过的(这是前一阵子),其工作原理如下:

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

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

+0

但问题是客户端PUBLIC的IP?例如见A需要与B通信,服务器知道B的IP,但它使用了哪个IP?如果是这种情况,你可以ping anyones ip?对不起,如果它是愚蠢的 – 2012-04-02 00:02:41

+4

这个答案仅仅描述了A,并且没有与B通信,服务器向用户B发送正确的IP /端口组合。它缺少主要点,这就是所谓的打孔,并且在链接中有很好的描述由@MartinBeckett提供。我只想补充一点,即使路由器支持UPnP,也可以转发端口,而不管路由器和操作系统的类型如何。 – Igor 2013-01-27 15:15:33

+1

@rein那么对称NAT呢? – onmyway133 2013-07-21 04:09:16

18

UDP hole punching是(一个)的方式如何通过NAT穿越。

+0

我无法理解路由器和NAT之间的区别?我们是否将端口转发到路由器或NAT?不打孔相当于同时发送来自双方的数据,当我们在不同的端口上工作时不起作用。谢谢 – Xinus 2009-10-08 18:04:53

+1

路由器将信息从一个网络路由到另一个网络。 NAT是在内部网络上拥有专用地址范围的过程,只有路由器在另一个网络上有有效地址。路由器是一个物理设备,NAT是你做的事情。 – rein 2009-10-08 18:09:50

3

你必须使用一个中间服务器,并启动从客户端通信。正如Yossarian所说,从这一点来说,一种可能性是UDP打孔。根据应用程序的类型(以及它是否真正为P2P),您可能需要在整个时间保持中间服务器。

0

Skype使用另一个对等体作为中间点时的直接连接是不可能的。

即对等体A想要连接到对等体B,但对等体B具有所有端口闭合,则通信是通过具有开放的端口对等下开始。

0

In公司描述得非常详细在实施P2P应用程序,让他们到NAT路由器后面工作的一些经验。

Skype使用UDP打洞NAT路由器之后的工作。我写了一篇文章并制作了演示视频,以帮助其他人实施类似的应用程序。还提供了有用的库的链接,这些库完成大部分基础工作,如libutp。

>>> UDP hole punching Demo video and useful Libs.

相关问题