Web服务器如何在单个端口(80)上一次处理多个用户的传入请求?

35 networking network-programming tcp web-applications web

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

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

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

use*_*421 17

一个端口只是一个神奇的数字.它不对应于一块硬件.服务器打开一个套接字,它在端口80'侦听'并'接受'来自该套接字的新连接.每个新连接由一个新套接字表示,其本地端口也是端口80,但其远程ip:端口是根据连接的客户端.所以他们不会混淆.因此,您不需要在服务器端有多个IP地址甚至多个端口.

  • 希望没有人对接受的答案感到困惑,考虑到搜索这样的答案的人不太了解这两个方面之间的区别并且是网络世界的新手 (2认同)

a.m*_*.m. 17

来自tcpipguide

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

(41.199.222.3:80, 219.31.0.44:2199). 
Run Code Online (Sandbox Code Playgroud)

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

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

  • 质量差的引用,插座和端口之间完全混淆.连接由IP地址和*端口标识,*不是由套接字标识. (6认同)

max*_*xbc 8

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请求转发到分布式服务器,同时它们继续不停地处理(例如转发)每秒尽可能多的请求。在多个服务器上分配工作称为负载平衡


小智 5

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

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