Skip to content
On this page

HTTP 各版本

1991年  HTTP/0.9 仅支持GET请求,不支持请求头

1996年  HTTP/1.0 默认短连接(一次请求建议一次TCP连接,请求完就断开),支持GET、POST、 HEAD请求

1999年  HTTP/1.1 默认长连接(一次TCP连接可以多次请求);支持PUT、DELETE、PATCH等六种请求

增加host头,支持虚拟主机;支持断点续传功能

2015年  HTTP/2.0 多路复用,降低开销(一次TCP连接可以处理多个请求);

服务器主动推送(相关资源一个请求全部推送);

解析基于二进制,解析错误少,更高效(HTTP/1.X解析基于文本);

报头压缩,降低开销。

HTTP/1.0 和 HTTP/1.1 有什么区别

长连接

HTTP/1.1 支持长连接和管道化连接,在一个 TCP 连接上可以传送多个 HTTP 请求,避免了因为多次建立 TCP 连接的时间消耗和延时

缓存处理

HTTP/1.1 新增了 ETagIf-Unmodified-SinceIf-MatchIf-None-Match 等新的请求头来控制缓存

带宽优化以及网络连接的使用

HTTP/1.1 在请求头中引入了 range,支持断点续传的功能

Host 头处理

在 HTTP/1.0 中认为每台服务器都有唯一的 IP 地址,但随着虚拟主机技术的发展,多个主机共享一个 IP 地址越发普遍,HTTP/1.1 的请求消息和响应消息都应该支持 Host 头域,且请求消息中如果没有 Host 头域会报 400 错误

HTTP/1.1 和 HTTP/2.0 有什么区别

二进制分帧

  • :HTTP/2 数据通信的最小单位消息,指的是 HTTP/2 中逻辑上的 HTTP 消息,例如请求和响应等,消息由一个或多个帧组成。
  • :存在于连接中的一个虚拟通道。流可以承载双向消息,每个流都有一个唯一的整数 ID

HTTP/2 采用二进制格式传输数据,而非 HTTP/1.x 的文本格式,二进制协议解析起来更高效。

头部压缩

HTTP/1.x 会在请求和响应中重复地携带不常改变的、冗长的头部数据,给网络带来额外的负担。

  • HTTP/2 在客户端和服务端使用 “首部表” 来跟踪和存储之前发送的键值对,对于相同的数据,不再通过每次请求和响应发送;
  • 首部表在 HTTP/2 的连接存续期内始终存在,有客户端和服务端共同渐进地更新;
  • 每个新的首部键值对要么被追加到当前表的末尾,要么替换表中的值。

你可以理解为只发送差异数据,而不是全部数据,从而减少头部的信息量。

image

服务端推送

服务端可以在发送 HTML 时主动推送其他资源,而不是等浏览器解析到相应位置,发起请求再响应。例如服务端可以主动把 JS、CSS 文件推送给客户端,而不需要客户端解析 HTML 时在发送这些请求。

服务端可以主动推送,客户端也有权利选择是否接受。如果服务端推送的资源已经被浏览器缓存过,浏览器可以通过发送 RST_STREAM 帧来拒收。主动推送也遵守同源策略,服务器不会随便推送第三方资源给客户端。

多路复用

HTTP/1.x 中,如果想并发多个请求,必须使用多个 TCP 连接。但浏览器为了控制资源,还会对单个域名有 6-8 个TCP 连接的请求限制,同时当带宽不足时,多个 tcp 还会出现竞争带宽的情况。

HTTP/2 中:

  • 同域名下所有通信都在单个连接中完成;
  • 单个连接可以承载任意数量的双向数据流;
  • 数据流以消息的形式发送,而消息又由一个或多个帧组成,多个帧之间可以乱序发送,因为根据帧首部的流标识可以重新组装

image

HTTP/3

HTTP/2 的缺陷

TCP 的队头阻塞

在 TCP 传输过程中,由于单个数据包的丢失而造成的阻塞称为 TCP 上的队头阻塞。HTTP/2 只解决了应用层面的队头阻塞,队头阻塞的问题还存在于 TCP 协议本身。

TCP 建立连接的延时

TCP 以及 TCP + TLS 建立连接的所产生的延时也是影响传输效率的一个主要因素。

TCP 协议僵化

中间件僵化

我们把互联网各处搭建的设备叫做中间设备(中间件),比如路由器、NAT、防火墙、交换机等,它们通常以来一些很少升级的软件,这些软件大量使用 TCP 特性,设置之后便很少进行更新。这就对我们更新 TCP 的时候造成了困难,新协议的数据包经过这些中间件时,它们不会去理解包的内容从而丢弃了这些数据包。

操作系统

因为 TCP 协议都是通过操作系统来实现的,应用程序只能使用不能修改,通常操作系统的更新都滞后于软件的更新,所以想要更新操作系统内核中的 TCP 协议也是非常困难的。

QUIC 协议

HTTP/3 选择了一个折中的方法 -- UDP 协议。 基于 UDP 实现了类似于 TCP 的多路数据流、传输可靠性等功能,我们把这套功能称为 QUIC 协议。

  • 实现了类似 TCP 的流量控制、传输可靠性功能
  • 集成了 TLS 加密功能
  • 实现了 HTTP/2 中的多路复用功能
  • 实现了快速握手功能

原文:https://i-want-offer.github.io/FE-Essay/%E5%89%8D%E5%90%8E%E7%AB%AF%E9%80%9A%E4%BF%A1/HTTP%E7%89%88%E6%9C%AC.html

MIT Licensed