期末的时候做完开题报告,用了半个寒假投了一篇英文论文出去。两本书籍已经阅读完毕,现总结高性能服务器程序框架内容,分四篇文章介绍服务器模型、I/O模型(四种I/O模型)、两种高效事件处理模式和两种高效的并发模式。
正文开始:
1.C/S模型
TCP/IP协议在设计和实现上并没有客户端和服务器的概念。在通信过程中所有机器都是对等的。但由于资源(视频、资源、软件等)都被数据提供者所垄断,所以几乎所有的网络应用程序都很自然地采用了下图1所示的 图 1 C/S(客户端/服务器)模型:所有客户端都采用通过访问服务器来获取所需的资源。
图 1 C/S模型
C/S模型的逻辑很简单。服务器期待后,首先创建一个(或多个)监听socket,并调用bind函数将其绑定到服务器感兴趣的端口上,然后调用listen函数等待客户连接。服务器稳定运行之后,客户端就可以调用connect函数向服务器发起连接了。由于客户连接请求是随机到达的异步事件,服务器就要适用某种I/O模型来监听这一事件。I/O模型有多种,下图2中,服务器使用的是I/O复用技术之一的select系统调用。当监听到连接器请求后,服务器就调用accept函数接受它,并分配一个逻辑单元为新的连接服务。逻辑单元可以是新创建的子进程、子线程或者其他。
图2中,服务器给客户端分配的逻辑单元是由fork系统调用创建的子进程。逻辑单元读取客户请求,处理该请求,然后将处理结果返回给客户端。客户端接收到服务器的反馈结果之后,可以继续向服务器发送请求,也可以立即主动关闭连接。如果客户端主动关闭连接,则服务器执行被动关闭连接。至此,双方的通信结束。需要注意的是,服务器在处理一个客户请求的同时还会继续监听其他客户请求,否则就变成了效率低下的串行服务器了(必须先处理完前一个客户的请求,才能继续处理下一个客户请求)。图2中,服务器同时监听多个客户请求是通过select系统调用实现的。
图 2 TCP服务器和TCP客户端的工作流程
优点:C/S模型非常适合资源相对集中的场合,并且它的实现也很简单。
缺点:服务器是通信的中心,当访问量过大时,可能所有客户都将得到很慢的响应。
2. P2P模型
P2P(Peer to Peer, 点对点)模型比C/S模型更符合网络通信的实际情况。它摒弃了以服务器为中心的格局,让网络上所有主机重新回归对等的地位。P2P模型如图3(a)所示。P2P模型使得每台机器在消耗服务的同时也给别人提供服务,这样资源能够充分、自由地共享。云计算机群可以看做P2P模型的一个典范。但P2P模型的缺点也很明显;当用户之间传输的请求过多时,网络的负载将加重。
图3(a)所示的P2P模型存在一个显著的问题,即主机之间很难互相发现。所以实际使用的P2P模型通常有一个专门的发现服务器,如图3(b)所示。这个发现服务器通常还提供查找服务(甚至还可以提供内容服务),使得每个客户都能尽快地找到自己需要的资源。
图 3 a:P2P模型 b:带发现服务器的P2P模型
从编程角度来讲,P2P模型可以看做C/S模型的扩展:每台主机既是客户端,又是服务器。因此,现今大多数用户依旧是采用C/S模型来讨论网络编程。
下面继续介绍服务器程序框架之I/O模型。