假设我有一个 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.1
,192.168.1.2
和192.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)
源地址发回。