Google Quic协议
0x01 Quic
QUIC协议于2012年实现,2015年提交RFC草案,它是Goolge为了解决当今WEB应用常见的传输层和应用层问题而提出的,从分层结构上可以看做是TCP+TLS+HTTP2的集合,不过是在UDP的基础上实现的
主要解决了下面的几个问题
- Connection establishment latency(连接时延)
- Flexible congestion control (拥塞控制)
- Multiplexing without head-of-line blocking (HOLB问题)
- Authenticated and Encrypted Header and Payload (头部加密)
- Forward error correction (前向纠错)
- Connection migration(连接迁移)
0x02 HOLB问题
HOLB(Head of Line Blocking),当所有请求必须按序执行时,会造成后续请求即使已经达到处理的条件也会由于前面的请求阻塞而阻塞的现象。网络中大量存在着按序的原则,例如路由器转发队列需要按序转发、TCP报文需要按序到达等,HTTP请求在多个层次上也都存在该问题,
HTTP事务级别的 HOLB
在HTTP1.0时代,HTTP请求只能遵循请求-应答、请求-应答的模式,效率极低,一般浏览器都开启多条流来并行多个请求(Chrome 6条)。HTTP1.1引入了Pipelining机制,实现流水线请求,客户端可以一次性向服务端发送多个请求,但HTTP 1.X要求多个HTTP响应必须按序到达,例如请求r1和r2的响应各有几个报文,[r1p1, r1p2]和[r2p1, r2p2],HTTP1.X要求报文按序到达,后面的请求被前面的请求阻塞在服务器,造成了HTTP层面的HOLB问题,大多数浏览器因此并没有采用Pipelining而是沿用之前的多流机制。SPDY打破了HTTP1.X的交付顺序,允许响应报文乱序到达,例如按照[r2p1, r1p1, r1p2, r2p2]的顺序到达,从而解决了HTTP事务层面的HOLB问题。

TCP级别的 HOLB
SPDY解决了HTTP事务层的HOL问题,但无法解决TCP层的HOL问题。TCP的可靠性要求所有数据按序交付应用层,发生丢包时接收端会收到大量乱序(Out of Order)的报文,这些报文只能暂时缓存在TCP接收缓冲区中,并不能交付应用层,造成后面请求响应报文由于前面请求响应报文的丢包而不能被应用层读取。UDP就不存在这个问题,应用层可以提前读取乱序但有价值的数据,在采取多路复用时,不会因为某个响应丢包而造成所有响应都被阻塞在内核缓冲区中,因此Quic采用UDP作为传输层协议。

0x03 连接建立时间
基于传统TCP的WEB应用每次请求至少经过1-3个RTT才能建立连接,包括TCP三次握手和TLS交换秘钥的时间,在长连接中,这点时间不算什么,但在短流时,连接建立时间可能在响应时间内占有相当大的比重,Google也做了相当多的工作来优化连接建立时间。
早些年,Google还搞过TFO(TCP Fast Open )用来加速连接的建立,传统TCP其实可以在SYN报文内携带数据的,只不过应用层无法在三次握手前读取[rfc793],主要在可靠性与安全方面的考虑,在三次握手前就交付数据可能会带来几个问题,一个就是SYN-Flood攻击可以直接向服务器传输数据。TFO通过Cookie的方式防御这种攻击,服务器在初始连接中向客户端发送一个Cookie,之后客户端通过该Cookie向服务器证明自己,服务端在SYN-ACK报文内就可以发送数据了,减少了整整一个RTT的时间。


QUIC同样采用了Cookie的机制来验证客户端的合法性,从而将整个连接建立过程减少到至多1个RTT,除了在初始连接中服务器需要发送证书和Cookie之外,客户端都可以直接用Cookie在建立连接的同时发送数据。

