文章目录
  1. 服务器程序的结构
  2. 服务器的接收操作
  3. 服务器解析请求消息并作出响应
  4. 浏览器接收响应并显示内容

服务器程序的结构

为保证服务器同时与多个客户端进行通信,服务器启动多个服务器程序一对一地与客户端交互。服务器程序的结构如下图所示:

 

服务器程序分为两个模块:等待连接模块与通信模块;在服务器启动并完成初始化操作后,它就会运行等待连接模块;等待连接模块创建套接字,然后进入等待连接的暂停状态,直到客户端发起连接;等待连接模块恢复运行并接受连接,启动客户端通信模块,传递套接字的副本给通信模块;

通信模块使用已连接的套接字与客户端通信。由于在服务器上,一个端口可能与多个客户端建立通信,因此会有多个套接字的端口号相同,于是不能只通过端口号来指定套接字(在客户端可以这样做),还需要加上源IP,因为各个客户端的IP肯定是不同,每个套接字与客户端一一对应,这样就能准确指定套接字。

服务器的接收操作

数据经网卡、MAC层、IP层到达TCP层(对于HTTP消息来说),TCP的数据收发详见第二章,只剩下TCP的断开操作还未介绍;TCP断开操作称为四次挥手,示意图如下:

 

HTTP协议规定服务器返回响应消息后主动断开连接,于是服务器端执行TCP断开操作;服务器端发送FIN位置1的TCP头部(表面自己已经没有要发送的消息),客户端收到后返回确认接收的TCP头部,客户端仍然可以给服务器端发送消息,等客户端处理完数据可以结束与服务器端的连接时,客户端发送FIN位置1的TCP头部,处于等待状态的服务器返回确认接收的TCP头部,到此TCP连接彻底断开。

服务器解析请求消息并作出响应

Web服务器公开的目录并不是磁盘上的实际目录,而是如下图所示的虚拟目录:

 

Web服务器根据请求消息中的源IP、用户名&密码、客户端域名进行访问控制;只有满足条件的请求消息才会对请求消息作出响应。

对于运行访问的请求消息,若URL指定HTML文件或图片,直接将文件内容作为响应消息返回客户端即可;若URL指定的是一个程序,则服务器要从消息中获取运行程序所需参数(方法为GET,参数在URL之后;方法为POST,参数在消息体中)并运行程序然后将输出结果作为响应消息返回客户端。

接下来Web服务器将响应消息委托给协议栈发送给客户端。

浏览器接收响应并显示内容