0%

浏览器工作原理学习笔记(六)-浏览器中的网络

本系列为极客时间上的《浏览器工作原理与实践》专栏的学习笔记

历史发展

HTTP 最早的一个版本是 HTTP/0.9 ,主要是为了学术交流的需求,因此设计的比较简单,没有请求头和响应头,也只能支持一种文件类型(html)的传输。

随着浏览器的推出,通过网络浏览各种文件的需求越来越多,因此就有了 HTTP/1.0 的推出,主要解决的是各种类型文件的下载问题,主要是通过增加请求头和响应头来解决,具体是:

  • 文件类型
  • 文件的压缩方法
  • 文件的语言类型
  • 文件的编码方式

随着技术的继续发展,需求也在迭代更新,新版本 HTTP/1.1 做了大量的优化工作,核心有以下几点:

  • 增加持久连接(默认开启)。在一个 TCP 连接上传输多个 HTTP 请求
  • 提供虚拟主机的支持。支持一台服务器可以提供多个域名,但是最终指向的是同一个 IP,所以请求头 需要增加字段 HOST 来表明该请求对应的哪个域名
  • 客户端 Cookie、安全机制

解决问题

HTTP/1.1 存在的一些问题:

  • TCP 的慢启动
  • 多条 TCP 连接存在带宽竞争的问题
  • HTTP/1.1 队头阻塞。一个 TCP 管道同一时刻只能处理一个请求,如果某个请求处理时间多长,就会导致其他请求处于等待过程

HTTP/2 的推出,主要是通过一个域名下只维持一个 TCP 连接和消除队头阻塞,来解决遗留问题。核心是通过多路复用技术来解决了 HTTP/1.1 的队头阻塞问题。

HTTP/2 的多路复用

HTTP/2 协议栈新增了一个二进制分帧层,来将各个请求数据转换为一个个带有请求 ID 编号的帧,通过协议栈发送给服务器。

服务器和浏览器,通过请求 ID 来将这些帧还原成一个个请求数据,继续处理。这样做的好处是,浏览器可以随时发送不同的请求,不用再等待上一个请求处理完成,也就解决了 HTTP/1.1 的队头阻塞问题。

同时还有其他的一些优点:

  • 可以设置请求的优先级
  • 服务器推送
  • 头部压缩

虽然 HTTP/2 引入一个二进制分帧层,但是语义和 HTTP/1.1 是一样的,也就是通信语言没有改变,变的是传输方式。这样对于开发人员是比较友好的,部署起来也比较简单,这也是 HTTP/2 能够更快的推广的原因。

HTTP/3

即使 HTTP/2 通过多路复用解决了 HTTP/1.1 的队头阻塞问题,但是底层上还是基于 TCP 协议,因此就有一个问题绕不开:

TCP 为了保证数据传输的可靠性,对于丢失的数据包会有重传机制,这就会导致其他数据包在重传时期无法得到处理,造成 TCP 队头阻塞。

除了 TCP 队头阻塞,较长的握手时间也会导致网络延迟的增加。

为了解决这些问题,同时也不能抛开 TCP (难度与成本太大),只能是引入一个新的协议:QUIC,这个协议集合了以下几点功能:

  • 实现了 TCP 的流量控制和传输可靠性
  • 集成了 TLS 的加密功能
  • 实现了 HTTP/2 的多路复用
    在同一个物理连接上有多个独立的逻辑数据流,实现数据流的单独传输,解决了 TCP 的队头阻塞问题
  • 实现了快速握手的功能

虽然 HTTP/3 有很多优点,但是由于动了底层协议,推广起来有来自各方面的挑战,等到最后大规模部署和优化会是一个比较缓慢的过程。