2013-01-31 52 views
2

我閱讀TCP打孔文章hereTCP打孔工程使用Java套接字而不是Python Python

爲了做到這一點,必須將用於建立TCP連接的套接字綁定到遠程主機,以及本地主機用來偵聽連接到同一端口的套接字。我已經能夠在Java中執行此操作,但即使爲給定套接字設置了SO_REUSEADDR標誌,也無法在Python中執行此操作。有人可以向我解釋爲什麼?是因爲Python本質上是單線程的嗎?

+0

不是一個真正的java問題,重新標記,繼續 – TheWhiteRabbit

+1

沒有更多的信息,最好是一些代碼,你的問題是不可能回答的。 –

+0

我知道這個星球上沒有人成功地完成了TCP打孔。這應該是有趣的答案欄 –

回答

5

從我測試/研究TCP衝孔不是一種可行的技術,將在任何情況下工作。 首先,NAT Punching不能很好地支持NAT,它們的行爲是不可預知的。

恢復過程中,它依賴於發送TCP SYN數據包並接收TCP SYN數據包(在正常對話中,您將使用SYN + ACK進行響應),以便NAT將打開兩臺主機之間的連接。一些NAT可能會打開此連接,而其他NAT不會。 我知道的最好的方法是使用UDP來實現NAT穿越。由於UDP不是面向連接的,因此您可以開始發送數據包並進行接收,這樣NAT就會認爲一個數據包是另一個數據包的回覆。

UDP Hole Punching

此外,爲了使UDP作爲可靠的TCP,您可以使用TCP的實現了UDP。

UDT

我很抱歉我沒有回答你的問題,但爲什麼在Java中工作,爲什麼Python中沒有,是很難知道,它是與虛擬機的實現和系統調用,甚至你正在使用的NAT。

+2

根據我的經驗 - 使用UDP並在其上添加一些可靠性。即使使用UDP - 它在任何情況下都不起作用(閱讀關於對稱NAT),取決於路由器如何管理端口映射。如果不可預測,則不能遍歷。但是,如果您在可能的情況下處理所有場景,您將可以使用99%的路由器。此外,您可以通過UDP隧道TCP。 –

+0

謝謝,我不知道對稱NAT。有沒有辦法克服這一點? – fredcrs

+1

本文詳細探討了可能性:http://tools.ietf.org/id/draft-takeda-symmetric-nat-traversal-00.txt –