2014-03-14 246 views
1

所以爲了理解,我們假設兩臺機器都在ipv4上,在NAT網絡後面。我希望能夠在兩臺機器上打開一個套接字並讓機器通過這些套接字(或類似的系統)連接。我知道nat穿透是必需的,但我不確定nat punchtrough如何應用(可以插入一個曾經連接的套接字現在可以接受?)任何曾在Python中使用nat穿透的人,我會非常感謝他們的幫助。Python P2P網絡(NAT Punchtrough)

+0

您使用的是UDP還是TCP? –

+0

我可以使用,我沒有特別選擇一個。我對這個區別也不是很熟悉。 – SwiftCore

+0

TCP數據包是可靠的,將在另一端重新組合。 UDP是不可靠的(數據包可能無聲無息地丟失或被亂序接收),但由於時間限制(例如遊戲,音頻/視頻聊天),丟棄數據包通常用於重發它們( –

回答

0

聽起來好像您需要設置端口轉發 - 實質上是告訴您的路由器將它在特定端口上收到的呼叫轉發到位於其後面的服務。

這通常是通過路由器的管理界面完成的。

+0

我特別在尋找nat突破性努力避免這種情況。我試圖創建相對容易使用的軟件,因此配置路由器聽起來不合理。 – SwiftCore

+0

據我所知,你絕對需要至少在一個方向上使用端口轉發。一旦建立了連接,就可以通過該連接簡單地發送數據包。如果您不希望用戶介入,我相信您可以使用UPnP,它允許您直接從應用程序設置端口轉發。雖然我從來沒有嘗試過,所以我不確定它會是多麼容易。 –

2

打孔在the Wikipedia entry

打孔以及描述的是在不同的組織誰都是嚴格的防火牆後面的兩方之間建立通信的計算機網絡技術。用於在線遊戲,P2P和VoIP等應用程序,這兩個客戶端與一個無限制的第三方服務器建立連接,爲他們揭示外部和內部地址信息。由於每個客戶端都向服務器發起了請求,因此服務器知道爲該會話分配的IP地址和端口號,它們相互共享一個IP地址和端口號。擁有有效的端口號會使防火牆接受來自每一方的傳入數據包。 ICMP打孔,UDP打孔和TCP打孔分別使用Internet控制消息,用戶數據報和傳輸控制協議。使用TCP惡意打孔技術,可以將壓縮的SYN數據包發送到公共的ACK路徑中。

有TCP/UDP和ICMP保持打孔技術的鏈接。

通常,從A到B(都在NAT後面)打一個洞需要一個第三方服務器C,它們都可以最初連接到該服務器。服務器將A的連接信息發送給B,反之亦然。 A & B然後使用此信息嘗試直接連接到對方,但該過程並非100%可靠。

如果你沒有第三方服務器,那麼我認爲它不會工作。

編輯

你可能也想看看到的UPnP http://en.wikipedia.org/wiki/Universal_Plug_and_Play#NAT_traversal。我不確定路由器有多好的支持,但它對您的應用來說聽起來很合適。

+0

我確實有第三方服務器(理論上)。這是我通過我們學校的ACM領導的課外項目,因此我們可以訪問ACM服務器上的服務器空間。我打算通過這個打洞。儘管如此,仍然有點失落。 – SwiftCore