1.5 设计应用程序
到目前为止提到的网络概念提供了一个相对简单的服务模型 [RFC6250]:在不同计算机上(有时是在相同计算机上)的程序之间移动字节
想要利用这个能力来做任何事情,都需要用到网络应用程序,这些应用程序使用网络来提供的服务或计算能力
网络应用程序的常见结构包括:客户端/服务器(client/server)、点对点(peer-to-peer)
1.5.1 客户端服务器(Client/Server)
即:C/S 架构
大部分网络应用程序都是 C/S 结构,一边为客户端另一边为服务器
服务器为客户端提供了某些类型的服务,例如访问服务器主机上的文件
可以将服务器划分为两种类型:迭代的(iterative)与并发的(concurrent)
迭代服务器会按照以下步骤工作:
- I1. 等待客户端请求
- I2. 处理客户端请求
- I3. 向发送请求的客户端发送响应
- I4. 回到 I1
迭代服务器的问题在于,I2 可能会花很长的时间,在这段时间里,其它客户端无法使用服务
并发服务器会按照以下步骤工作:
- C1. 等待客户端请求
- C2. 启动一个新的服务器实例来处理这个客户端请求
根据底层操作系统的支持,这可能会创建一个新的进程、任务或线程
这个新的服务器实例会处理客户端的整个请求
请求任务完成后会终止这个新的服务器
原服务器可以并发地继续执行 C3,不用等待这个新服务器实例处理请求 - C3. 回到 C1.
并发服务器的好处是,只需要创建一个新的服务器实例来处理客户端请求
每个客户端本质上都拥有一个属于自己的服务器
只要服务器的操作系统支持并发程序,多个客户端就可以并发地使用服务
将服务器而不是客户端划分为迭代的与并发的,是因为客户端无法判断自己到底是在访问迭代服务器还是并发服务器
我们使用的术语客户端(client)与服务器(server)指的是应用程序,而不是用来运行它们的计算机系统
有时,同样的术语会被用来指代硬件,比如把多数时候运行服务器应用程序的硬件称为服务器
虽然这些术语有些不精确,但在实践中已经够用了
所以我们常常会发现,一个服务器(硬件意义的服务器)上运行了多个服务器(软件意义的服务器)