Sockets NAT后面的Web服务器,是否需要为请求端口启用端口转发?

Sockets NAT后面的Web服务器,是否需要为请求端口启用端口转发?,sockets,networking,webserver,router,nat,Sockets,Networking,Webserver,Router,Nat,这是一个很琐碎的问题,但我真的找不到一个好的答案 当我在侦听端口80的NAT后面托管Web服务器时,很明显,我需要在路由器中启用端口转发到Web服务器的端口80。但是,80只是服务器的接受端口,对于实际请求,它将使用不同的临时随机端口 我的问题是,我是否还需要为现在用于请求的随机端口启用端口转发?如果没有,它是如何工作的,我的意思是它是如何神奇地通过NAT的呢 让我从一本书中引用: “服务器(程序)在特定的计算机上运行,并且有一个绑定到特定端口的套接字 服务器侦听客户端的套接字以发出连接请求(请

这是一个很琐碎的问题,但我真的找不到一个好的答案

当我在侦听端口80的NAT后面托管Web服务器时,很明显,我需要在路由器中启用端口转发到Web服务器的端口80。但是,80只是服务器的接受端口,对于实际请求,它将使用不同的临时随机端口

我的问题是,我是否还需要为现在用于请求的随机端口启用端口转发?如果没有,它是如何工作的,我的意思是它是如何神奇地通过NAT的呢

让我从一本书中引用: “服务器(程序)在特定的计算机上运行,并且有一个绑定到特定端口的套接字 服务器侦听客户端的套接字以发出连接请求(请参阅) 服务器接受了连接。一旦接受,服务器就会得到一个新的套接字 绑定到不同的端口。它需要一个新的套接字(因此需要不同的端口号),以便 在为连接的客户端提供服务时,继续侦听原始套接字以获取连接请求。”


我只想知道这个“新连接”是否适用于Internet上的客户机,端口转发是否只启用到路由器后面服务器的侦听端口

在TCP级别,服务器将始终使用端口80,这里没有随机端口。当然会有一个新的套接字,但这是因为套接字代表一个连接(serverIP、80、clientIP、clientPort)

网络网关将客户端(ip、tcp端口)映射到网络内部的唯一地址/端口,并在表中跟踪该地址/端口。在最简单的情况下,转换后的地址将是网关的专用地址,端口可以相同。当服务器响应(从端口80到翻译后的地址/端口)时,网关查找表,翻译回数据包头中的地址,并通过internet将翻译后的数据包发送给客户端

下面是我从中复制的跟踪示例。您可以看到,位于192.168.0.102的服务器总是从端口80响应。浏览器似乎正在打开两个端口1046和1047。在此示例中,客户端和服务器都位于同一子网中,但假设NAT 192.168.0.103可能是网关的地址,10461047可能是转换端口。如果浏览器前面还有网关,端口可以转换两次

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)
514:52:49.543851192.168.0.103.1046>192.168.0.102.80:s7861110:7861110(0)win8192(DF)
614:52:49.543851 192.168.0.102.80>192.168.0.103.1046:S 3595122238:3595122238(0)ack 7861111赢32736
7   14:52:49.543851  192.168.0.103.1046 > 192.168.0.102.80: . ack 3595122239 win 8760(DF)
814: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)确认7861361胜32736(DF)
1014:52:49.663851192.168.0.102.80>192.168.0.103.1046:p3595123699:3595124724(1025)ack 7861361赢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.80385192.168.0.103.1047>192.168.0.102.80:s7862363:7862363(0)赢8192(DF)
13 14:52:50.80385192.168.0.102.80>192.168.0.103.1047:S 3701480536:3701480536(0)确认7862364赢32736
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)赢8192(DF)
16 14:52:50.873851 192.168.0.102.80>192.168.0.103.1048:S 2553725067:2553725067(0)确认7862438赢32736
17  14:52:50.873851  192.168.0.103.1048 > 192.168.0.102.80: . 确认2553725068赢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胜32736(DF)
20  14:52:50.993851  192.168.0.102.80 > 192.168.0.103.1048: . 2553725068:2553726528(1460)ack 7862753赢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)
2314:52:51.023851192.168.0.103.1047>192.168.0.102.80:P7862364: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赢32736(DF)
25  14:52:51.023851  192.168.0.102.80 > 192.168.0.103.1047: . 3701481997:3701483457(1460)确认7862677胜32736(DF)
26  14:52:51.033851  192.168.0.103.1047 > 192.168.0.102.80: . 确认3701483457赢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有很多很好的资源,可以更详细地了解这是如何工作的。

请参阅我的编辑,我认为我问的问题不对。写信给作者(Buyya,“面向对象的Java编程”,对吧?)说他错了,当然需要一个新的套接字,但不是一个新端口,肯定不是一个新的TCP端口。在我看来,作者试图“释义”,这是谨慎的,不走下港口不准确。看看书中的图表和我提供的链接,看看我的意思,没有新的TCP端口!!!但我仍然不明白的是,如果没有新端口,那么一个客户端与服务器的所有通信都会阻塞侦听端口,因此其他客户端无法连接。还是像你发给我的链接中所说的那样,一个端口可以用于多个套接字连接?我总是学习一个端口=套接字,否则资源很忙。我可以在一个端口上打开多个套接字,这是Java特有的还是通用的