【发布时间】:2020-09-22 20:17:53
【问题描述】:
如果网络服务器在端口 80 上处理流量,则每个客户端都必须在其自身与该端口上的服务器之间建立连接。假设一个客户端保持连接,那么服务器如何能够并行地为其他客户端提供服务?
服务器是否在请求后立即终止与客户端的连接?还是网络服务器会动态生成新端口供客户端使用,以便端口 80 可用于新连接?
【问题讨论】:
如果网络服务器在端口 80 上处理流量,则每个客户端都必须在其自身与该端口上的服务器之间建立连接。假设一个客户端保持连接,那么服务器如何能够并行地为其他客户端提供服务?
服务器是否在请求后立即终止与客户端的连接?还是网络服务器会动态生成新端口供客户端使用,以便端口 80 可用于新连接?
【问题讨论】:
端口是通信通道的一端。
服务器首字母设置一个监听端口(HTTPS 服务器的情况下为 80)。客户端创建一个端口(操作系统将为其分配一个随机的可用端口号)并将 CONNECT 连接到侦听端口。此时,通信通道由服务器的 IP 地址、服务器的端口 80、客户端的 IP 地址以及客户端的端口号唯一描述。如果您查看netstat 的输出,您会看到处于不同连接阶段的大量套接字/端口:
symcbean@skynet ~ $ netstat -t
Active Internet connections (w/o servers)
Proto Recv-Q Send-Q Local Address Foreign Address State
tcp 0 0 192.168.1.202:47206 stackoverflow.com:https ESTABLISHED
tcp 0 1 192.168.1.202:50894 aba1c1ff9d2ec5376.:smtp SYN_SENT
tcp 0 0 192.168.1.202:47210 stackoverflow.com:https ESTABLISHED
tcp 0 0 192.168.1.202:60806 ec2-34-213-90-136:https ESTABLISHED
tcp 0 0 192.168.1.202:51124 151.101.1.69:https ESTABLISHED
tcp 0 0 192.168.1.202:34784 i0.wp.com:https ESTABLISHED
tcp 0 0 192.168.1.202:54082 lhr25s14-in-f10.1:https ESTABLISHED
tcp 0 0 192.168.1.202:38412 172-155-250-212.s:https ESTABLISHED
服务器处理多通道并发通信的具体方式各不相同。我从来没有遇到过一次只处理一个连接的服务器。
在(prefork)Apache 网络服务器上,打开侦听套接字的进程将连接移交给预先存在的子进程以进行处理。一些服务器作为单个进程运行,但具有多个执行线程。有些(如nginx和lighthttpd)作为单线程运行,并首先关注发送数据的通道。
【讨论】: