web服务器
web服务器实现了http和相关的tcp连接处理,负责管理web服务器提供的资源,以及对服务器的配置,控制以及拓展等方面的管理
web服务器逻辑实现了http协议,并负责提供web服务器的管理功能,web服务器逻辑和操作系统共同负责了tcp连接,底层操作系统负责管理底层计算机系统的硬件细节,提供了tcp/ip的网络支持,负责装在web资源的文件系统以及控制当前计算活动的进程管理系统。
实际的web服务器的步骤
- 建立连接-接受一个客户端连接,或者如果不希望和这个客户端建立连接,就将其关闭
- 接收处理-从网络中读取一条HTTP请求报文
- 处理请求-对请求报文进行解释,并采取行动
- 访问资源-访问报文中指定的资源
- 构建响应-创建带有正确首部的http响应报文
- 发送响应-将响应发送给客户端
- 记录事务处理过程-将已经完成事务的内容记录在一个日志文件中
接受客户端连接
如果客户端已经打开了一条服务器的持久连接,可以使用连接来发送他的请求。否则客户端需要打开一条新的服务器连接
处理新的连接
客户端请求一条到web服务器的tcp连接的时候,web服务器会建立起来,判断另一端是哪个客户端,从tcp连接中将ip地址解析出来,一旦建立新的连接并被接受,服务器就会将新的连接添加到现存的web服务器列表中,做好监视连接上数据的准备。
web服务器可以随意的拒绝或者立即关闭任意一条连接,有些web服务器会因为客户端的ip地址或者主机名是未认证的,或者是已知的恶意客户端而关闭连接。web服务器可以使用其他的识别技术。
客户端主机名识别
可以使用反向dns对大部分web服务器进行配置,以便将客户端ip地址从转换为客户端主机名,web服务器可以将客户端主机名用于详细的访问控制和日志记录。
主机名查找会花费大多时间,这样会降低web事务处理的速度,很多大容量web服务器会禁止主机解析,只允许对特定的内容进行解析。
通过ident确定客户端用户
有些web服务器还支持IETF的ident协议,可以通过这个协议找到http连接的用户名,这些信息对web服务器的日志记录很有用。
如果客户端支持ident协议,就在tcp端口113上监听ident请求,客户端打开了一条http连接,然后服务器打开自己到客户端ident服务器端口113的连接,发送一条简单的请求,询问与新连接对应的用户名,并从客户端解析出包含用户名的响应。
ident在组织内部可以很好的工作,但是在互联网上不能很好的运作。
- 很多客户端pc没有运行ident识别协议守护进程软件
- ident协议会使HTTP事务处理产生严重的时延
- 很多防火墙不允许ident流量接入
- ident协议不安全,容易被伪造
- ident协议不支持虚拟ip地址
- 暴露客户端的用户名还涉及到隐私的问题
接受请求报文
连接上有数据到达的时候,web服务器会从网络连接中读取数据,并将请求报文中的内容解析出来。
解析请求报文的时候,web服务器会
- 解析请求行,查找请求方法,指定的资源标识符以及版本号,各项之间有一个空格分割,并且以一个回车符作为行的结束。
- 读取crlf结尾的报文首部
- 检测到crlf结尾的,标识首部结束的空行
- 如果有的化,长度由content-length首部指定,读取请求主体
报文的内部表示法
有些web服务器还会便于进行报文操作的内部数据结构来存储请求报文,数据结构中可能包含有指向请求报文中各个片段指针及其长度,这样就可以将这些首部放到一个快速查询表中,以变快速的访问特定首部的具体值了
连接的输入/输出处理结构
高性能的web服务器能够同时支持数千条连接,这些连接使得服务器可以与来自世界各地的客户端进行同行,每个客户端都向服务器打开了一条或者多条连接, 某些连接可能在快速的向web服务器发送请i去,而其他的一些连接则可能慢慢在发送,或者不经常发送,还有一些是空闲的,安静的等待将来可能出现的动作。
- 单线程的web服务器
单线程的web服务器一次只处理一个请求,知道处理完成为止,一个事务处理结束之后,才能去处理下一条连接,这种结构易于实现,但是在处理过程中,所有其他的连接会被忽略。 - 多进程以及多线程web服务器
多进程和多线程web服务器用多个进程,或者使用更高效的线程为请求进行处理,可以根据需要创建,或者预先创建一些线程或者进程。有些服务器会为每条连接分配一个线程或者进程,当服务器同时要处理成百上千甚至数以万计的连接的时候,需要的进程或者线程数量可能会消耗太多的内存或者系统资源 - 复用io的服务器
为了支持大量的连接,很多web服务器都采用了复用结构,在复用结构中,要同时监视所有连接上的活动,当连接的状态发生变化的时候,就对那条连接进行少量的处理,处理结束以后,将连接返回到开放连接列表中,等待下一次的状态变化。只有在有事情做的时候才会对连接进行处理。在空闲连接上等待的时候不会绑定线程或者进程。 - 复用的多线程web服务器
有些系统会将多线程和复用功能结合在一起,利用计算机平台上的多个cpu,多个线程中的每一个都在观察打开的连接或者打开的连接中的一个子集,并对每条连接执行少量的任务。
处理请求
一旦web服务器接收到了请求,就可以根据方法,资源,首部和可选的主体部分来对请求进行处理了。
有的方法要求请求报文中必须带有实体主体的部分的数据,其他方法允许有请求的主体部分,也允许没有,少数方法禁止在请求报文中包含实体的主体数据。