Web服务器如何在单个端口(80)上同时处理多个传入请求?
示例: 同时,300k用户希望从www.abcdef.com看到分配了IP 10.10.100.100和端口80的图像。那么www.abcdef.com如何处理这些传入用户的负载呢?
一台服务器(分配了IP 10.10.100.100)可以处理这么多的传入用户吗?如果没有,那么如何将一个IP地址分配给多个服务器来处理此负载?
答案 0 :(得分:14)
端口只是一个神奇的数字。它不对应于一块硬件。服务器打开一个套接字,它在端口80'侦听'并'接受'来自该套接字的新连接。每个新连接由一个新套接字表示,其本地端口也是端口80,但其远程ip:端口是根据连接的客户端。所以他们不会混淆。因此,您不需要在服务器端使用多个IP地址甚至多个端口。
答案 1 :(得分:14)
使用客户端和服务器套接字识别连接可以灵活地允许我们在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的计算机的容量,以及与之物理连接的带宽 - 一次运行的连接越多,每个人共享有限的资源就越多。
答案 2 :(得分:4)
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。
数据包永远不会同时发送
现在,在物理上,通常只有一个(或两个)连接将服务器链接到互联网,因此数据包只能按顺序到达。问题变成:通过光纤的最大吞吐量是多少,以及服务器计算和发送的响应数量。除了在响应请求时花费的CPU时间或内存瓶颈,服务器还必须保持一些资源(每个客户端至少有一个活动套接字),直到通信结束,因此消耗RAM。吞吐量是通过一些优化(非互斥)实现的:非阻塞套接字(以避免流水线/套接字延迟),多线程(使用更多CPU核心/线程)。
进一步提高请求吞吐量:负载平衡
最后,网站“前端”的服务器通常不会自己完成所有工作(特别是更复杂的东西,如数据库查询,计算等),并推迟任务甚至将HTTP请求转发到分布式服务器虽然他们可以尽可能地每秒处理尽可能多的请求(例如转发)。在多个服务器上分配工作称为负载平衡。
答案 3 :(得分:1)
1)Web服务器如何在单个端口上同时处理多个传入请求(80)
==> a)Web服务的一个实例(例如:spring boot micro服务)在服务器上的端口80上运行/监听。
b)该web服务(Spring启动应用程序)需要一个servlet容器,如tomcat。
此容器将配置线程池。
c)每当来自不同用户的请求同时出现时,此容器将
为每个传入请求分配池中的每个线程。
d)由于服务器端Web服务代码将主要具有bean(以Java为例)
单例,针对每个请求的每个线程都会调用单例API的
并且如果需要访问数据库,则这些
的同步
需要通过@transactional批注完成的线程。这个
批注同步数据库操作。
2)一台服务器(分配了IP 10.10.100.100)可以处理大量的传入用户吗?
如果不是,那么如何将一个IP地址分配给多个服务器来处理此负载?
==>负载均衡器会与路由表一起解决这个问题
答案 4 :(得分:0)
答案是:虚拟主机,在HTTP标头中是域名,因此Web服务器知道哪些文件运行或发送到客户端