編輯:在評論(並閱讀鏈接的頁面)後,我應該撤消我的建議。我不刪除它,爲好的圖形,但改變了最後一部分。
如果我理解正確的,你有兩個客戶端都在NAT防火牆,它允許傳出連接,但不向前入流的連接,如果沒有專門配置做這樣的(因爲他們不知道背後其中它註定的本地主機)。
原則,在其整個存在時間的TCP連接總是在這些地址(例如,我們有保持不變四位數字)連接兩個相同的IP地址和端口號。在NAT的情況下,你實際上有兩個連接,但這不是從客戶端計算機A(也沒有從服務器S)可見:
Client A -------(LAN)------ NAT B ------ (Internet) -------- Server S
IP A IP B1 | IP B2 IP S
Port a | Port b Port s
的TCP分組具有[A:A/S:S](或[S:s/A:a])地址和Internet部分上的[B2:b/S:s](或[S:s/B2:b])地址。這個連接由這個[IP:port/IP:port]四元組標識,所以如果你試圖改變這四個數字中的一個,這必須是一個新連接(否則數據包將被丟棄)。
所以,如果你第一次與你的服務器來說,你不能繼續向其他客戶講同樣的連接上,除非服務器轉發的內容。
UDP數據包的情況實際上是一樣的,區別在於沒有連接,並且NAT必須是智能的並且猜測哪個數據包是對其他數據包的答案,並且因此將其轉發給正確的方向。
正如指出的意見和其他的答案,這裏就是NAT可以被欺騙了一點:我們首先發送一個UDP包到其他客戶端,這將是由NAT獲得扔掉那裏。但是另一個客戶端發送的應答數據包對傳出數據包不是真正的答案(因爲這個數據包從來沒有被其他客戶端的NAT收到),但是IP地址和端口號相匹配,它仍然可以通過。如果NAT也轉換端口號,這可能會變得更加複雜。
對於TCP,它可以工作類似,如果兩個NAT都沒有真正保持打開的連接,而只是在發送之前發送SYN時轉發(更改)了數據包。它更加複雜,因爲TCP序列號也必須在這裏匹配。
你只使用tcp進行通信,對嗎? – 2011-04-16 17:26:50