web服务器会执行的基本任务
- 建立连接——接受一个客户端连接,或者如果不希望与这个客户端建立连接,将其关闭
- 接收请求——从网络中读取一条HTTP请求报文
- 处理请求——对请求报文进行解释,并采取行动
- 访问资源——访问报文中指定的资源
- 构建响应——创建带有正确首部的HTTP响应报文
- 发送响应——将响应回送给客户端
- 记录事务处理过程——将与已完成事务有关的内容记录在一个日志文件中
接受客户端连接
当客户端发起一个到服务器的TCP连接时,服务器会建立连接,并从TCP连接中将IP地址解析出来。一旦新的连接建立并被接受,服务器就会将新连接添加到其现存web服务器连接列表中,做好监视连接上的数据传输的准备。当然,web服务器还可以随意拒绝或立即关闭任意一条连接。
有些web服务器支持IETF(I
nternet Engineering Task Force)的ident协议,下面是wiki中关于IDENT协议的一段
The
Ident Protocol
(
Identification Protocol
,
IDENT
), specified in
RFC 1413
, is an
Internet
protocol
that helps identify the user of a particular
TCP
connection. One popular
daemon program
for providing the ident service is
identd
.
The Ident Protocol is designed to work as a server
daemon
, on a
user
's computer, where it receives requests to a specified
port
, generally 113. In a query, a client specifies a pair of
ports
(a local and a remote port). The server will then send a specially designed response that identifies the username of the user who runs the program that uses the specified pair of ports.
完整内容请访问wiki中关于Ident_protocol的解释
简单来说 ident协议就是一个运行在客户端的一个程序,会在特定端口上监听ident请求,一般是服务器向客户端发送ident请求,然后ident程序就会然后客户端的ident用户名给服务器。服务器拿到发情HTTP连接的用户名,对服务器的日志记录很有用,在通用日志格式(Common Log Format)中,第二个字段中就包含了每条HTTP请求的ident用户名。
下图是服务器向客户端请求ident用户名的示意图

接收请求报文
解析请求报文时,web服务器会:
- 解析请求行,查找请求方法、指定的资源标识符以及版本号,各项之间由一个空格分隔,并以一个回车换行(CRLF:Carriage-Return Line-Feed)序列作为行的结束
- 读取以CRLF结尾的报文首部
- 监测以CRLF结尾的、标识首部结束的空行(如果有的话)
- 如果有的话(长度由content-length首部指定),读取请求主体
有些web服务器为了后面便于对报文进行操作,会将解析后的报文重新用内部数据结构来存储。例如

下面是四种不痛的web服务器的结构

分别是单线程服务器、多进程服务器、I/O服用服务器以及服用的多线程服务器
其中,I/O服用服务器是这样工作的:同时监听所有连接上的活动,当连接的状态发生变化时(比如,有数据可用,或者出现错误),就对那条连接进行少量处理,处理结束后,将数据返回到开放连接列表中,等待下一次状态变化。只有在有事情可做的时候才对连接进行处理,在空闲连接上等待的时候并不会绑定线程和进程。
服务器其他的一些操作,本章介绍的内容都比较简单,所以没什么好说的,等到后面有详细说明的时候再写。