基本模型

什么是服务器?

服务器是网络环境中的高性能计算机,它侦听网络上的其他计算机提交的服务请求,并提供相应的服务。 

什么是客户机?

连接服务器的计算机,客户机又称为用户工作站,是用户与网络打交道的设备,一般由微机担任,每一个客户机都运行在它自己的、并为服务器所认可的操作系统环境中。客户机主要享受网络上提供的各种资源。 

在TCP/IP网络中两个进程间的相互作用的主机模式是客户机/服务器模式(C/S):利用该模式我们能在一个统一的地方集中存放信息资源。一般将数据集中保存在某个数据库中,根据其他人或者机器的请求将信息投递给对方。

客户机/服务器关键在于信息是集中存放的

客户机/服务器模式的建立基于两点:

非对等作用
通信完全是异步的

客户机/服务器模式在操作过程中采取的方式是:主动请示方式

首先服务器方要先启动,并根据请示提供相应服务:
1、打开一通信通道并告知本地主机,它愿意在某一个公认地址上接收客户请求。
2、等待客户请求到达该端口。
3、接收到某一客户的服务请求,处理该请求并发送应答信号。
4、返回第二步,等待另一客户请求
5、关闭服务器。


服务器可以是面向连接的TCP协议,要求建立和释放连接,适用于可靠的交互过程;
服务器也可以是无连接的UDP协议,适用于可靠性要求不高的或实时的交互过程;
同一台机器可以有两种服务器软件的实现
一个服务器软件也可同时和TCP、UDP协议交互

服务器软件设计概述

简单服务器的算法:(只适用于最简单的服务)

创建套接字
绑定到一个熟知端口
期望在这个端口上接收请求
进入无限循环,接受客户请求并应答

循环服务器和并发服务器

循环服务器:一个时刻只处理一个请求

并发服务器:一个时刻可以处理多请求
    多数只提供表面并发:执行多个线程,每个线程处理一个请求
    使用表面并发的可能性:
        计算量小
        主要是异步I/O
        便于同时使用多个通信信道
    并发处理多个请求,而不是指下层是否使用了多个并发线程

循环服务器容易构建,但是性能差;并发服务器难以构建和设计,但是性能好

四种基本类型的服务器

循环的或者并发的
使用面向连接的或者无连接的传输

  • 无连接循环服务器

无连接循环服务器每次从套接字上读取一个客户端的请求->处理->然后将结果返回给客户机。

因为是无连接的,所以没有一个客户端可以老是占住服务端。只要处理过程不是死循环,服务器对于每一个客户机的请求总是能够满足

socket(...);
bind(...);
while(1)
{
   recvfrom(...);
   process(...);
   sendto(...);
}

  • 面向连接循环服务器

面向连接循环服务器接受一个客户端的连接,然后处理,完成了这个客户的所有请求后,断开连接。

面向连接循环服务器一次只能处理一个客户端的请求,只有在这个客户的所有请求满足后,服务器才可以继续后面的请求。

如果有一个客户端占住服务器不放时,其它的客户机都不能工作了,因此面向连接的服务器一般很少用循环服务器模型

socket(...);
bind(...);
listen(...);
while(1)
{
   accept(...);
   process(...);
   close(...);
}

  • 面向连接并发服务器

面向连接并发服务器的思想是每一个客户机的请求并不由服务器直接处理,而是由服务器创建一个子进程或子线程来处理。

socket(...);
bind(...);
listen(...);
while(1)
{
    accpet(...);
    if(fork(...) == 0)
    {
        process(...);
            close(...);
        exit(...);
    }
    close(...);
}
子进程返回值为0,父进程返回值为pid,错误返回值为负数

  • 无连接并发服务器

把并发的概念用于无连接就得到了无连接并发服务器模型。并发无连接服务器模型其实是简单的。和并发的面向连接服务器模型一样是创建一个子进程或子线程来处理的。

socket(...);         
bind(...);           
while(1)             
{                     
    recvfrom(...); //接收和处理客户端的UDP数据报
    if(fork(...)==0)  
    {
                process(...);
                sendto(...);
        }
}
  • 各个服务器使用的场合
循环的和并发的:
        如果循环方案产生的响应时间对应用来说足够,就可以使用循环;否则需要并发

真正的和表面上的并发性:
       若线程切换环境的开销大,服务器需要在多个连接之间共享或者交换数据,使用表面并发;
       使用线程切换开销不大或者要得到最高的执行效率,使用真正并发

面向连接的和无连接的:
       需要在广域网内处理可靠性问题时,应用面向连接的传输
       应用协议处理了可靠性问题,或者应用在局域网环境内,使用无连接的传输。
  • 服务器类型小结
循环的无连接服务器
    请求要求处理少,无状态的,最常见的

循环的面向连接服务器
    要求可靠传输的,对请求要求处理少的服务,较常见

并发的无连接服务器
    不常见,为每个请求创建一个新线程或进程

并发的面向连接服务器
    最一般的。可靠传输,并发处理多个请求
    多线程(进程)

并发服务器

  • 并发的概念

并发有真正的并发(并行: Parallelism )和表面上的并发(并发:Concurrency)(一般采用分时机制)

  • 网络中的并发
单个网络各个机器之间许多成对进程好像独立使用网络资源(通道,机器等)
一个计算机系统中存在并发(分时)
一组机器上所有的客户之间存在并发
  • 服务器中的并发
单个服务器必须并发处理多个传入请求
并发服务器可以让多个远程用户同时使用服务,实现起来比较复杂