HTTP/0.9
- 只有请求行,因为一个请求行足够表达要获取的内容
- 只有响应体,因为只要返回数据即可,不需要告诉客户端编码、语言等信息
- 返回的文件内容是以 ASCII 字符流来传输的,因为是获取 HTML 文件
HTTP/1.0
- 加上了请求行,告诉服务器返回什么类型的文件、采取什么形式的压缩、提供什么语言的文件以及文件的具体编码
accept: text/html
accept-encoding: gzip, deflate, br
accept-Charset: ISO-8859-1,utf-8
accept-language: zh-CN,zh
-
加上了响应头,比如 content-encoding 字段告诉浏览器最终的压缩类型 content-encoding: br content-type: text/html; charset=UTF-8 -
加上状态码 -
Cache 机制,用来缓存已经下载过的数据 -
用户代理:用于服务器需要统计客户端的基础信息
HTTP/1.1
- 改成持久连接
目前浏览器中对于同一个域名,默认允许同时建立 6 个 TCP 持久连接。
Connection: keep-alive
- 提供虚拟主机的支持: Host 字段
- 客户端 Cookie、安全机制
- 使用 CDN 的实现域名分片机制。
缺点: HTTP/1.1对带宽的利用率却并不理想
- TCP 慢启动
- 同时开启了多条 TCP 连接,那么这些连接会竞争固定的带宽。又无法区分是关键资源还是普通资源,导致一律放慢速度
- HTTP/1.1 队头阻塞的问题。
在一个 TCP 连接里,多个 HTTP 请求,前面的 HTTP 请求没结束之前,后面的 只能等待着
HTTP/2
一个域名只使用一个 TCP 长连接和消除队头阻塞问题。
TLS
一个域名只使用一个 TCP 长连接来传输数据, 实现资源的并行请求,服务器也可以随时返回处理好的请求资源给浏览器
- 多路复发: 带有 ID 编号的帧
协议栈中添加二进制分帧层(加上 ID 编号),就实现了 HTTP 的多路复用技术。 帧:HTTP/2 数据通信的最?单位消息:指 HTTP/2 中逻辑上的 HTTP 消息。例如请求和响应等,消息由?个或多个帧组成。 流:存在于连接中的?个虚拟通道。流可以承载双向消息,每个流都有?个唯?的整数ID - 可以设置请求的优先级
- 服务器推送,不需要浏览器发起请求,服务器主动将一些重要资源推送到浏览器
- 头部压缩
缺点:
- TCP 的队头阻塞:
在 TCP 传输过程中,由于单个数据包的丢失而造成的阻塞称为 TCP 上的队头阻塞。 管道中的任意一个数据丢失了,那之后的数据都需要等待该数据的重新传输 在 HTTP/2 中,多个请求是跑在一个 TCP 管道中的,如果其中任意一路数据流中出现了丢包的情况,那么就会阻塞该 TCP 连接中的所有请求。 - TCP 建立连接的延时
把从浏览器发送一个数据包到服务器,再从服务器返回数据包到浏览器的整个往返时间称为 RTT
HTTP/3:
基于 UDP 实现了类似于 TCP 的多路数据流、传输可靠性等功能,我们把这套功能称为 QUIC 协议
QUIC 协议
- 实现了类似 TCP 的流量控制、传输可靠性的功能。
- 集成了 TLS 加密功能
- 实现了 HTTP/2 中的多路复用功能
和 TCP 不同,QUIC 实现了在同一物理连接上可以有多个独立的逻辑数据流(如下图)。实现了数据流的单独传输,就解决了 TCP 中队头阻塞的问题。
实现了快速握手功能。
|