Web 服务器是否使用不同的端口传输数据?

Web 服务器是否使用不同的端口传输数据?

假设我有一个 Web 服务器进程监听端口 80。当客户端访问此站点时,服务器会选择一个新端口来建立连接以传输数据,还是仅使用端口 80?使用 apache、lighttpd 或 nginx 的默认配置。

答案1

任何 TCP 连接都由 4 个数字组成的三元组标识:

source_ip, source_port, target_ip, target_port

仅要求所有 4 个数字的组合都是唯一的。对于我们示例中的 Web 服务器,target_ip将是该服务器的公共 IP 地址,并且target_port将是80(或443对于 HTTPS)。

回答您的问题:服务器在应答连接时不会选择新端口 - 它始终在监听端口80,但客户端在客户端选择端口!

例如,假设我们有一个具有公共 IP 地址的 Web 服务器10.0.0.1,以及客户端192.168.1.1192.168.1.2192.168.1.3。如果从客户端到服务器的连接仍然处于活动状态,netstat -4n则会打印如下内容:

Active Internet connections (w/o servers)
Proto Recv-Q Send-Q Local Address   Foreign Address    State
tcp        0      0 10.0.0.1:80     192.168.1.1:65510  ESTABLISHED
tcp        0      0 10.0.0.1:80     192.168.1.2:49166  ESTABLISHED
tcp        0      0 10.0.0.1:80     192.168.1.3:49166  ESTABLISHED

正如您所见,两个不同的客户端很可能拥有完全相同的端口号(49166)——这没有什么不对。

换句话说,Web 服务器继续通过客户端连接到的原始 TCP 连接(端口80)进行通信,直到该对话结束并关闭连接。Web 服务器的所有响应数据包都使用元组(source_ip, source_port)作为目标地址和(target_ip, target_port)源地址发回。

相关内容