我从来没有想过这个问题,但现在我对幕后的一些基本事情很感兴趣。1) Web 服务器是否会在每次请求后关闭连接?2) 当我打开更多浏览器窗口并从某个 Web 服务器获取所有请求数据时,Web 服务器是否会使用某种标准套接字通信来识别哪个连接正在请求什么?3) 如果用户数量多于可用端口数(例如 66k 同时请求某个内容)怎么办?
谢谢 :)
答案1
- 取决于请求使用的 HTTP 版本。当服务器完成将响应发送回用户代理时,HTTP 1.0 连接会立即关闭。HTTP1.1 增加了对 keepalive 的支持,允许套接字连接在响应返回给用户代理后保持打开状态。在这种情况下,用户代理会发送一个 Connection: Keep-Alive HTTP 标头,表示它希望保持打开的连接,这意味着它将发送更多请求。
- 是的。这是基本的套接字功能。客户端在未使用的本地端口(通常较高)上打开套接字,并尝试打开与远程主机上特定目标端口(例如:HTTP 的 80)的连接。客户端创建的每个其他连接都会在不同端口上打开本地套接字,但仍可以尝试在远程主机上的同一端口上建立连接。
- 服务器上的侦听器进程将生成工作进程来处理多个传入请求,让侦听器自由处理传入请求。大多数 http 服务器都会有一个配置选项来控制要同时处理的请求数。
答案2
1)一般来说,每个页面请求都局限于一个连接打开和关闭。
2) 您的计算机会针对每次发出的请求更改其源端口。服务器使用 IP/源端口组合来跟踪哪些请求来自哪些主机
3)嗯,服务器正在响应端口 80 上的所有 HTTP 请求。但是对于客户端来说,如果您可以同时从 1 个客户端生成 66K 个请求,那么您可能会遇到问题,对此我不确定。
答案3
1) 大多数现代 Web 服务器都支持 Keepalive,因此,如果浏览器支持它,Web 服务器将会在每个连接中处理多个请求。
http://en.wikipedia.org/wiki/HTTP_persistent_connection
2)是的,每个连接都有自己的套接字,即一个 IP:PORT 对。
http://en.wikipedia.org/wiki/TCP_sockets
3) 如果有 65,535 人同时向单个服务器发出请求,您需要退后一步,考虑一下自己在做什么!:) 认真地说,除非您非常幸运,否则在遇到此问题之前,您会觉得需要进行负载平衡。您可能更早遇到的一个问题是文件描述符用尽。bash 中的默认值为 1024(请参阅 bash 手册页中的“ulimit”)。