2016-11-11 165 views
0

有沒有辦法通過TCP或UDP建立真正的P2P通信而不需要中間服務器?我知道如果兩臺計算機只有公共IP地址,但是如果它們在任何類型的NAT路由器後面或者在私人網絡中,它開始變得棘手,這是非常可行的。實際上,我越是仔細觀察,看起來越多顯然不可能。我發現了STUN,TURN和ICE協議以及打孔技術,但據我所知,它們都需要某種服務器才能建立連接。我很驚訝看似很簡單的事似乎很難做,我錯過了什麼? 理想情況下,我正在尋找使用Golang的解決方案,任何幫助或C++中的示例也會很有用,謝謝。建立P2P TCP/UDP連接(穿越NAT)

+0

'如果它們在任何類型的路由器後面'主要的問題是NAT,而這又是因爲IPv4中缺少地址。沒有NAT,這很簡單,是的。沒有,沒有第三個主機,這是不可行的(在IPv4中)。一端必須開始連接,而另一端則無法知道它背後的主機是否是目標。 – deviantfan

+0

你看過[libp2p](https://github.com/libp2p/go-libp2p)嗎? –

+0

@ChristopherWaldon看起來很有趣,但仍然是在製品,並且似乎沒有提供任何ICE沒有的東西,即如果其他連接類型不可能,它仍然退回到服務器中繼。不過謝謝。 – ChrysmPsy

回答

1

這不是嚴格的Go問題 - 這是一個普遍的網絡問題。

的原因,這是非常困難的是,互聯網從未被設計爲支持NAT,NAT剛剛發生,並打破了很多功能。乾淨的解決問題的方法是切換到IPv6,在沒有NAT,但如果你的NAT盒支持NAT-PMP或UPnP,請您可以使用,這也許是不可能的

。最簡單的方法是創建一個綁定到libminiupnpc的cgo,或者你可以去釣魚一個本地的Go庫。

如果您的NAT不支持其中任一協議,那麼你很可能出於運氣,因爲衝孔是一個脆弱和困難的技術,你可能會發現難以實施。