Dawn's Blogs

分享技术 记录成长

0%

凤凰架构笔记 (4) 透明多级分流系统之传输链路

传输链路

数据通过 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)作为底层协议。