2012-09-10 53 views
30

我想在一個軟件來實現打洞功能。 問題是,我正在用一個已經制作好的TCP服務器來與用戶進行通信。UDP打洞不打算通過對3G

這是我到目前爲止有:

  • 「A」 發送消息到UDP服務器 「US」(在端口9333)
  • 「US」 發回 「A」 的端口它已連接到(端口31000 - localport 31005)
  • 「A」向TCP服務器「TS」發送消息,表示他想連接到B(並給端口31000)
  • 「TS」發送消息給「B」 給他 「A」 的端口(31000)和IP
  • 「B」 發送messag e到「US」(端口9333)
  • 「US」向B發送一條消息告訴他他的端口45000(localport 45005)
  • 「B」發送消息給「TS」,給出udp端口45000)
  • 「TS」 將消息發送到 「A」 給B的UDP端口(45000)和IP
  • 「A」 開始的端口45000發送的UDP消息發送到B的IP和偵聽將localPort 31005
  • 「B 「開始發送udp消息到端口31000上的A的ip,並監聽本地端口45005

當然,端口31000,例如,31005,45000和45005就是這樣的,每個新的連接端口改變,只有9333是靜態的。

我知道有很多回往復的,比它確實應該。 事實是我一定要使用TCP服務器與兩個用戶進行溝通,UDP服務器只是這裏返回用戶端口自己,因此可以將其發送回TCP服務器。

但是用戶之間的消息不被任何接收... 任何人都會有一個想法,爲什麼?


編輯:

我過我的路由器http://nattest.net.in.tum.de/test.php和UDP打孔工作正常,所以問題沒有從我的路由器來,但是從我的協議...

當用戶在同一個NAT後面時,一切正常,當然它使用私有ip,但它意味着代碼也在工作,所以每個雖然導致協議問題...


編輯2:

其實,我做了一半的工作(而問題是從我的代碼來實際,而不是協議......我已連接用戶,一個在3G與iPhone,一個在我的Wifi後面。

有趣(以及沒那麼多)的是,只有一個插座都能夠接收和兩個用戶之間發送數據。 (由iPhone發起的套接字)根據協議,我應該有2個連接良好的套接字,我錯了嗎?

所以我設法在我的NAT中打出一個洞,但實際上不是在蜂窩NAT中。

當然,我測試了2個連接3G的iPhone。沒有人從另一方得到消息。

我錯過了關於蜂窩NAT的一些信息嗎?

P.S. :對不起,我更新了這麼多問題,但是因爲我沒有得到答案,所以我試圖自己找...

P.S. 2:因爲我設法猛擊我的NAT一個洞,我已經改變了標題添加「上3G」


編輯3:我通過我的iPhone的連接到互聯網我的電腦再次運行http://nattest.net.in.tum.de/test.php測試3G連接。

這裏的結果: UDP HOLE PUNCHING RESULT

顯然所有UDP打洞測試是成功的9號測試。

進一步看來:

UDP結合試驗(?):端點獨立綁定,端口預測是很容易

所以它不應該是連接2周的同行通過3G連接任何麻煩(當然比不了多少在「家庭」NAT後面)...我是對的嗎?


編輯4:

只是可以肯定,我現在將消息發送給兩個不同的UDP服務器,以檢查端口和本地端口是在3G相同。

長話短說,端口(本地和公共)在兩臺服務器上連接時都是相同的。所以在編輯2上完成的測試是正確的,udp是端點獨立的,所以不應該有任何問題做我打洞我猜...(至少與我的ISP)

+0

3G NAT是對稱和大規模。請嘗試使用這種衝孔方法:https://drive.google.com/file/d/0B1IimJ20gG0SY2NvaE4wRVVMbG8/view?usp=sharing – 2015-08-14 17:10:19

+0

+ I for http://nattest.net.in.tum.de/test.php我很長一段時間以來一直在尋找這樣的服務。 –

回答

14

不幸的是,沒有100%可靠用UDP執行NAT打孔的方法。充其量,您可以對NAT和防火牆在大多數情況下的表現做出一些猜測。但總會有例外,他們可能並不稀罕。

在這種情況下,聽起來您正在使用中央服務器讓兩個對等方找出對方的外部端口,然後開始互相發送數據。這是一個相當不錯的算法。問題是外部端口路由可能會因目的地而異。換句話說,如果A到B的外部端口爲5000,則不能保證A到C也將從5000開始。因此,使用中央服務器記錄它看到的端口可能無助於連接其他任何人。

以下是一些相關的問題和一些更多的細節。

+0

嗨,謝謝你的回答...唉,我知道沒有100%可靠的方法來用UDP執行NAT打孔:-(。但是,這個問題只發生在兩個對端都在3G連接之後。我嘗試過不同類型的NAT,並且它適用於大多數NAT(實際上只有對稱NAT失敗,但我意識到這一點......)。我不明白爲什麼當兩個peer都打開時它不起作用3G,雖然skype和Viber似乎工作正常,當兩個同行都在3G上 – TheSquad

+0

就像我在我的問題中寫道的,當一個對端位於非對稱NAT之後,另一個位於3G時,一個插座(2個)因此,我可以通過該套接字在兩臺設備上發送和接收數據。 – TheSquad

+1

當Skype無法建立直接連接時,像Skype這樣的服務通過中央服務器路由數據當它們都處於3G狀態時,可能無法正常工作的最可能原因是移動設備之間的路線不同比從每個中央服務器的路線。換句話說,你可能會經歷完全不同的NAT設備。 –