0x04 其它特性
拥塞控制算法
TCP的拥塞控制算法一直被诟病,以至于UDT、KCP等都是基于UDP实现自己的可靠性与拥塞控制。Quic目前拥塞控制算法目前采用Cubic。Quic的ACK报文中携带这接收端在接收报文与发送ACK报文之间的时间间隔,发送端根据该间隔可以更精确地测量链路时延,TCP-Vegas等基于时延的拥塞控制算法在将来都有在其基础上实现的可能。
前向纠错(Forward Error Correction)
FEC机制下每隔几个报文就发送一个FEC报文,FEC报文为一组报文的异或,在发生丢包时,可以通过未丢失的报文和FEC报文将丢包恢复出来,减少了不必要的重传。QUIC若干个报文组成一个FEC组,这样增加了每个报文的负载,但减少了重传,是一种空间换时间的做法,报文冗余度是一个可控的参数,冗余度越大消耗的带宽越大,同时减少了重传数。QUIC类似于RAID4
连接迁移(Connection Migration)
一条TCP流由原宿IP、原宿端口和协议来标识,而一条Quic流由一个变长ID(0,8,32,64位)唯一标识,这样Quic流并不依赖于IP地址。一方面,当某个网卡崩溃后,QUIC并不需要重新建立连接,只需要切换到另外一个网卡,提高了可靠性;另一方面,QUIC天然具备了Multipath的特质,让多个网卡同时工作,通过添加调度器和多流拥塞控制算法,QUIC可以实现MPTCP的功能,而且是在一个更高的层次上。
0x05 搭建Quic服务器
google自己的chromium项目里已经支持了QUIC,不过不够方便,go语言编写的WEB服务器Caddy已经能够较好地支持Quic与HTTP2.0了,已经在个人服务器上搭建了Caddy-Server,地址为 https://m.codingmozart.com/ ,当然在Google的各大网站不断F5也是可以看到QUIC的。
Chrome浏览器已经支持QUIC,通过chrome://flags/#enable-quic开启QUIC功能,并在chrome://net-internals/#quic里可以看到所有活跃的QUIC流。

Wireshark可以抓到QUIC的包,在报头部分可以看到连接号CID(Connection ID)和报文号Sequence类似于TCP的Seq,报文的主要内容被编码在了负载部分


