2014-03-06 44 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

相关问题