2017-07-30 94 views
1

我經歷了Programming P2P application SO帖子。但我認爲我還不清楚STUN如何在引擎蓋下工作。瞭解眩暈工作

所以,我想發佈我的理解並希望能夠糾正它們。

具體根據示例

假設機(A)IP是關於(STUN服務器上TCP客戶端請求)4900(在4900在TCP上運行TCP客戶端請求STUN服務器)和STUN服務器運行192.168.1.2返回的公共NAT設備即128.11.12.138888

現在我希望機器B的IP(假設現在B知道公共IP 128.11.12.13)連接到機器A通過端口3000(TCP)

什麼在這之後發生的事情 -

乙試圖將一個帶有IP上128.11.12.13

問題1連接:但哪個端口? (它不能直接連接到端口3000)

我想這個答案將我端口轉發4900請求3000

但這裏的事情

問題-2:怎麼樣連接到STUN對4900服務器的TCP客戶端(發送指示等)。如果應用端口轉發,則所有來自Stun服務器的流量都將被重定向到端口3000.對吧?

我正確嗎?

這是什麼方法或我在這裏大聲思考? :)

回答

2

事實上,你不能直接連接到端口3000。你必須連接到是在NAT開啓的端口,這是地址:那就是在STUN響應

client A     NAT     STUN server  client B 
    |---- STUN request --->|      |     | 
    | src:192.168.1.2:3000 |      |     | 
    |      |---- STUN request ---->|     | 
    |      | src:128.11.12.13:8888 |     | 
    |      |      |     | 
    |      |<----STUN response-----|     | 
    |      | ext:128.11.12.13:8888 |     | 
    |<----STUN response----|      |     | 
    | ext:128.11.12.13:8888|      |     | 
    |                 | 
    |======= APP protocol over rendezvous server =====================>| 
    |  my address is 128.11.12.13:8888       | 
    |                 | 
    |<======= APP protocol over rendezvous server =====================| 
    |   my address is 1.2.3.4:9999        | 
    |                 | 
    |-- direct protocol -->|           | 
    | src:192.168.1.2:3000 |           | 
    | dst:1.2.3.4:9999  |<--------- direct protocol ----------------| 
    |      |   dst:128.11.12.13:8888   | 
    |<-- direct protocol --|           | 
    | dst:192.168.1.2:3000 |           | 
    |      |           | 

STUN只提供了客戶端,或許在打開的外部IP地址和端口接收端口NAT設備。客戶端B必須嘗試連接到此IP和端口(128.11.12.13:8888),並且客戶端A必須在STUN請求的源地址:端口中使用的相同IP:端口(192.168.1.2:3000)處偵聽。

如果你很幸運,那麼上面的場景效果很好。但是你可能會走運,因爲有很多NAT類型,特別是對TCP來說可能會發生錯誤。

EDIT(回答另一個問題在註釋):

這是更好地保持到STUN服務器打開的連接。當NAT設備檢測到連接關閉時可能會關閉針孔。但是,據我所知,這取決於NAT設備的內部處理,這是不規範的。

客戶端A的直接協議的監聽套接字必須有SO_REUSEADDR選項集。如果該選項已設置,則可以建立與STUN服務器的連接,然後在同一端口創建一個偵聽套接字。

+0

你能否解釋一下,stun-client在接收到一個成功的stun響應後必須關閉與stun服務器的連接的最後一件事(原因是Stun RFC指出一個代理(可以是客戶端或者stun服務器)可以隨時發送指示消息給定如果我不關閉端口'3000'的stun-client,我將無法在特定端口啓動TCP服務器,也就是'3000',因爲它,對吧?假設TCP服務器將使用「任何地址」 – Viren