2008-09-04 92 views
3

Joel's post on Copilot直接TCP/P2P中的IP連接應用程式

直接連接!我們一直都在做 我們所能做的一切,以確保 Fog Creek Copilot可以在任何 網絡連接情況下連接,不管 有哪些防火牆或NAT。若要 發生這種情況,雙方將向我們的服務器 出站連接, 代表它們中繼流量。那麼,在很多情況下,這不是 必要的。所以2.0版本的確很巧妙:它通過我們的 服務器設置了 的初始連接,因此您可以以100%的可靠性正確連接 。但是當 一旦你全部連通,它就悄悄地,在後臺 ,尋找一種方式,以 作出直接連接。如果它不能, 沒什麼大不了的:你只需通過我們的服務器繼續傳送 。如果您可以直接建立 對等連接,則它將以無提示方式將您的數據轉移到 直接連接上。你不會注意到 任何東西,除了可能更快的通訊。

他們如何將服務器連接更改爲P2P連接?

回答

9

這是很棘手的,有趣的。我確定我有一些細節錯誤,但概述是這樣的:

程序已經可以通過Joel的服務器彼此交談,所以他們可以彼此交換信息和Joel的服務器。此外,Joel有他們的外部IP地址,他們給joel關於他們的內部IP地址的信息。

他們決定嘗試這種打孔技術。計算機A使用B的外部IP地址啓動與計算機B的TCP連接。它不會經過,但是它告訴A的路由器它需要允許來自給定端口上的B的輸入分組。因爲A的路由器打開了一個與B發送的端口/ IP組合相匹配的端口/ IP組合(這裏有一些端口魔法 - 這不是微不足道的,但是可行的)。

B的路由器記得B在一個給定的端口和IP上發起了與A的連接,因此A的數據包現在也正確地流入B並通過其路由器。所以它實際上非常簡單,但是實現具有細節,尤其是關於端口如何被賦予新的TCP連接,以及NAT路由器如何處理TCP請求以及它們如何映射到外部端口。這些細節是有趣而且困難的一點。

- 亞當

+0

因此,當A獲得B的IP時,它是否打開一個新的套接字連接到B?或使用它用於連接到中央服務器的相同套接字?我希望後者不是這種情況,因爲他們必須同步seq和ack數字。 – 2016-04-05 06:02:12

1

有一種名爲「Hole Punching」的技術,可與「Cone」NAT(Cone是路由器的技術家族)很好地配合使用。這不是一個100%肯定的技術,今天,它在大約路由器80%的UDP上運行良好。

有圖書館的一些實現實現打孔:STUNwikipedia

1

我相信簡單的說法是,他們放棄與服務器的連接,並與P2P連接代替它。

線沿線的東西:

  1. MACHINE1連接到副駕駛的服務器。
  2. Machine1連接到副駕駛的服務器。
  3. Machine1連接到副駕駛的服務器。
  4. Machine2隨後連接,並開始屏幕共享。
  5. Machine2打開Machine1連接的端口。
  6. Machine1嘗試連接到Machine2上現在打開的端口。

如果建立了連接:

  1. 到副駕駛的服務器連接將被切斷。
  2. 數據被轉移到兩臺機器之間的直接(P2P)連接上。