QUIC有三种类型的报文
Frame Packet:携带一个个数据帧,数据帧类型包括ACK,STREAM,WINDOW_UPDATE等等,其中STRAM类型的Frame就是用来实现Multiplexing的,一个帧可以携带多条流的分片。
+--------+---...---+--------+---...---+
| Type | Payload | Type | Payload |
+--------+---...---+--------+---...---+
FEC Packet:携带一组报文的异或,用来前向纠错
+-----...----+
| Redundancy |
+-----...----+
Public Reset Packet
0 1 2 3 4 8
+--------+--------+--------+--------+--------+-- --+
| Public | Connection ID (64) ... | ->
|Flags(8)| |
+--------+--------+--------+--------+--------+-- --+ 9 10 11 12 13 14
+--------+--------+--------+--------+--------+--------+---
| Quic Tag (32) | Tag value map ... ->
| (PRST) | (variable length)
+--------+--------+--------+--------+--------+--------+---
0x06 参考文献
[1] https://tools.ietf.org/html/draft-tsvwg-quic-protocol-00#ref-QUIC-CRYPTO
Google Quic协议的更多相关文章
- Google将向IETF标准提交QUIC协议提案
Google近期宣布,他们将向IETF提交实验性传输层网络协议QUIC的提案.此外,Google已经给出了QUIC协议优化页面加载时间的第一手数据. 自从2013年引入QUIC以来,Google一直在 ...
- Google 打算用 QUIC 协议替代 TCP/UDP
有句话叫做一流企业定标准.二流企业做品牌.三流企业卖技术.四流企业做产品.Google 似乎在冲着一流企业的目标迈进.去年,Google 已经从以 SPDY 为基础的 HTTP 协议 16年 来的首个 ...
- 让互联网更快:新一代QUIC协议在腾讯的技术实践分享
本文来自腾讯资深研发工程师罗成在InfoQ的技术分享. 1.前言 如果:你的 App,在不需要任何修改的情况下就能提升 15% 以上的访问速度,特别是弱网络的时候能够提升 20% 以上的访问速度. 如 ...
- QUIC协议的分析,性能测试以及在QQ会员实践
WeTest 导读 你听过HTTPS.HTTP2.0.SPDY,但是这些应用层协议都是基于可靠的传输层协议TCP来实现的.那么,基于高效的UDP协议有没有一种相对可靠的应用层协议呢? Why QUIC ...
- QUIC协议原理分析(转)
之前深入了解了一下HTTP1.1.2.0.SPDY等协议,发现HTTP层怎么优化,始终要面对TCP本身的问题.于是了解到了QUIC,这里分享一篇之前找到的有意义的文章. 原创地址:https://mp ...
- QUIC协议
QUIC协议 QUIC协议参考网址 https://www.chromium.org/quic 既生瑜,何生亮? QUIC的特性 提供可靠传输 减少连接建立的时间 改善拥塞控制 多路复用 转发错误连接 ...
- 一泡尿的时间,快速读懂QUIC协议
1.TCP协议到底怎么了? 现时的互联网应用中,Web平台(准确地说是基于HTTP及其延伸协议的客户端/服务器应用)的数据传输都基于 TCP 协议. 但TCP 协议在创建连接之前需要进行三次握手(如下 ...
- 网络编程懒人入门(十):一泡尿的时间,快速读懂QUIC协议
1.TCP协议到底怎么了? 现时的互联网应用中,Web平台(准确地说是基于HTTP及其延伸协议的客户端/服务器应用)的数据传输都基于 TCP 协议. 但TCP 协议在创建连接之前需要进行三次握手(如下 ...
- [译] QUIC Wire Layout Specification - Frame Types and Formats | QUIC协议标准中文翻译(4) 帧类型和格式
欢迎访问我的个人网站获取更好的阅读排版体验: [译] QUIC Wire Layout Specification - Frame Types and Formats | QUIC协议标准中文翻译(4 ...
随机推荐
- Guitar Pro里的渐强渐弱符号
今天我们来介绍Guitar Pro里经常会用到的渐强渐弱符号,渐强和减弱符号是常用的强度记号,分别用来表示音量加强或者减弱的过程. 渐强符号是由两条相等长度的线组成,它们的左端相连,右端逐渐张开.这个 ...
- SharePoint2007使用WebPart加载UserControl
之前一直做SharePoint2010开发,最近转向了2007开发,感觉两者开发时有很多地方不一样,我现在接触到2007开发项目里面使用Module去加载Application Page,而在Appl ...
- echarts生成的图表大小怎么随屏幕的大小改变自适应
最近在做图表,记录一下用到的知识点,当做自己的日记吧,会不断添加新内容 1,echarts生成的图表大小怎么随屏幕的大小改变自适应? this.chart.setOption(this.options ...
- log4.net使用指南
1.简介 1.1 Log4net的优点: 几乎所有的大型应用都会有自己的用于跟踪调试的API.因为一旦程序被部署以后,就不太可能再利用专门的调试工具了.然而一个管理员可能需要有一套强大的日志系统来诊断 ...
- Effective java 系列之异常转译
异常转译:当位于最上层的子系统不需要关心底层的异常细节时,常见的作法时捕获原始异常,把它转换一个新的不同类型的异常,在将新异常抛出. 通常方法捕获底层异常,然后抛高层异常. public static ...
- ASP.NET MVC CSRF (XSRF) security
CSRF(Cross-site request forgery)跨站请求伪造,也被称为“One Click Attack”或者Session Riding,通常缩写为CSRF或者XSRF,是一种对网站 ...
- hsy单词
题意:略 在ac自动机上,一个节点出现的次数等于能通过fail到它的节点的次数之和.而叶节点就等于它被爬过的次数. #include <iostream> #include <cst ...
- label 的for属性总结
一.使用介绍 1. 定义:for属性规定label与哪个表单元素绑定. <label>是专门为<input>元素服务的,为其定义标记. label 和表单控件绑定方式有两种: ...
- 多组图自动无限循环(swiper轮播)
前两天的一个项目中遇到多组图片无限轮播,当时采用了swiper 但是没有解决让它无限轮播.今天再次尝试了一下发现是自己的样式写错了.今天在这里写一下,为了给自己一个警醒不要犯同样的错误 首先先引入一下 ...
- css中position 定位的兼容性,以及定位的使用及层级的应用
一.首先我们来看看定位的兼容性,当然是在IE6.7但是现在大多数公司都已经不考虑了 我们就作为一个了解吧: 1.在IE67下,子元素有相对定位的话,父级的overflow:hidden包不住子元素 解 ...
