jinzhe

jinzhe

github
email

http的历史

http 是基于 TCP/IP 的应用层通信协议,用于定义客户端和服务器之间的通信规则。

http/0.9(1991)#

http 第一个有记录的版本是 1991 年提出的http/0.9,他是有史以来简单的协议。

  • 无请求头
  • 只支持GET方法
  • 只能返回HTML
GET /index.html

服务器可能返回以下信息

(res body)
(connection closed)

http/1.0(1996)#

  • 支持请求头和响应头(包括状态码、缓存、授权、字符集等)
  • 额外支持HEADPOST方法
  • 支持更多的响应格式如视频、文本、图像等

Warning

http/1.0 的主要缺点之一就是每个连接不能有多个请求。对于任何一个请求,都必须建立在新的连接上,会因为三次握手导致性能浪费。

GET /index.html HTTP/1.0
Host: jinzhe.cc
Accept: */*

服务器可能返回以下信息

HTTP/1.0 200 OK 
Content-Type: text/plain
Server: Apache 0.84

(res body)
(connection closed)

http/1.1(1999)#

  • 额外添加了PUTPATCHOPTIONSDELETE
  • 添加了Connection请求头,允许客户端和服务器指定连接的选项。
  • 管道化,客户端可以在同一连接上向服务器发送多个请求,而无需等待服务器的响应,并且服务器必须按照接收请求的顺序发送响应。客户端必须使用Content-Length识别结束位置。
  • 分块传输,当服务器无法真正找到Content-Length的时候,就会分块传输,并给每一个块加上Content-Length,服务器包含标头Transfer-Encoding: chunked

Warning

Content-Length并不能完全解决持久连接的问题,假如说数据是动态的,并且服务端无法知道内容长度,那么客户端就无法知道数据何时结束。
队头阻塞

SPDY(2009)#

  • 多路复用
  • 压缩
  • 优先级
  • 安全性

SPDY 的出现并不是取代 HTTP,而是在 HTTP 发出请求之前对其修改。它开始成为事实上的标准,大多数浏览器开始实现它。到了 2015 年,Google 不想出现两个相互竞争的标准,
所以它决定将 SPDY 合并到 HTTP/2.0 中并弃用 SPDY。

http/2.0(2015)#

HTTP/2 专为低延迟内容传输而设计,

  • 二进制,每个HTTP/2请求和响应都会被赋予一个唯一的流 ID,流是帧的集合,每个帧都包含包含帧类型、流 ID、帧长度等信息。
  • 多路复用,所有连接的请求和响应都在同一个 TCP 连接上完成。客户端异步发送,服务端异步响应,按流 ID 识别。
  • HPACK头部压缩,使用霍夫曼编码。
  • 服务器推送。无需客户端请求,推送给客户端资源。
  • 请求优先级,可以更改流的优先级。
  • 安全,尽管HTTP/2不要求按规范进行加密,但无论如何它在默认情况下已成为强制性。

三次握手#

Mermaid Loading...
加载中...
此文章数据所有权由区块链加密技术和智能合约保障仅归创作者所有。