【问题标题】:Do webservers service all requests using one port?网络服务器是否使用一个端口服务所有请求?
【发布时间】:2020-09-22 20:17:53
【问题描述】:

如果网络服务器在端口 80 上处理流量,则每个客户端都必须在其自身与该端口上的服务器之间建立连接。假设一个客户端保持连接,那么服务器如何能够并行地为其他客户端提供服务?

服务器是否在请求后立即终止与客户端的连接?还是网络服务器会动态生成新端口供客户端使用,以便端口 80 可用于新连接?

【问题讨论】:

    标签: apache http webserver


    【解决方案1】:

    端口是通信通道的一端。

    服务器首字母设置一个监听端口(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)作为单线程运行,并首先关注发送数据的通道。

    【讨论】:

      猜你喜欢
      • 2018-04-16
      • 1970-01-01
      • 2020-03-18
      • 2023-03-15
      • 2019-01-02
      • 2023-03-10
      • 1970-01-01
      • 2016-11-01
      • 1970-01-01
      相关资源
      最近更新 更多