Skype如何在没有端口转发的情况下工作?

36

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

这里有一个Python库Nat PnP routers可以为此做出处理。是否可能编写程序将端口转发到路由器,而不考虑路由器和操作系统的类型?在C++或其他语言中如何实现?

4个回答

22

Skype以一种非常有趣的方式工作。从我读过的资料来看(这是一段时间以前的事),它的工作原理如下:

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

这可能过于简化,但据我所知,这就是它的工作方式。(如果我错了,请有人纠正我。)

编辑:修复了项目符号问题。


2
但问题是客户端的IP是公共的吗?例如,A需要与B通信,服务器知道B的IP,但它使用哪个IP?如果是这种情况,您可以ping任何人的IP吗?如果这很愚蠢,请原谅。 - Afnan Bashir
6
这个答案仅描述了A并未与B和服务器通信,未将正确的IP/端口组合发送给用户B。它缺少了主要内容,即称为“打洞”,在@MartinBeckett提供的链接中有很好的描述。我只想补充说明,无论路由器和操作系统的类型如何,只要路由器支持UPnP,就可以转发端口。 - Igor
1
@rein 那对称NAT怎么办? - onmyway133

20

我无法理解路由器和NAT之间的区别。我们是将端口转发到路由器还是NAT?打洞不就相当于同时从两侧发送数据,而在不同端口上工作时这种方法行不通吗?谢谢。 - Xinus
1
路由器将信息从一个网络路由到另一个网络。NAT 是在内部网络上拥有私有地址范围,并且只有路由器在其他网络上拥有有效地址的过程。路由器是一种物理设备,而 NAT 是一种操作。 - rein

3

你需要使用一个中介服务器,并从客户端发起通信。正如Yossarian所提到的那样,从那一点出发,一种可能性是UDP打洞。根据应用程序的类型(以及它是否真正是P2P),您可能会在整个过程中保留中间服务器。


0

Skype在直接连接不可能时,使用其他对等点作为中间点。

例如,对等点A想要连接到对等点B,但是对等点B的所有端口都关闭了,那么通信将通过具有开放端口的对等点C进行初始化。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接