服务器软件设计的算法和问题
概念性的服务器算法:创建一个socket,将它绑定到一个熟知的port上,并期望在这个port上接收请求,接着进入无限loop,在循环中,服务器接受来自client的下一个请求,处理请求,结构应答,然后将这个应答发回给客户。
Iterative server and concurrent server : iterative server 是在一个时刻只处理一
个请求的一种服务器实现。
Concurrent server 是在一个时刻可以处理多个请求的一种服务器。一般来说,并发服务器更难设计和构建,其最终代码页更复杂并且难以修改。
面对连接和无连接服务器:区别就是选择TCP还是UDP的问题。
因为已经选择了TCP的服务器,所以暂时不介绍UDP服务器问题。TCP服务器有点是容易编程,可靠性在协议上得到保证。
面向连接服务器缺点:要求对每个连接都有一个单独的socket,而无连接的设计则允许从一个socket上与多个主机通信。最大缺点是TCP在空闲连接上根本不发送任何分组,比如在资源的使用上,服务器拥有分配给改连接的数据接口,包括缓冲空间,并且这些资源不能被重新分配。
四种服务器类型:1.循环的无连接 2.循环的面向连接 3.并发的无连接 4.并发的面向连接。我们选择的是第四种。
服务器处理时间:request processing time 为服务器处理单个鼓励的请求所花的时间。Observed response time 为客户发送请求至服务器响应直接的全部delay. 很明显,ORT不可能小于RPT。若N代表请求队列的平均长度,对刚刚的请求来说,它的观测响应时间大约是N/2 + 1个服务器请求处理时间。
一个循环服务器是否够用?假设一个服务器设计能力可以处理K个客户,每个客户每秒发送R个请求,则此服务器的请求处理时间必须小于每请求1/KR秒。
用INADDR_ANY绑定熟知端口:bind为了某个套接字知名某个链接端点,它使用了结构sockaddr_in,该结构中含有IP地址和协议端口号。Bind不能只指明协议端口号而不指明IP地址。但是,如果选择指明的IP地址,那该主机只能有一个IP地址和服务器相连接。然而路由器或者多网卡机有多个IP,服务器就没办法得到其他IP的内容了。为了解决这个问题,socket定义了特殊常量INADDR_ANY,它可以代替IP地址,它指明了通配地址(wildcard address),它与该主机的任何一个IP地址都匹配。