HTTP/1:HTTP性能优化
HTTP 是浏览器中最重要且使用最多的协议,是浏览器和服务器之间的通信语言,也是互联网的基石。
-
超文本传输协议 HTTP/0.9
用来在网络之间传递 HTML 超文本的内容,所以被称为超文本传输协议。采用了基于请求响应的模式,从客户端发出请求,服务器返回数据。- 只有一个请求行,并没有HTTP 请求头和请求体
- 服务器也没有返回头信息
- 返回的文件内容是以 ASCII 字符流来传输的
-
被浏览器推动的 HTTP/1.0
支持多种类型的文件下载是 HTTP/1.0 的一个核心诉求,而且文件格式不仅仅局限于 ASCII 编码,还有很多其他类型编码的文件。
HTTP/1.0 引入了请求头和响应头、状态码、Cache 机制等。
-
缝缝补补的 HTTP/1.1
-
改进持久连接
HTTP/1.1 中增加了持久连接的方法,它的特点是在一个 TCP 连接上可以传输多个 HTTP 请求,只要浏览器或者服务器没有明确断开连接,那么该 TCP 连接会一直保持。 -
不成熟的 HTTP 管线化
HTTP/1.1 中试图通过管线化的技术来解决队头阻塞的问题。HTTP/1.1 中的管线化是指将多个 HTTP 请求整批提交给服务器的技术,虽然可以整批发送请求,不过服务器依然需要根据请求顺序来回复浏览器的请求。 -
提供虚拟主机的支持
HTTP/1.1 的请求头中增加了Host 字段,用来表示当前的域名地址,这样服务器就可以根据不同的 Host 值做不同的处理。 -
对动态生成的内容提供了完美支持
HTTP/1.1 引入了 Chunk transfer 机制。服务器会将数据分割成若干个任意大小的数据块,每个数据块发送时会附上上个数据块的长度,最后使用一个零长度的块作为发送数据完成的标志。这样就提供了对动态内容的支持。 -
客户端 Cookie、安全机制
-
-
HTTP/1.1 为网络效率做了大量的优化,最核心的有:
- 增加了持久连接;
- 浏览器为每个域名最多同时维护 6 个 TCP 持久连接;
- 使用 CDN 的实现域名分片机制。
HTTP/2:如何提升网络速度?
-
HTTP/1.1 的主要问题
HTTP/1.1对带宽的利用率并不理想。带宽是指每秒最大能发送或者接收的字节数。我们把每秒能发送的最大字节数称为上行带宽,每秒能够接收的最大字节数称为下行带宽。
主要原因:TCP 的慢启动、同时开启了多条 TCP 连接,那么这些连接会竞争固定的带宽、HTTP/1.1 队头阻塞的问题。 -
HTTP/2 的多路复用
一个域名只使用一个 TCP 长连接和消除队头阻塞问题。
-
多路复用的实现:引入二进制分帧层
- 浏览器准备好请求数据,包括了请求行、请求头等信息,如果是 POST 方法,那么还要有请求体。
- 这些数据经过二进制分帧层处理之后,会被转换为一个个带有请求 ID 编号的帧,通过协议栈将这些帧发送给服务器。
- 服务器接收到所有帧之后,会将所有相同 ID 的帧合并为一条完整的请求信息。
- 服务器处理该条请求,并将处理的响应行、响应头和响应体分别发送至二进制分帧层。
- 二进制分帧层会将这些响应数据转换为一个个带有请求 ID 编号的帧,经过协议栈发送给浏览器。
- 浏览器接收到响应帧之后,会根据 ID 编号将帧的数据提交给对应的请求。
-
HTTP/2 其他特性
- 可以设置请求的优先级
- 服务器推送
- 头部压缩
HTTP/3:甩掉TCP、TLS 的包袱,构建高效网络
-
HTTP/2 的缺陷
-
TCP 的队头阻塞
在 TCP 传输过程中,由于单个数据包的丢失而造成的阻塞称为 TCP 上的队头阻塞。 -
TCP 建立连接的延时
网络延迟又称为 RTT(Round Trip Time)。我们把从浏览器发送一个数据包到服务器,再从服务器返回数据包到浏览器的整个往返时间称为 RTT。RTT 是反映网络性能的一个重要指标。 -
TCP 协议僵化
-
-
QUIC 协议
HTTP/3 选择了一个折衷的方法—— UDP 协议,基于 UDP 实现了类似于 TCP 的多路数据流、传输可靠性等功能,我们把这套功能称为QUIC 协议。
HTTP/3 中的 QUIC 协议集合了以下几点功能:- 实现了类似 TCP 的流量控制、传输可靠性的功能,它提供了数据包重传、拥塞控制以及其他一些 TCP 中存在的特性。
- 集成了 TLS 加密功能,减少了握手所花费的 RTT 个数。
- 实现了 HTTP/2 中的多路复用功能。和 TCP 不同,QUIC 实现了在同一物理连接上可以有多个独立的逻辑数据流。实现了数据流的单独传输,就解决了 TCP 中队头阻塞的问题。
- 实现了快速握手功能。
- HTTP/3 的挑战
- 从目前的情况来看,服务器和浏览器端都没有对 HTTP/3 提供比较完整的支持。
- 部署 HTTP/3 也存在着非常大的问题。因为系统内核对 UDP 的优化远远没有达到 TCP 的优化程度。
- 中间设备僵化的问题。这些设备对 UDP 的优化程度远远低于 TCP,据统计,使用 QUIC 协议时,大约有 3%~7% 的丢包率。
网友评论