传输链路
数据通过 HTTP 协议进行通信,所以这里的传输链路指的是 HTTP 在传输链路上的优化。
连接数优化
HTTP over TCP,需要三次握手才能进行传输,并且 TCP 还有慢启动的特性,所以减少连接数可以优化传输时延。
HTTP 1.x
在 HTTP 1.0 版本就已经支持连接复用技术(在 HTTP 1.0 默认关闭,在 HTTP 1.1 默认开启),即与服务器维护一个或者多个持久连接。客户端维护一个 FIFO 队列,每一次得到完整的响应后发出下一个请求。这种方法的问题在于队头阻塞,如果第一个请求的响应非常慢那么会直接阻塞后续请求的发出。
后续又提出 HTTP 管道复用技术,令 HTTP 服务器也维护一个 FIFO 队列,客户端一次性把所有的请求都发送给服务器,由服务端来安排返回顺序。由于 HTTP 管道需要多方共同支持,协调起来相当复杂,推广得并不算成功。
HTTP 2.0
HTTP 2.0 中,帧(Frame)是传输的最小单位,每一个帧都附带一个 ID 用于标识这个帧属于哪个流,从而可以通过不同流重组出 HTTP 请求和响应,被称为 HTTP 2 多路复用技术。HTTP 与同一个服务器只维护一个连接。
压缩
对响应内容进行压缩,可以有效的减少传输成本,对于文本传输数据量会降低至原来的 20%,图片等二进制数据则不适合压缩。
在服务器启用压缩时,在输出 Header 的时候还不能得到 Content-Length,所以在 HTTP 1.0 时压缩和持久连接是冲突的,因为持久连接通过 Content-Length 判断响应报文是否结束。
在 HTTP 1.1 中修复了这个缺陷,增加了分块传输编码技术。在响应 Header 中添加 Transfer-Encoding: chunked
,Body 中可以采用分块传输。分块包含十六进制的长度值和对应长度的数据内容,长度值独占一行,数据从下一行开始。最后以一个长度值为 0 的分块来表示资源结束。
HTTP 2.0 由于多路复用技术不用 Content-Length 判断报文的结束,所以是可以采用压缩的。
快速 UDP 网络连接
HTTP 3 的涉及重点在于用 UDP 替换 TCP,HTTP 3 使用 QUIC(Quick UDP Internet Connections)作为底层协议。