67

Web 服务器如何在单个端口(80)上同时处理多个传入请求?

示例:同时 30 万用户希望看到来自 www.abcdef.com 的图像,该图像分配了 IP 10.10.100.100 和端口 80。那么 www.abcdef.com 如何处理这些传入用户的负载?

一台服务器(分配了 IP 10.10.100.100)可以处理如此大量的传入用户吗?如果没有,那么如何将一个 IP 地址分配给多个服务器来处理这种负载?

4

5 回答 5

33

端口只是一个幻数。它不对应于一个硬件。服务器打开一个套接字,该套接字在端口 80 上“侦听”并“接受”来自该套接字的新连接。每个新连接都由一个新套接字表示,其本地端口也是端口 80,但其远程 IP:port 与连接的客户端相同。所以他们不会混淆。因此,您在服务器端不需要多个 IP 地址甚至多个端口。

于 2013-06-06T03:41:51.710 回答
31

来自tcpipguide

这种同时使用客户端和服务器套接字的连接标识提供了灵活性,允许我们在 Internet 上认为理所当然的设备之间的多个连接。例如,繁忙的应用程序服务器进程(如 Web 服务器)必须能够处理来自多个客户端的连接,否则万维网将几乎无法使用。由于连接是使用客户端的套接字和服务器的套接字来识别的,所以这没有问题。在 Web 服务器保持上面提到的连接的同时,它可以很容易地拥有另一个连接,比如 IP 地址为 219.31.0.44 的端口 2,199。这由连接标识符表示:

(41.199.222.3:80, 219.31.0.44:2199). 

事实上,我们可以有多个从同一个客户端到同一个服务器的连接。每个客户端进程都会被分配一个不同的临时端口号,因此即使它们都尝试访问同一个服务器进程(例如位于 41.199.222.3:80 的 Web 服务器进程),它们都将拥有不同的客户端套接字并代表唯一连接。这就是让您可以从您的计算机向同一个网站同时发出多个请求的原因。

同样,TCP 独立跟踪每个连接,因此每个连接都不知道其他连接。TCP 可以同时处理数百甚至数千个连接。唯一的限制是运行 TCP 的计算机的容量,以及与其物理连接的带宽——一次运行的连接越多,每个人共享有限资源的次数就越多。

于 2013-06-10T09:32:18.093 回答
12

TCP 负责客户端识别
正如我所说,TCP 负责客户端识别,服务器只看到每个客户端的“套接字”。
假设 10.10.100.100 的服务器侦听端口 80 以获取传入的 TCP 连接(HTTP 是基于 TCP 构建的)。客户端的浏览器(位于 10.9.8.7)使用客户端端口 27143 连接到服务器。服务器看到:“客户端 10.9.8.7:27143 想要连接,你接受吗?”。服务器应用程序接受并获得一个“句柄”(一个套接字)来管理与该客户端的所有通信,并且该句柄将始终使用正确的 TCP 标头将数据包发送到 10.9.8.7:27143。

数据包永远不会同时发生
现在,在物理上,通常只有一个(或两个)连接将服务器连接到 Internet,因此数据包只能按顺序到达。问题变成了:通过光纤的最大吞吐量是多少,服务器可以计算和发送多少响应作为回报。除了响应请求时花费的 CPU 时间或内存瓶颈之外,服务器还必须保持一些资源处于活动状态(每个客户端至少 1 个活动套接字)直到通信结束,因此会消耗 RAM。吞吐量是通过一些优化(不是相互排斥的)实现的:非阻塞套接字(以避免流水线/套接字延迟)、多线程(使用更多 CPU 内核/线程)。

进一步提高请求吞吐量:负载均衡
最后,网站“前端”的服务器通常不会自己完成所有工作(尤其是更复杂的事情,如数据库查询、计算等),并推迟任务或甚至将 HTTP 请求转发到分布式服务器,同时它们继续每秒处理尽可能多的请求(例如转发)。在多台服务器上分配工作称为负载平衡

于 2016-12-06T18:02:06.490 回答
5

1)Web服务器如何在单个端口(80)上同时处理多个传入请求
==> a)Web服务的一个实例(例如:spring boot微服务)在端口的服务器机器中运行/侦听80.
b) 这个 web 服务(Spring boot 应用程序)需要一个 servlet 容器,比如主要是 tomcat。
此容器将 配置线程池
c) 当请求同时来自不同用户时,此容器将为
每个传入请求分配池中的每个线程。
d) 由于服务器端 Web 服务代码将具有大部分是
单例的 bean(如果是 java),因此与每个请求相关的每个线程都将调用单例 API
如果需要访问数据库,则
需要通过 @transactional 注释来同步这些线程。此
注解同步数据库操作。

2) 一台服务器(分配了 IP 10.10.100.100)可以处理如此大量的传入用户吗?
如果没有,那么如何将一个 IP 地址分配给多个服务器来处理这种负载?
==> 这将由负载均衡器和路由表处理

于 2019-08-17T17:12:34.910 回答
-1

答案是:虚拟主机,在 HTTP 标头中是域名,因此 Web 服务器知道哪些文件运行或发送给客户端

于 2013-06-20T15:36:28.110 回答