smw*_*dia 7 networking network-programming
当我们谈论Web应用程序的容量时,我们经常提到它可以处理的并发请求.
正如我讨论的另一个问题,以太网使用TDM(时分复用),并且没有2个信号可以同时通过线路.因此,如果Web服务器通过以太网连接连接到外部世界,那么根本就没有并发请求.所有请求都会一个接一个地发出.
但是如果网络服务器通过类似无线网卡的方式连接到外部世界,我相信多个信号可以通过电磁波同时到达.只有在这种情况下,才会有真正的并发请求.
我对吗?
谢谢.
我认为Web应用程序的"并发请求"并没有达到链接级别.这更像是应用程序处理请求以及在处理过程中有多少请求到达的问题.
例如,如果请求平均需要2秒才能完成(从在Web服务器上接收它到通过应用程序处理它以发回响应),那么如果请求每次请求很多,它可能需要处理大量并发请求第二.
请求需要重叠并同时处理,否则请求队列将无限期地填满.这似乎是常识,但对于许多Web应用程序而言,这是一个真正令人担忧的问题,因为大量请求可能会使应用程序的资源陷入困境,例如数据库.因此,如果应用程序具有较差的数据库交互(过于复杂的过程,较差的索引/优化,到许多其他应用程序共享的数据库的慢速链接等),则会产生瓶颈,限制应用程序可以处理的并发请求的数量即使应用程序本身应该能够处理它们.
小智 5
想象一下一个http服务器监听80端口,会发生什么:
客户端连接到服务器以请求某个页面;它使用某个原始本地端口从某个原始 IP 地址进行连接。
操作系统(实际上是网络堆栈)查看传入请求的目标 IP(因为服务器可能有多个 NIC)和目标端口 (80),并验证某个应用程序是否已注册以处理该端口(http 服务器)上的数据。4 个数字(源 IP、源端口、目标 IP、端口 80)的组合唯一标识一个连接。如果这样的连接尚不存在,则会将一个新连接添加到网络堆栈的内部表中,并将连接请求传递到 http 服务器的侦听套接字。从现在开始,网络堆栈仅将该连接的数据传递给应用程序。
多个客户端可以发送请求,对于每个客户端都会发生上述情况。因此,从网络角度来看,所有事情都是串行发生的,因为数据一次到达一个数据包。
从软件角度来看,http 服务器正在监听传入的请求。在客户端开始出现错误之前,它可以排队的请求数量由程序员根据硬件容量确定(这是并发性的第一位:可以有多个请求等待处理)。对于每个套接字,它将创建一个新套接字(尽可能快地继续清空请求队列),并让应用程序的另一部分(不同线程)完成请求的实际处理。这些处理例程(理想情况下)将花费大部分时间等待数据到达并(理想情况下)对其快速做出反应。
由于数据处理通常比网络 I/O 快许多倍,因此即使硬件仅由一个处理器组成,服务器也可以在处理网络流量的同时处理许多请求。多个处理器增强了这种能力。所以从软件的角度来看,所有的事情都是同时发生的。
如何实现数据的实际处理是性能的关键所在(您希望它尽可能高效)。存在多种可能性(由 Socket 类提供的异步套接字操作、线程池、唯一线程、.NET 4 中的新并行功能)。