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

Posted

技术标签:

【中文标题】Web 服务器如何在单个端口 (80) 上一次处理多个用户的传入请求?【英文标题】:How can a web server handle multiple user's incoming requests at a time on a single port (80)? 【发布时间】:2013-06-01 21:39:55 【问题描述】:

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

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

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

【问题讨论】:

here 对类似的问题“端口号如何在 TCP 中真正起作用?”有一个很好的答案 对我的帮助更好的是来自网络工程的详细解释,来自这里:networkengineering.stackexchange.com/a/39526 【参考方案1】:

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

【讨论】:

希望没有人对接受的答案感到困惑,考虑到搜索此类答案的人不太了解这两个方面之间的区别并且是网络世界的新手【参考方案2】:

来自tcpipguide

这种同时使用客户端和服务器套接字的连接标识提供了灵活性,允许我们在互联网上认为理所当然的设备之间的多个连接。例如,繁忙的应用程序服务器进程(例如 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 的计算机的容量,以及与其物理连接的带宽——一次运行的连接越多,每个共享有限资源的次数就越多。

【讨论】:

引用质量差,完全混淆了套接字和端口。连接由 IP 地址和端口标识,而不是由套接字标识。 @AnshumanKumar TCP 套接字是 四个 元素的组合,如果算上协议,则为五个。【参考方案3】:

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 时间或内存瓶颈之外,服务器还必须保持一些资源处于活动状态(每个客户端至少 1 个活动套接字)直到通信结束,因此会消耗 RAM。吞吐量是通过一些优化(不是互斥的)实现的:非阻塞套接字(避免流水线/套接字延迟)、多线程(使用更多 CPU 内核/线程)。

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

【讨论】:

没有“你想接受吗?”。 TCP* 在应用程序有任何说法之前接受。【参考方案4】:

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 地址分配给多个服务器来处理这种负载? ==> 这将由负载均衡器和路由表处理

【讨论】:

原始问题适用于既不需要 servlet 容器、线程池、bean、数据库、事务也不需要负载平衡器的情况。 @krozaine 与问题无关。【参考方案5】:

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

【讨论】:

关于多个域的问题中没有任何内容。

以上是关于Web 服务器如何在单个端口 (80) 上一次处理多个用户的传入请求?的主要内容,如果未能解决你的问题,请参考以下文章

HTTP

如何在Apache服务器配置多端口运行多个网站

如何确定正在侦听端口 80 的服务器

如何修改apache的默认web端口

Nginx配置多个服务共用80端口

当 web 端口 80 已经在使用时,如何监听 heroku 上的任何端口?