报文流

HTTP 报文是在 HTTP 应用程序之间发送的由文本形式的元信息 (meta-information)和可选的数据的数据块。

HTTP 使用流入 (inbound)和流出 (outbound)来描述事务处理 (transaction)的方向。报文流入源端服务器,工作完成之后,会流回用户的 Agent 代理中。

HTTP 报文会像河水一样流动。不管是请求报文还是响应报文,所有报文都会向下游 (donwstream)流动。所有报文的发送者都在接受者的上游 (upstream)。

报文的组成部分

HTTP 报文是简单的格式化数据块。每条报文都包含一条来自客户端的请求,或者一条来自服务器的响应。它们由三个部分组成:对报文进行描述的起始行 (start line)、包含属性的首部 (header)块,以及可选的、包含数据的主体 (body)部分。

起始行和首部就是由行 (CRLF) 分隔的 ASCII 文本。

实体的主体或者报文的主体是一个可选的数据块。与起始行和首部不同的是,主体可以包含文本或者二进制数据,也可以为空。

请求报文 (request message)

请求报文会向 Web 服务器请求一个动作。

<method> <request-url> <version>
<headers>

<entity-body>

响应报文 (response message)

响应报文会将请求的结果返回给客户端。

<version> <status> <reson-phrase>
<headers>

<entity-body>
  • 起始行 (start line)
    • 请求行 <method> <request-url> <version>

    • 响应行 <version> <status> <reson-phrase>

  • 方法 (method)

    客户端希望服务器对资源执行的动作。

    HTTP 定义了一组被称为安全方法的方法。 GET 方法和 HEAD 方法都被认为是安全的,这就意味着使用 GET 或者 HEAD 方法的 HTTP 请求都不会产生什么动作。不产生动作,在这里意味着 HTTP 请求不会在服务器上产生什么结果。

    方 法 描 述 是否包含主体
    GET 从服务器获取一份稳定
    HEAD 只从服务获取文档的首部
    POST 向服务器发送需要处理的数据
    PUT 将请求的主体部分存储在服务器上
    TRACE 对可能经过代理服务器传送到服务器上的去的报文进行跟踪
    OPTIONS 决定可以在服务器上执行哪些方法
    DELETE 从服务器上删除一份文档
  • 请求 URL (request-URL)

    命名了所请求的资源,或者 URL 路径组件的完整 URL。

  • 版本 (version)

    报文所使用的 HTTP 版本。

      HTTP/<major>.<minor>
    

    主要版本 (major) 和次要版本 (minor) 都是整数。

  • 状态码 (status-code)

    整体范围 已定义范围 分类
    100 ~ 199 100 ~ 101 信息提示
    200 ~ 299 200 ~ 206 成功
    300 ~ 399 300 ~ 305 重定向
    400 ~ 499 400 ~ 415 客户端错误
    500 ~ 599 500 ~ 505 服务器错误
  • 原因短语 (reason-phrase)

    数字状态码的可读版本,包含行终止序列之前的所有文本。原因短语只对人类有意义。

  • 首部 (header)

    可以有零个或者多个首部,每个首部都包含一个名字,后面跟着一个冒号 (:),然后是一个可选的空格,接着是一个值,最后是 CRLF。

    首部是有一个空行 (CRLF) 结束的,表示了首部列表和实体主体部分的开始。

    将长的首部行分为多行可以提高可读性,多出来的每行前至少要有一个空格或者制表符 (tab)。

    • 通用首部
    • 请求首部
    • 响应首部
    • 实体首部
    • 扩展首部
  • 实体的主体部分 (entity-body)

    实体的主体部分包含一个由任意数据组成的数据块。

    一组 HTTP 首部总是应该以一个空行 (CRLF) 结束,甚至即使没有首部和实体的主体部分也应如此。客户端和服务器也都应该接受那些没有最后那个 CRLF 的报文。


References

  1. HTTP权威指南