2009-10-08 110 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.

相關問題