浏览器中的网络,主要介绍的 HTTP 协议,它是浏览器和服务器之间的通信语言,接下来从浏览器发展的视角介绍 HTTP 演进
一、完成使命的 HTTP/1
1.1、超文本传输协议 HTTP/0.9
HTTP/0.9 在 1991 年提出,最开始的需求是为了学术交流,在网络之间传输 HTML 超文本内容即可,所以被称为 超文本传输协议,有以下几个特点
- 只有一个请求行,并没有 HTTP 请求头和请求体;
- 服务器也没有返回头信息,仅返回数据
- 因为文件都是 HTML 格式, 返回的文件内容是以 ASCII 字符流 来传输的
1.2、被浏览器推动的 HTTP/1.0
网景公司在 1994 年推出的浏览器,让网络不再局限在学术交流方面,而是带来了更新的需求,浏览器中展示的不止 HTML,还包括 JS,CSS,图片,视频等不同类型的文件,因此 HTTP/1.0 首先需要解决的是不同类型文件的下载,同时文件格式不能局限于 ASCII 编码
HTTP/1.0 中引入了请求头和响应头,来支持下载不同类型的数据
发起请求时
浏览器通过 HTTP 请求头告诉服务器它期待服务器返回什么类型的文件、采取什么形式的压缩、提供什么语言的文件以及文件的具体编码
accept: text/html accept-encoding: gzip, deflate, br accept-Charset: ISO-8859-1,utf-8 accept-language: zh-CN,zh
响应请求时
服务器会通过 HTTP 响应头告诉浏览器返回的数据类型、编码类型已经压缩方式等
content-encoding: br content-type: text/html; charset=UTF-8
请求/响应头除了支持下载不同类型的数据,还新增了其他新特性
- 引入状态码
- 提供了 Cache 机制,减少服务器压力
- 请求头中还加入了用户代理的字段,帮助服务器统计客户端的基础信息
1.3、缝缝补补的 HTTP/1.1
HTTP/1.1 是在 HTTP/1.0 的主要问题上进行了改进,包括以下几点
1.3.1、改进持续连接
HTTP/1.0 的缺陷
每个请求都要经历 建立 TCP 连接、传输数据、断开 TCP 连接 3 个阶段
改进
HTTP/1.1 增加持久连接的方法,在一个 TCP 连接上可以传输多个 HTTP 请求,默认开启,请求头为
Connection:keep-alive
。其优势在于有效减少 TCP 建立连接和断开连接的次数,减少了服务器额外的负担
目前浏览器中对于同一个域名,默认允许同时建立 6 个 TCP 持久连接
1.3.2、不成熟的 HTTP 管道化
出现的原因
持久连接虽然减少 TCP 连接,断开次数,但它需要等到前面的请求返回之后,才能进行下一次请求;如果 TCP 通道中的某个请求因为某些原因没有及时返回,那么就会阻塞后面的所有请求,这就是 队头阻塞 的问题
改进
HTTP 管道化就是为了解决 队头阻塞 的问题, 通过管道化技术将多个 HTTP 请求整批发送到服务端,服务端根据请求顺序返回响应数据
缺陷
例如:按照 A,B,C 顺序发起请求,服务端处理请求 A, B 需要 2s, 处理 C 只需 10s,A, B 不能立即返回,必要等到 C 处理结束,按照 A, B, C 的顺序返回
由于各种原因,FireFox、Chrome 等浏览器最终都放弃了管线化技术。
1.3.3、提供虚拟主机的支持
HTTP/1.0 的缺陷 在 HTTP/1.0 中,每个域名绑定了一个唯一的 IP 地址,因此一个服务器只能支持一个域名。
改进
虚拟主机技术实现在一台物理主机上绑定多个虚拟主机,每个虚拟主机都有自己的单独的域名,这些单独的域名都公用同一个 IP 地址
HTTP/1.1 的请求头中增加了 Host 字段,用来表示当前的域名地址
1.3.4、客户端 Cookie 、安全机制
二、目前流行的 HTTP/2
2.1、HTTP/1.1 的主要问题
2.1.1、对带宽的利用率不理想
TCP 启动慢
TCP 为了减少网络拥塞,TCP 发送数据的过程从最开始很慢的速度慢慢达到一个理想速度,这就是 TCP 慢启动,类似于汽车起步
多条 TCP 会竞争固定带宽
多个 TCP 连接时,当出现带宽不足,每个 TCP 连接都需要放缓接受数据的速度,但 TCP 连接之间不能协商让哪些关键资源优先下载
队头阻塞
HTTP 管道化并没有有效解决 队头阻塞 的问题
2.2、HTTP/2 新特性
针对 HTTP 1.1 的缺陷,HTTP2.0 有以下改进:
- 一个域名只使用一个 TCP 长连接来传输数据,减少 TCP 启动慢已经 TCP 连接之间的竞争
- 资源的并行请求,不需要等待其它请求完成
HTTP2.0 的改进都是引入 二进制分帧层 的基础上,利用 多路复用机制 来实现的
具体数据链路如下:
- 请求数据通过 二进制分帧层处理后,会被转换成一个个带有请求 ID 编号的帧
- 服务器接收到所有的帧后,会将相同 ID 的帧合并成一个完整的请求信息
- 同时,二进制分帧层会将所有的响应数据转换成一个个带有请求 ID 编号的帧
- 浏览器接收到响应帧后,会根据 ID 编号将帧的数据提交跟对应的请求
在 二进制分帧层 的基础上,HTTP 2.0 还支持以下新特性
- 设置请求的优先级
- 服务器推送
- 头部压缩
三、未来版本的 HTTP/3
3.1、HTTP/2 的缺陷
HTTP/2 解决了应用层面的队头阻塞问题, 但依然是基于 TCP 协议的,而 TCP 协议存在以下问题
3.1.1、TCP 的队头阻塞
TCP 队头阻塞:数据传输过程中,某个数据包丢包会导致整个 TCP 连接处于暂停状态,需要等待丢包的数据被重新传输过来
HTTP/1.1: 一个域名建立 6 个 TCP 连接,一个 TCP 连接发生阻塞,不影响其它 5 个 TCP 连接
HTTP/2 : 每个域名只有一个 TCP 长连接,多个请求都在同一个 TCP 管道中,某个数据丢包了,会影响该管道中所有的请求
有测试数据表明, 当系统丢包率达到 2%时,HTTP1.1 的传输效率反而比 HTTP 2 表现的更好
3.1.2、TCP 建立连接的延时
3.1.3、TCP 协议僵化
中间设备的老旧,操作系统的版本更新滞后
3.2、HTTP/3 新特性
HTTP/3 选择了一个折衷的方法——UDP 协议,基于 UDP 实现了类似于 TCP 的多路数据流、传输可靠性等功能,称为 QUIC 协议
QUIC 协议集合了以下几点功能
实现了类似 TCP 的流量控制、传输可靠性的功能
集成了 TLS 加密功能
实现了 HTTP/2 中的多路复用功能