HTTP 速览

HTTP 的标准是由 IETF 组织制定,跟它相关的标准:

HTTP Documentation (httpwg.org)

HTTP/1.1 相关

中文翻译: duoani/HTTP-RFCs.zh-cn: 翻译 HTTP 相关的 RFC (中英文对照) (github.com)

HTTP/2 相关

中文翻译: abbshr/rfc7540-translation-zh_cn: RFC 7540 - HTTP/2 中文翻译版 (github.com)

HTTP 协议是基于 TCP 协议实现的,在 TCP 的基础上规定了一个 Request-Response 的模式。这个模式就是客户端发送消息给服务端,服务端才能返回消息给客户端,服务端不能主动发送消息。

HTTP 协议格式

HTTP 协议大概可以划分成 Request 和 Response。

Request

Request 是客户端需要发送到服务端的数据,可以分成下面这三部分:

  • Request-Line(请求行)
  • method(方法)
  • URL
  • version(版本)
  • request-header(头)
  • message-body(实体)

具体的数据格式:

GET /hello.txt HTTP/1.1
User-Agent: curl/7.16.3 libcurl/7.16.3 OpenSSL/0.9.7l zlib/1.2.3
Host: www.example.com
Accept-Language: en, mi

sp 是空格,cr 是 \r , lf 是 \n

Response

Response 是服务端返回给客户端的数据,对应的也可以分成三部分:

  • Response Line(响应行)

  • version(版本)

  • status code(状态码)

  • status text(状态文本)

  • Response Header(响应头)

  • message-body(实体)

HTTP/1.1 200 OK
Date: Mon, 27 Jul 2009 12:28:53 GMT
Server: Apache
Last-Modified: Wed, 22 Jul 2009 19:15:56 GMT
ETag: “34aa387-d-1568eb00”
Accept-Ranges: bytes
Content-Length: 51
Vary: Accept-Encoding
Content-Type: text/plain

Hello World! My payload includes a trailing CRLF.

响应状态码

HTTP 2

HTTP2 是 HTTP1.1 的升级版,HTTP2 相对于 HTTP1.1 来说主要有下面几点的改进:

  1. 对 HTTP 的头进行压缩,对于相同的头只需要发送索引表中的索引。解决了 HTTP1.1 每次都要将 header 来回传送。
  2. 支持服务端推送。能够在客户端发送第一个请求时,提前把一部分内容推送给客户端。这可以避免客户端请求顺序带来的并行度不高,从而导致的问题。
  3. 支持 TCP 的连接复用。使用同一个 TCP 连接来传输多个 HTTP 请求,避免了 TCP 连接时的三次握手开销,和初建 TCP 连接时传输窗口小的问题。