HTTP 消息结构

HTTP 是基于客户端/服务端(C/S)的架构模型,通过一个可靠的链接来交换信息,是一个无状态的请求/响应协议。一个 HTTP “客户端”是一个应用程序(Web浏览器或其他任何客户端),通过连接到服务器达到向服务器发送一个或多个 HTTP 的请求的目的。

一个 HTTP “服务器”同样也是一个应用程序(通常是一个 Web 服务,如 Apache Web 服务器或 IIS 服务器等),通过接收客户端的请求并向客户端发送 HTTP 响应数据。

HTTP 使用统一资源标识符(Uniform Resource Identifiers, URI)来传输数据和建立连接。一旦建立连接后,数据消息就通过类似 Internet 邮件所使用的格式 [RFC5322] 和多用途 Internet 邮件扩展(MIME)[RFC2045] 来传送。

客户端请求消息

客户端发送一个HTTP请求到服务器的请求消息包括以下格式:请求行(方法-URI-协议/版本)、请求头部、空行和请求数据四个部分组成,下面是一个HTTP请求包(GET)的例子:

1
2
3
4
5
6
7
GET /index.php HTTP/1.1
Accept-Language: zh-cn
Connection: Keep-Alive
Host: 192.168.0.106
Content-Length: 37
userName=new_andy&password=new_andy
  • 请求包的第一行是方法-URI-协议/版本:GET 就是请求方法,根据 HTTP 标准,HTTP 请求可以使用多种请求方法。HTTP 1.1支持七种请求方法:GET、POST、HEAD、OPTIONS、PUT、DELETE 和 TRACE 等,常用的为请求方法是 GET 和 POST

  • /index.php 表示 URI, URI 指定了要访问的网络资源

  • HTTP/1.1 是协议和协议的版本

  • 最后一行 userName=new_andy&password=new_andy 为正文,正文与 HTTP 头部有一个空行(\r\n)分隔。这里需要说明的一点,其中 Content-Length 说明正文的长度,有的正文长度没有在头部说明,只是标明 Transfer-Encoding: chunked

请求包的头部还会包含许多有关客户端环境和请求正文的有用信息,这里不再描述,下图给出了请求报文的一般格式:

http-request-message

服务器响应消息

HTTP响应也由四个部分组成,分别是:状态行(协议-状态代码-描述)、响应头、空行和响应正文。下面是一个 HTTP 应答的例子:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
HTTP/1.1 200 OK
Server: Microsoft-IIS/4.0
Date: Mon, 3 Jan 2005 13:13:33 GMT
Content-Type: text/html
Last-Modified: Mon, 11 Jan 2004 13:23:42 GMT
Content-Length: 90
<html>
<head>
<title>解读HTTP包示例</title>
</head>
<body>
Hello WORLD!
</body>
</html>

HTTP 应答包的第一行类似于 HTTP 请求的第一行,表示所用的协议是 HTTP 1.1,服务器处理请求的状态码 200。
应答头也和请求头一样包含许多有用的信息,例如服务器类型、日期时间、内容类型和长度等。应答的正文就是服务器返回的 HTML 页面。应答头和正文之间也用 CRLF 分隔,看下图分析:

http-response-message

HTTP 响应报文的主要特点

每一个请求报文发出后,都能收到一个响应报文,响应报文的第一行就是状态行。状态行包含三项内容:HTTP 的版本,状态码,以及解释状态码的简单语句。状态码都是三位数字的,分为 5 大类共 33 种。例如:

  • 1xx: 表示通知信息的,如请求收到了或正在进行处理

  • 2xx: 表示成功,如接受或是知道了

  • 3xx: 表示重定向,如要完成请求还必须采取下一步的行动

  • 4xx: 表示客户的差错,如请求中有错误的语法或不能完成

  • 5xx: 表示服务器的差错,如服务器失效无法完成请求