HTTP 报文

媒体类型

为了区分不同数据类型,HTTP 给每种通过 Web 传输的对象打上了名为 MIME 类型的数据格式标签,当 Web 浏览器从服务器中取出一个对象时,会去查看相关的

常见的 MIME 类型:

  • HTML 格式的文本文档由 text/html 类型来标记。
  • 普通的 ASCII 文本是有 text/plain 类型来标记。
  • JPEG 图片为 image/jpeg 类型
  • GIF 图片为 image/gif 类型
  • Apple QuickTime 视频为 video/quicktime 类型
  • 微软的 PowerPoint 演示文件为 application/vnd.ms-powerpoint 类型。

HTTP 报文

一个 HTTP 事务由一条(客户端发往服务器的)请求命令和一个(从服务器返回给客户端的)响应结果组成。这种通信是通过名为 HTTP 报文(HTTP message)的格式化数据块进行的如图所示:

报文实例

浏览器发送了一条 HTTP 请求报文。这条请求的起始行中有一个 GET 命令,且本地资源为 /tools.html 。 这条请求说明它使用的是 1.0 版的 HTTP 协议。 请求报文没有主体,因为从服务器上 GET 一个简单的文档不需要请求数据。

服务器会回送一条 HTTP 响应报文。这条响应中包含了 HTTP 的版本号(HTTP/1.0)、 一个成功状态码(200)、一个描述性的原因短语(OK), 以及一块响应首部字段, 在所有这些内容之后跟着包含了所请求文档的响应主体。 Content-Length 首部说明了响应主体的长度, Content-Type 首部说明了文档的 MIME 类型。

解析实例

  1. 请求

    • 请求行:包含了请求方法、请求资源路径、HTTP 协议版本
      GET /tools.html HTTP/1.1
    • 请求头:包含了对客户端的环境描述、客户端请求的主机地址等信息

      Host: www.joes-hardware.com     // 客户端想访问的服务器主机地址
      User-Agent: Mozilla/4.75 (Win98; U)
      // 客户端的类型,客户端的软件环境
      Accept: text/html, image/gif, image/jpeg     // 客户端所能接收的数据类型
      Accept-Language: en     // 客户端的语言环境
      Accept-Encoding: gzip     // 客户端支持的数据压缩格式
    • 请求体:客户端发给服务器的具体数据,比如文件数据

  2. 响应:服务器返回客户端想要的数据

    • 客户端向服务器发送请求,服务器应当做出响应,即返回数据给客户端
    • HTTP 协议规定:1个完整的响应包含以下内容:

      • 状态行:包含了 HTTP 协议版本、状态码、状态英文名称

        HTTP/1.1 200 OK

      • 响应头:包含了对服务器的描述、对返回数据的描述

        Server: Apache-Coyote/1.1         // 服务器的类型
        Content-Type: image/jpeg         // 返回数据的类型
        Content-Length: 56811         // 返回数据的长度
        Date: Mon, 23 Jun 2014 12:54:52 GMT    // 响应的时间
      • 实体内容:服务器返回给客户端的具体数据,比如文件数据

HTTP 报文包括以下是三个部分

  • 起始行

    报文的第一行就是起始行,在请求报文中用来说明要做些什么, 在响应报文中说 明出现了什么情况。

  • 首部字段

    起始行后面有零个或多个首部字段。 每个首部字段都包含一个名字和一个值, 为 了便于解析, 两者之间用冒号(:)来分隔。 首部以一个空行结束。 添加一个首 部字段和添加新行一样简单。

  • 主体

    空行之后就是可选的报文主体了,其中包含了所有类型的数据。 请求主体中包括 了要发送给 Web 服务器的数据;响应主体中装载了要返回给客户端的数据。 起 始行和首部都是文本形式且都是结构化的, 而主体则不同, 主体中可以包含任意 的二进制数据(比如图片、视频、音轨、软件程序)。 当然, 主体中也可以包含 文本。

整理自《HTTP 权威指南》