QUIC和TCP
作者:henrystark henrystark@126.com
Blog: http://henrystark.blog.chinaunix.net/
日期:20140626
本文遵循CC协议:署名-非商业性使用-禁止演绎 2.5(https://creativecommons.org/licenses/by-nc-nd/2.5/cn/)。可以自由拷贝,转载。但转载请保持文档的完整性,注明原作者及原链接。如有错讹,烦请指出。
(I am a watcher. I like thinker or creater,not follower. If you are a
good follower and get the key point by learning others, don't say you
own it.)
QUIC和TCP
0.写作目的
QUIC由Google提出,基于UDP,用于加快网络速率。常用来和基于TCP的SPDY比较。Google在传输层、应用层或其他方面做出的提升网络质量的贡献令人佩服。本篇blog将论述QUIC的起源、优缺点,以及TCP存在的问题。
1.引言
Why QUIC is necessary?
每个接触QUIC的programmer总会这样问。答案也很简单:SPDY、TCP不够好!不过这样说太肤浅了,下面我来分析本质原因【引
1】。基于一条TCP连接的SPDY复用连接会面临这样的情况:当有丢包发生时,所有连接都将阻塞,这是由TCP的拥塞控制特性决定的【引 2
3】。丢包必须恢复,而恢复过程中,或早或晚,滑动窗口总有停等的时刻,耗费一个RTT。在广域网上,一个RTT相当于50-100ms。相比较而言,当x条并行HTTP连接中,有一条丢包,只会阻塞一条。
QUIC是和HTTP同一层的应用层协议,其核心是将丢包控制工作转移到应用层【注
1】。由于QUIC基于UDP,可以不理会丢包,快速投递,再用丢包恢复方法保证可靠性。除此之外,基于一条TCP连接的SPDY和多条并行HTTP连接相比,没有优势可言。多条连接中,每个连接都有一个拥塞窗口,不受彼此丢包影响。Google希望通过QUIC更好地处理多条连接下的拥塞状况。
2.TCP的症结
以上所述其实反映了TCP基于窗口的拥塞控制策略的问题。TCP的核心在于“丢包必须恢复”,正是这种丢包恢复导致传输速率降低。而除此之外,TCP拥塞控制也存在粒度不精细等问题。举例而言,往年有一道很好的面试题:早期网络中,为什么蚂蚁等下载器比网页下载快?答案是下载器使用多线程,多连接下载,而网页下载往往使用单连接。也许回答到这种程度,大部分人已经满意了。但往下问,还有更深刻的内涵:为什么多连接比单连接快?ISP给用户分配的带宽不是固定吗?
我想,到了这种程度,大多数人回答不出所以然来。可以从两方面解释:1.多连接下载中,每个连接负责下载不同的offset range
2.TCP基于窗口的拥塞控制不够好,多个连接更具有侵略性,能占据更多的带宽。关于第一点,学过网络编程的人多多少少知道。第二点,则需要详细解释了。TCP用congestion
window(cwnd)来控制发送速率,发送初期,cwnd二次增长,丢包时减半,之后线性增长。TCP的初始窗口为2MSS,下限为1MSS,当多条流存在时,即便丢包,窗口减幅也有限。现有用户带宽并不高,带宽时延积BDP也不会很大,100MSS的cwnd足够大了。如果有10条TCP连接并发下载,那么最差的cwnd之和也是10MSS,当然比只有一条连接时,窗口为1MSS要好。
也许说到这种程度就可以了,但是我们还可以更深一步:为什么TCP基于窗口的拥塞控制行为会有这样的缺陷?怎么改进?首先需要明确两个概念:窗口、段,TCP中,窗口是以段(segment,MSS)为单位的,一个MSS通常为1460Bytes,cwnd就是x*MSS。再来看多流并发的问题:多连接下载中,假设流数为n,那么总窗口最低降为n个MSS。这对于并行下载来说是优势,因为最低窗口也很高。那么,从反方面看呢?你觉得并发下载好,是因为多流可以提升带宽利用率,换言之,多流窗口之和没有超过BDP。那是否存在这样的状况:多流最低窗口之和远远大于BDP?不幸的是,存在。这种状况诞生的场景是:并发量高而BDP小的网络,其中最典型的就是数据中心网络。数据中心网络具有的特征为:高带宽、低延时、高并发、BDP小,交换机缓存有限。实际上,当多流窗口之和远大于BDP时,会频繁引发网络拥塞,造成超时,也就是著名的TCP吞吐率崩塌问题,也称为Incast问题。
说这么多,意义何在呢?启发TCP下一步的改进方向,基于窗口的拥塞控制能力有限,或许已经到了改变的时候了【注
2】。TCP下一步的改变方向或许是“速率控制”,而非“窗口控制”。丢包时,“速率减半”。RCP等协议是基于速率的。表面看来,这两种控制方式并无差别。但是速率控制能精确控制发送速率,而不降低负载率。举例来说,如果窗口到了1MSS,还是不能避免丢包拥塞超时,那怎么办呢?很多人会说减小MSS,可是这会降低带宽利用率,举例来说,当MSS为500时,带宽利用率最大为40/540,因为包头的40字节是无用的。比40/1500低了很多。而速率控制方法可以在不降低带宽利用率的情况下控制发送速率。其根本区别在于:基于窗口的控制策略是burst投递,也就是突发投递【注
3】。而基于速率的控制可以渐缓投递。
讲到这里,是否有醍醐灌顶的感觉?传输控制的本质已经在你眼前揭开了,希望你得到点什么,不过那并不是属于你自己的东西,而是无数前辈的结晶,我只是按我的理解方式叙述而已。
3.QUIC的机制
QUIC具有的特性如下【引 4】:
0-RTT connections
Packet pacing that reduces packet loss
Forward error correction that reduces retransmission latency
Adaptive congestion control (friendly to TCP), reducing reconnections for mobile clients
Encryption equivalent to TLS
Chrome can talk QUIC to Google today
其中,QUIC对packet loss和拥塞避免的处理最值得关注。下面我来介绍这两部分处理【引 5】。
packet loss:QUIC丢包恢复有两种办法,前向纠错(FEC)和重传。前向纠错可以减少重传,但需要在包中添加冗余信息,用XOR实现【注 4】。如果前向纠错不能恢复包,就启用重传,重传的不是旧包,而是重新构造的包。
congestion
avoidance:TCP使用了窗口来进行拥塞控制,QUIC使用带宽探测器、监察delay变化并使用pacing来减少丢包【注
5】。当接收端判定丢包后,发送NACK给对端,通知丢包事件。此后进行的速率降低工作类似于TCP,保持对TCP的友好性。
(本篇只是开头,QUIC的源码我还没把握体系,关于QUIC的内容会逐步补充,待续。。。)
引用
【1】QUIC FAQ for Geeks。
https://docs.google.com/document/d/1lmL9EF6qKrk7gbazY8bIdvq3Pno2Xj_l_YShP40GLQE/edit。参见“Why isn’t SPDY over TCP good enough?”。
【2】Head-of-line blocking。http://en.wikipedia.org/wiki/Head-of-line_blocking。
【3】HTTP pipeline。http://en.wikipedia.org/wiki/HTTP_pipelining。HTTP pipeling特性支持把多条HTTP连接封装到一条TCP连接中,但Head-of-line blocking会严重降低这种复用连接的性能。这本来是为了减少握手交互时间而提出的特性改进,却带来了上述的性能降低问题。
【4】QUIC特性。http://www.infoq.com/news/2014/02/quic。
【5】QUIC dealing with packet loss。https://docs.google.com/document/d/1RNHkx_VvKWyWg6Lr8SZ-saqsQx7rFV-ev2jRFUoVD34/edit#。
注解
【1】将拥塞控制分离的想法很早就有人提出,基于传输层的可靠协议UDT或TCP甚至也可以分离到内核之外,成为用户空间协议栈。
【2】If you understand these words, congratulations! This thought is very
meaningful, in other words, it may be epochal. You deserve it. But don't
say the thought owe to you, because it's not my own, it's proposed by
researchers. Thanks to my friend, "jedihy" (http://c2fun.cn 8th blogs of him), I got the idea from him.
【3】参阅TCP Pacing。
【4】前向纠错并不是一种新手段,基于XOR的包恢复策略屡见不鲜,参阅“链路层 network coding”。
【5】pacing是一个重要策略,如果你理解了第一部分“TCP的症结”,就会知道它有多重要。
QUIC和TCP的更多相关文章
- 在网络7层协议中,如果想使用UDP协议达到TCP协议的效果,可以在哪层做文章?(QQ 为什么采用 UDP 协议,而不采用 TCP 协议实现?)
为了解决这题,可以具体看看下面这个讨论. 解灵运工程师 185 人赞同 某次架构师大会上那个58同城做即时通信的人说:原因是因为当时没有epoll这种可以支持成千上万tcp并发连接的技术,所以他们使用 ...
- IETF透露HTTP over QUIC 将重命名为HTTP/3 协议
周一,IETF透露它将HTTP-over-QUIC实验协议重命名为HTTP / 3.HTTP-over-QUIC是一种HTTP重写,用TCP替换TCP. 如果这看起来有点为时过早,那么它与IETF的历 ...
- [译] QUIC Wire Layout Specification - Introduction & Overview | QUIC协议标准中文翻译(1) 简介和概述
本文同步发布于: https://www.pengrl.com/p/33330/ ,转载请注明出处,谢谢. 目录 Introduction | 简介 Conventions and Definitio ...
- 新一代互联网传输协议QUIC浅析
QUIC(Quick UDP Internet Connection)是谷歌制定的一种互联网传输层协议,它基于UDP传输层协议,同时兼具TCP.TLS.HTTP/2等协议的可靠性与安全性,可以有效减少 ...
- quic是干什么的?
什么是quic? quic解决了什么问题?HTTP和QUIC QUIC :Quick UDP Internet Connections:是一种新的默认加密的互联网通信协议,它提供了许多改进,旨在加速H ...
- QUIC协议文档翻译——什么是QUIC
原文地址https://docs.google.com/document/d/1gY9-YNDNAB1eip-RTPbqphgySwSNSDHLq9D5Bty4FSU/edit QUIC是一个谷歌提出 ...
- QUIC协议和HTTP3.0技术研究
QUIC:基于UDP的安全可靠的HTTP/2传输协议 摘要 QUIC(Quick UDP Internet Connection)是一个新的基于UDP的管线化技术和安全传输协议. QUIC提供: 和H ...
- 网易云信 QUIC 加速服务架构与实践
导语:网易云信作为音视频服务提供商的领导者,一直致力于提供顶级的音视频通话服务体验,为用户在各种恶劣环境下提供可靠的音视频服务.如何在极端弱网条件下仍然能给用户提供可靠的音视频服务,是网易云信关注的重 ...
- 大型站点TCP/IP协议优化
作为一个DAU上百万或千万的站点,不仅仅需要做好网站应用程序.数据库的优化,还应从TCP/IP协议层去进行相关的优化: 在我的工作中,曾使用到了以下的几种基本的优化方式: 增大最大连接数 在Linux ...
随机推荐
- MySQL基础之 AND和OR运算符
AND和OR运算符 作用:用于基于一个以上的条件对记录进行过滤 用法:可在WHERE子句中把两个或多个条件结合在一起. AND:如果第一个条件和第二个条件都成立,才会显示一条记录 OR:如果第一个条件 ...
- laravel 实现思路以及各组件原理
laravel 内核是个IOC容器,IOC是把本来自己实例化的对象. 通过在容器里注册,通过容器来进行实例化. laravel队列用的是redis的列表来实现.
- Spirng MVC 重定向传递对象
在 Spring MVC 中我们会经常遇到重定向. @RequestMapping("/order/saveorder.html") public String saveOrder ...
- Django商城项目笔记No.9用户部分-注册接口签发JWTtoken
Django商城项目笔记No.9用户部分-注册接口签发JWTtoken 我们在验证完用户的身份后(检验用户名和密码),需要向用户签发JWT,在需要用到用户身份信息的时候,还需核验用户的JWT. 关于签 ...
- vue2.0学习笔记之组件
[易错点]: 1. 组件内html代码片段超过一个标签时必须套一个根元素,即template模板子元素只能是一个. 2. 组件名称采用横杠间隔命名时,第一个字母大写会报错. 写法一:全局 ...
- oracle 创建create user 及授权grant 查看登陆的用户
show user; select sys_context('userenv','session_user') from dual; select user from dual; 查看所有登录的用户必 ...
- UML类图简单学习 各种对象、关系UML表示法
<大话设计模式>上面的UML类图: 类的UML表示 动物 的矩形框 表示是一个类. 类图分为三层,第一层显示类的名称,如果是抽象类,则用斜体表示:第二层是类的特性,通常就是类的字段和属性: ...
- Python2.7-zlib
zlib 模块,提供了压缩和解压缩的函数,都是对字符串进行操作的,可以理解为是各种不同类型的数据经过处理成为字符串或是二进制字符串,再进行压缩解压缩.是和 gzip 相兼容的压缩模块 模块方法: zl ...
- Jmeter上传下载文件
每次使用时都会忘记,此处是存储网路上通用的方式. 1.上传文件 记得勾选“use multipart/form-data for post”,表明此请求包含文件信息.在信息请求头中,需加入“Con ...
- Android Des加密解密
算法转自:http://www.linuxidc.com/Linux/2011-08/41866.htm import java.security.Key; import java.security. ...