我正在设计一个p2p应用程序,它适用于端口30000.我的路由器不是UPnP所以我需要转发一个端口到路由器。但是Skype另一个p2p应用程序在我的电脑上无端口转发。当我用wireshark分析它时,我发现它使用UDP端口48980,58544。我正在使用C++。Skype如何在没有端口转发的情况下工作?
在python here有一个库,它可以为Nat PnP路由器。是否有可能以编程方式将端口转发到路由器,而不考虑路由器和操作系统的类型。应该用C++或其他语言来实现它。
我正在设计一个p2p应用程序,它适用于端口30000.我的路由器不是UPnP所以我需要转发一个端口到路由器。但是Skype另一个p2p应用程序在我的电脑上无端口转发。当我用wireshark分析它时,我发现它使用UDP端口48980,58544。我正在使用C++。Skype如何在没有端口转发的情况下工作?
在python here有一个库,它可以为Nat PnP路由器。是否有可能以编程方式将端口转发到路由器,而不考虑路由器和操作系统的类型。应该用C++或其他语言来实现它。
Skype的作品在一个非常有趣的方式。从我读过的(这是前一阵子),其工作原理如下:
这可能是过了简化,但最后我检查了,这是它是如何工作的。 (如果我错了,有人纠正我)。
UDP hole punching是(一个)的方式如何通过NAT穿越。
你必须使用一个中间服务器,并启动从客户端通信。正如Yossarian所说,从这一点来说,一种可能性是UDP打孔。根据应用程序的类型(以及它是否真正为P2P),您可能需要在整个时间保持中间服务器。
Skype使用另一个对等体作为中间点时的直接连接是不可能的。
即对等体A想要连接到对等体B,但对等体B具有所有端口闭合,则通信是通过具有开放的端口对等下开始。
In公司描述得非常详细在实施P2P应用程序,让他们到NAT路由器后面工作的一些经验。
Skype使用UDP打洞NAT路由器之后的工作。我写了一篇文章并制作了演示视频,以帮助其他人实施类似的应用程序。还提供了有用的库的链接,这些库完成大部分基础工作,如libutp。
但问题是客户端PUBLIC的IP?例如见A需要与B通信,服务器知道B的IP,但它使用了哪个IP?如果是这种情况,你可以ping anyones ip?对不起,如果它是愚蠢的 – 2012-04-02 00:02:41
这个答案仅仅描述了A,并且没有与B通信,服务器向用户B发送正确的IP /端口组合。它缺少主要点,这就是所谓的打孔,并且在链接中有很好的描述由@MartinBeckett提供。我只想补充一点,即使路由器支持UPnP,也可以转发端口,而不管路由器和操作系统的类型如何。 – Igor 2013-01-27 15:15:33
@rein那么对称NAT呢? – onmyway133 2013-07-21 04:09:16