QUIC协议的分析,性能测试以及在QQ会员实践 (2)

QUIC协议的分析,性能测试以及在QQ会员实践

图6 alt-svc头信息

 

研究过程中发现,除了alt-svc header,http2.0下服务端还可以通过支持alt-svc frame来让客户端在第一次请求的时候就走新协议,比通过header让浏览器第二次才能请求新协议更高效,这个留给后续研究。

 

连接迁移

TCP使用四元组(源IP,源端口,目的IP,目的端口)来标识一条连接,当四元组中的IP或端口任一个发生变化了连接就需要重新建立,从而不具备连接迁移的能力。


而QUIC使用了connection id对连接进行唯一标识。即使网络从4G变成了wifi,只要两次连接中的connection id不变,并且客户端或者服务器能通过校验,就不需要重新建立连接,连接迁移就能成功。

 

改进的多路复用

在SPDY协议出现以前,每个HTTP请求都需要建立一条TCP连接,那么如果希望请求并行,就需要同时开启多条TCP连接(都是有建连代价的)。而大多数浏览器对于同一个域名可以建立的最大TCP连接数是有限制的,所以,如果超出限制,更多的请求资源是无法并行的。


SPDY协议以来提出的多路复用,是让所有请求基于一条TCP连接,解决了上述的问题但同时引入了新的问题——队头阻塞,如果某个资源的某个包丢失了,因为TCP是保证时序的,就会在接收端形成队头阻塞,TCP此时无法区分各个资源的包是否关联,因此会停止处理所有资源直到丢包恢复。

QUIC协议的分析,性能测试以及在QQ会员实践

图7 基于TCP的多路复用

 

QUIC也有多路复用,但是QUIC是基于UDP的,UDP不需要保证包的时序,只会在接收包的时候对包进行重组,因而不存在等待丢包恢复的队头阻塞问题,这样某个资源的包丢失只会影响自身不会影响到其他资源的继续传输,所以是改进的多路复用。

QUIC协议的分析,性能测试以及在QQ会员实践

图8 基于QUIC的多路复用

 

双级别流量控制

QUIC是多路复用的,多条stream可以建立在一条connection上,所以QUIC的流量控制不仅基于单个stream,还基于connection。


stream级别的流控能够控制单stream的数据发送情况。另外,接收窗口的收缩取决于最大接收字节的偏移而不是所有已接受字节的总和,它不像tcp流控,不会受到丢失数据的影响。

QUIC协议的分析,性能测试以及在QQ会员实践

图9 stream流控

 

如果满足(flow control receive offset - consumed bytes) < (max receive window / 2)
会触发WINDOW_UPDATE frame的发送来增大发送窗口大小。

QUIC协议的分析,性能测试以及在QQ会员实践

图10 WINDOW_UPDATE触发前

 

 

QUIC协议的分析,性能测试以及在QQ会员实践

 图11 WINDOW_UPDATE触发后

 

connection级别流控算法和stream一致,各项数值是所有stream的总和。


connection级别的流控存在的必要是,即使做好了stream流控,但如果stream过多也会导致connection过度消耗带宽和系统资源;而且即使某一条stream过慢,其他stream依然能触发

 

connection级别的WINDOW_UPDATE,从而不会被影响。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zwzzxj.html