簡體   English   中英

編程 P2P 應用程序

[英]Programming P2P application

我正在編寫一個在端口 4900 上運行的自定義 p2p 程序。在某些情況下,當此人位於路由器后面時,無法從 Internet 訪問此端口。

是否有一種自動方法可以從 Internet 訪問端口。 我不太確定其他 p2p 應用程序是如何工作的。

任何人都可以對此有所了解嗎?

簡而言之,P2P 連接。 假設我們在這里談論的是 UDP。 以下步驟也可以通過一些調整應用於 TCP。

  1. 枚舉所有本地 IP 地址(通常只有 1 個)。 在給定端口號**上為每個具有 IP 地址的適配器創建一個 UDP 套接字。

  2. 對於在步驟 1 中創建的每個套接字,使用相同的套接字聯系 STUN 或 TURN 服務器以發現您的外部 IP 地址並發現內部端口號映射到 NAT 外部的內容(它並不總是相同的端口值)。 也就是說,你的本地地址 192.168.1.2:4900 對於外界來說可能是 128.11.12.13:8888。 並且一些 NAT 在使用相同的本地端口到其他 IP 地址時並不總是使用相同的端口映射。 TURN 還會為您提供一個“中繼地址”。 如果路由器支持該協議,您還可以使用 UPNP 直接從路由器獲取端口映射地址。

  3. 通過集合服務(SIP、XMPP、即時消息、Web 服務、電子郵件、帶有字符串的杯子),將您的地址候選列表發布到服務或向其他客戶端發送通知,說“嘿,我想與你聯系”。 此消息包括在步驟 1 和 2 中收集的所有“候選地址”(ip 和端口對)。

  4. 遠程客戶端在收到連接邀請后,也會執行上面的步驟 1 和 2。 然后通過他收到邀請者候選人名單的同一渠道發回他的候選人名單。

  5. 打孔步驟。 兩個客戶端都開始通過 UDP 向對方的地址候選者發送測試消息,並在他們的一端偵聽相同的消息。 每當收到消息時,請回復它來自的地址。 最終,客戶端會發現他們有一對地址,他們也可以可靠地發送數據報。 通常,一個端點最終決定與哪個地址對(套接字)進行通信,並且協議有助於該端點將這個決定告訴另一個端點。

**- 通常最好不要依賴 P2P 客戶端的知名端口。 因為同一 NAT 或防火牆后面的兩個客戶端不可能同時使用您的軟件。

以下是一些需要探索的技術的快速總結。

STUN - 是一個簡單的服務器和協議,供 NAT/路由后面的客戶端發現他們的外部 IP 和端口映射是什么。

TURN是 STUN 的擴展,但支持中繼用於防火牆和 NAT 阻止直接連接的 P2P 連接場景。

ICE是使用 STUN 和 TURN 建立 P2P 連接的一組步驟。 ICE 是上述步驟 1-5 的正式協議。 ICE 上的兩張出色的幻燈片在這里這里

WebRTC是 ICE 標准的變體,也是使用 STUN 和 TURN 進行 P2P 會話的參考庫。

UPNP + Internet 網關設備協議- 一些路由器支持主機自動獲取端口映射。

libnice是一個實現 ICE 的 Linux 開源 C 庫(可能適用於 Windows)。

libjingle是 Google 的另一個 ICE 實現(使用 C++)。 適用於 Windows 和 Linux。

PJNATHPJSIP編碼庫套件中的一個庫。 它是 ICE 堆棧(C 代碼)的良好實現,並已移植到許多平台。 (Windows、Linux、Mac、iOS、Symbian 和即將推出的 Android)。

最后,我有一個公然的插件供您使用我的 STUN 服務器代碼庫

在某些情況下有解決方案,請參閱 UPnP: https ://en.wikipedia.org/wiki/Universal_Plug_and_Play#NAT_traversal

我的家用路由器允許這樣做,基本上,NAT 可以通過計算機的適當請求自動配置。

我不會指望這會大大提高您的可用性,因為沒有多少路由器既支持它又啟用它。

編輯:@David 為 UPnP 的 .NET 庫建議了這個 SO 問題: Is there a UPnP Library for .NET (C# or VB.NET)?

我會使用WebRTC技術作為此類應用程序的開源框架。

官方網站

事實上,它是一個開源項目,支持開箱即用的點對點技術所需的一切:

  • ICE 和 STUN(NAT 穿越)
  • DTLS 和 SRTP(安全)
  • 用於流媒體質量的 AVPF。

這可能比您要尋找的要復雜一些,但是 TCP 打孔是一種應該有效的技術。 http://en.wikipedia.org/wiki/TCP_hole_punching

或者,UPnP 非常適合支持它的路由器/防火牆。

您還有另一種選擇,即NAT 端口映射協議 (NAT-PMP) NAT-PMP 被 Skype 或 BitTorrent P2P 客戶端等 VoIP 應用程序廣泛使用。

對於簡單的初學者,我建議您查看打孔技術。 很棒的視頻在這里 但請確保它並不總是與網絡拓撲相關聯。 這解決了發現如何建立連接的 ICE 技術。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM