vlambda博客
学习文章列表

HTTP协议优化措施

经典提高效率的机制


1.并行连接

可以通过建立多个 tcp连接通道来实现并行传输数据,提高页面响应速率。并行TCP连接的使用还能够一定程度上减轻RTT延迟和短连接缓启动延迟的影响。


2.长连接

HTTP/1.1默认开启 Keep-Alive 选项,并且是 pipeline模式的。这样建立的 TCP 连接,可以在多次请求中复用。(注意:pipeline目前只能用于GET和HEAD请求)


3.缓存

3.1 Cache-control 用来控制缓存。当客户端发送的请求中包含 max-age 指令时,如果判定缓存层中,资源的缓存时间数值比指定的时间数值小,那么客户端可以接受缓存的资源;当 max-age = 0时,说明客户端不接受缓存,缓存层需要将请求转发给应用集群(通常是实时性要求很高的服务)。

3.2 If-Modified-Since 也是关于缓存的。这个选项的作用是:如果服务器的资源在某个时间之后更新了,那么客户端就应该下载最新的资源,否则服务器返回 ”304 Not Modified“ 的响应,这样也能节省带宽。


HTTP/2.0 优化措施


1.头部压缩

将原来每次都要携带的大量 key value 在两端建立一个索引表,对相同的头只发送索引表中的索引。


2.多路复用和分帧

将一个TCP连接中,切分成多个流,每个流都有自己的ID,并且流可以是从客户端发往服务器的,也可以是从服务器发往客户端的。流有各自的优先级。

将所有的传输消息分割为更小的帧(常见的帧有Header帧,Data帧等;不同类别的帧属于不同的流)

通过以上两种机制,客户端可以将多个请求分散到不同的流中,然后将请求的内容拆分为帧,进行二进制传输。(帧可以乱序发送,服务器端根据帧首部的流标识符重新组装,并且可以根据流优先级决定流的处理顺序)

这么做的好处是什么呢?举一个例子:

假设一个页面要发送三个独立的请求,分别获取css、js、*.jpg。如果是HTTP/1.*,那么这三个请求就是串行的,但是经过HTTP/2.0的优化,这三个请求理论上就变成了并行的,可以在一个连接里,客户端和服务端都可以同时发送多个请求或回应,并且不用按照顺序一一发送。

HTTP/2.0成功解决了HTTP/1.1的队首阻塞问题,同时,也不需要通过HTTP/1.*的并行连接机制用多条TCP连接来实现并行请求与响应,从而减少了TCP连接数对服务器性能的影响。同时将页面的多个数据等通过一个数据连接进行传输,加快了页面组件的传输速度。


3.二进制编码

对帧进行二进制编码,压缩体积,提高传输效率。


HTTP/2.0的缺陷:

由于HTTP/2.0的底层是依赖TCP协议的,而TCP协议在处理包时是有严格顺序的。当一条连接其中一个数据包传输遇到问题时,TCP连接需要等待这个包完成重传后才能继续进行,所以虽然HTTP/2.0通过多个stream,使得逻辑上在一个TCP连接上进行多路数据传输,但是如果一前一后,前面的stream2的帧没有收到,stream1的帧也会因此阻塞,相当于又回到了串行传输。


QUIC(google)优化措施

QUIC 是 Google 开发的基于 UDP 协议的网络协议


1.自定义连接机制

HTTP/2.0是基于TCP协议的,而TCP协议规定的连接是由四元组(源IP,源端口号,目的IP,目的端口号)标识的。如果其中任何一个元素发生变化,就需要重新连接。而如果在网络不稳定的情况下,这种情况是会存在的。所以如果是HTTP/2.0协议,就会因为TCP的三次握手而增加时延。

QUIC是自己定义了维护连接的机制,即用一个64位的随机数作为ID来标识,而UDP是面向无连接的,所以当IP或者端口号发生变化的时候,只要ID不变,则不需要重新连接。


2.无阻塞的多路复用

同 HTTP/2.0一样,同一条 QUIC 连接上可以创建多个 stream,来发送多个 HTTP请求。但是 QUIC 是基于 UDP协议的,一个连接上的多个 stream 之间没有依赖。这样,加入 stream2 丢失了一个 UDP包,后面紧跟着 stream3 的一个 UDP 包,虽然 stream2 的那个包需要重传,但是 stream3 的包无需等待,就可以发送给客户端。