服务器模型
CS模型
TC/IP协议在设计和实现上没有客户端和服务器的概念,在通信过程中所有机器都是对等的。但是由于资源(视频、新闻、软件等)都被数据提供者垄断,因此几乎所有的网络程序都采用了CS模型:所有客户端都通过访问服务器来获取所需的资源:
- 服务器启动后,首先创建一个或者多个监听
socket
,并调用bind
函数将其绑定到服务器感兴趣的端口上,然后调用listen
函数等待客户连接 - 服务器稳定运行之后,客户端就可以调用
connect
函数向服务器发起连接了 - 由于客户请求连接是随机到达的异步事件,服务器就需要使用某种IO模型(最常见的是select/poll/epoll系统调用)来监听这一事件。
- 当监听到连接请求之后,服务器就调用
accept
函数接受它,并分配一个逻辑单元为新的连接服务。逻辑单元可以是新创建的子进程、子线程或者其他。 - 逻辑单元读取客户请求,处理该请求,然后将返回结果返回给客户端。
- 客户端接受到服务器反馈的结果之后,可以继续向服务器发送请求,也可以立即主动关闭连接。如果客户端主动关闭连接,则服务器执行被动关闭连接。至此,双方的通信结束
服务器在处理一个客户端请求的时候还会同时继续监听其他客户请求(比如可以通过select系统调用实现):
CS模型适合资源相对集中的场景
- 优点:实现简单
- 缺点:服务器是通信的中心,当访问量过大时,响应慢
P2P模型
P2P模型摒弃了以服务器为中心的格局,让网络上所有主机重新回归对等的地位。
- 优点:使得每台机器在消耗服务的同时也给别人提供服务,这样资源能够充分、自由的共享
- 缺点:当用户之间传输的请求过多时,网络的负载将加重
最常见的P2P模型的实现时云计算机群
上面P2P模型存在一个显著的问题:主机之间很难互相发现。所以P2P模型通常有一个专门的发现服务器:
P2P模型可以看成是CS服务器的扩展:每台主机即使客户端,又是服务器。
所以我们来讨论CS模型
服务器编程框架
虽然服务器程序种类很多,但是基本框架都是一样的:
模块 | 单个服务器程序 | 服务器机群 |
---|---|---|
IO处理单元 | 处理客户连接,读写网络数据 | 作为接入服务器,实现负载均衡 |
逻辑单元 | 业务进程或者线程 | 逻辑服务器 |
网络存储单元 | 本地数据库、文件或者缓存 | 数据库服务器 |
请求队列 | 各单元之间的通信方式 | 各服务器之间的永久连接 |