我正在設計一個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