2014-03-06 47 views
0

這是一個微不足道的問題,但我真的找不到一個好的答案。NAT後面的Web服務器,我需要爲請求端口啓用端口轉發嗎?

當我主持端口80上偵聽很顯然,我需要啓用端口轉發到web服務器的80端口在我的路由器在NAT後面的網絡服務器。但是,80只是服務器的接受端口,對於實際的請求,它將使用不同的臨時隨機端口。

我的問題是,我還需要啓用現在正被用於請求或不是這個隨機端口的端口轉發?如果不是,它是如何工作的,我的意思是它怎麼神奇地通過NAT呢?

讓我引用一本書: 「服務器(程序)運行在特定的計算機上,並且具有綁定到特定端口的套接字,服務器偵聽套接字以便客戶端發出連接請求(見)。如果一切順利 正常,服務器接受連接,一旦接受,服務器獲取綁定到不同的端口一個新的套接字 ,它需要一個新的socket(因此不同的端口號),以便它可以 繼續在服務連接的客戶端時收聽原始套接字的連接請求。「

New on different port opened by server

我只是想知道,如果這個「新的連接」適用於客戶端是在互聯網上,如果端口轉發時,纔會啓用路由器後面的服務器的監聽端口。

回答

0

在TCP級別,服務器總是使用端口80,這裏沒有隨機端口。當然會有一個新的套接字,但這是因爲一個套接字表示一個連接(serverIP,80,clientIP,clientPort)。

聯網網關,客戶端(IP,TCP端口)連接到一個唯一的地址/端口映射在網絡的內部和跟蹤,在一個表中。在最簡單的情況下,轉換的地址將是網關的私有地址,並且端口可以是相同的。當服務器響應(從端口80到翻譯的地址/端口)時,網關查找表格,翻譯數據包標題中的地址並通過互聯網將翻譯後的數據包發送到客戶端。

下面是一個例子跟蹤我從here複製。您看到192.168.0.102處的服務器始終從端口80響應。瀏覽器似乎打開了幾個端口1046和1047.在此示例中,客戶端和服務器都位於相同的子網中,但假設NAT 192.168.0.103可能是網關的地址和1046,1047可能是翻譯的端口。如果瀏覽器前面還有一個網關,端口可以翻譯兩次。

5 14:52:49.543851 192.168.0.103.1046 > 192.168.0.102.80: S 7861110:7861110(0) win 8192 <mss 1460> (DF) 
6 14:52:49.543851 192.168.0.102.80 > 192.168.0.103.1046: S 3595122238:3595122238(0) ack 7861111 win 32736 <mss 1460> 
7 14:52:49.543851 192.168.0.103.1046 > 192.168.0.102.80: . ack 3595122239 win 8760 (DF) 
8 14:52:49.653851 192.168.0.103.1046 > 192.168.0.102.80: P 7861111:7861361(250) ack 3595122239 win 8760 (DF) 
9 14:52:49.663851 192.168.0.102.80 > 192.168.0.103.1046: . 3595122239:3595123699(1460) ack 7861361 win 32736 (DF) 
10 14:52:49.663851 192.168.0.102.80 > 192.168.0.103.1046: P 3595123699:3595124724(1025) ack 7861361 win 32736 (DF) 
11 14:52:49.663851 192.168.0.103.1046 > 192.168.0.102.80: . ack 3595124724 win 8760 (DF) 
12 14:52:50.803851 192.168.0.103.1047 > 192.168.0.102.80: S 7862363:7862363(0) win 8192 <mss 1460> (DF) 
13 14:52:50.803851 192.168.0.102.80 > 192.168.0.103.1047: S 3701480536:3701480536(0) ack 7862364 win 32736 <mss 1460> 
14 14:52:50.803851 192.168.0.103.1047 > 192.168.0.102.80: . ack 3701480537 win 8760 (DF) 
15 14:52:50.873851 192.168.0.103.1048 > 192.168.0.102.80: S 7862437:7862437(0) win 8192 <mss 1460> (DF) 
16 14:52:50.873851 192.168.0.102.80 > 192.168.0.103.1048: S 2553725067:2553725067(0) ack 7862438 win 32736 <mss 1460> 
17 14:52:50.873851 192.168.0.103.1048 > 192.168.0.102.80: . ack 2553725068 win 8760 (DF) 
18 14:52:50.973851 192.168.0.103.1048 > 192.168.0.102.80: P 7862438:7862753(315) ack 2553725068 win 8760 (DF) 
19 14:52:50.993851 192.168.0.102.80 > 192.168.0.103.1048: . ack 7862753 win 32736 (DF) 
20 14:52:50.993851 192.168.0.102.80 > 192.168.0.103.1048: . 2553725068:2553726528(1460) ack 7862753 win 32736 (DF) 
21 14:52:50.993851 192.168.0.102.80 > 192.168.0.103.1048: P 2553726528:2553726886(358) ack 7862753 win 32736 (DF) 
22 14:52:50.993851 192.168.0.103.1048 > 192.168.0.102.80: . ack 2553726886 win 8760 (DF) 
23 14:52:51.023851 192.168.0.103.1047 > 192.168.0.102.80: P 7862364:7862677(313) ack 3701480537 win 8760 (DF) 
24 14:52:51.023851 192.168.0.102.80 > 192.168.0.103.1047: . 3701480537:3701481997(1460) ack 7862677 win 32736 (DF) 
25 14:52:51.023851 192.168.0.102.80 > 192.168.0.103.1047: . 3701481997:3701483457(1460) ack 7862677 win 32736 (DF) 
26 14:52:51.033851 192.168.0.103.1047 > 192.168.0.102.80: . ack 3701483457 win 8760 (DF) 
27 14:52:51.033851 192.168.0.102.80 > 192.168.0.103.1047: P 3701483457:3701484633(1176) ack 7862677 win 32736 (DF) 

搜索NAT和PAT有很多很好的資源來充分理解這是如何工作的更詳細。

+0

請參閱我的編輯,我不認爲我問過這個問題吧。 – waiferv

+0

寫給作者(Buyya的「面向對象程序設計與Java」,對嗎?)他錯了,當然需要一個新的套接字,但不是一個新的端口,它並不是一個新的TCP端口。在我看來,作者試圖「轉述」http://docs.oracle.com/javase/tutorial/networking/sockets/definition.html,這是注意不要降低端口的不準確性。看看書中的圖表和我提供的鏈接,看看我的意思,沒有新的TCP端口! – gae123

+0

我仍然不明白的是,如果沒有新的端口,那麼一個客戶端與服務器的所有通信都會阻止監聽端口,所以沒有其他客戶端可以連接。或者是真的如你在給我發送的鏈接中說的那樣,一個端口可以用於多套接字連接?我總是學習一個端口=套接字,否則資源很忙。是Java特定的,我可以在一個端口上打開多個套接字,還是它通常被設計爲在網絡中如此?你能指出我的資源澄清這一點嗎? – waiferv

相關問題