Skip to content

浏览器中的网络,主要介绍的 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  字段,用来表示当前的域名地址

二、目前流行的 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 的改进都是引入 二进制分帧层 的基础上,利用 多路复用机制 来实现的

http-cache

具体数据链路如下:

  • 请求数据通过 二进制分帧层处理后,会被转换成一个个带有请求 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 协议

http-cache

QUIC 协议集合了以下几点功能

  • 实现了类似 TCP 的流量控制、传输可靠性的功能

  • 集成了 TLS 加密功能

  • 实现了 HTTP/2 中的多路复用功能