兼顾高可靠和低延迟,Google打算用QUIC协议替代TCP/UDP
Google想到能否把这两种协议的优势结合起来,同时实现低时延和高可靠并将其应用到更高安全的协议上,于是就有了QUIC。
本文就来详细介绍下QUIC协议。
从TCP协议说起
当前,web平台的数据传输都基于TCP协议。TCP协议在创建连接之前需要进行三次握手(图1),如果需要提高数据交互的安全性,既增加传输层安全协议(TLS),还会增加更多的握手次数(图2)。
图1:TCP三次握手示意
图2:TLS初始化握手示意
正因为TCP协议连接建立的成本相对较高,可以通过TCP快速打开(TCP Fast Open)来减少建立连接时的握手次数。但是该技术目前应用较少。
和TCP相反,UDP协议是无连接协议。客户端发出UDP数据包后,只能“假设”这个数据包已经被服务端接收。这样的好处是在网络传输层无需对数据包进行确认,但存在的问题就是为了确保数据传输的可靠性,应用层协议需要自己完成包传输情况的确认。
此时,QUIC协议就登场了。QUIC协议可以在1到2个数据包(取决于连接的服务器是新的还是已知的)内,完成连接的创建(包括TLS)(图3)。
图3:QUIC协议握手示意
QUIC协议的目的
从前文对比可以看出,QUIC协议的主要目的,是为了整合TCP协议的可靠性和UDP协议的速度和效率。QUIC的维基百科页面介绍了该协议的主要目的:
对于Google来说优化TCP协议是一个长期目标,QUIC旨在创建几乎等同于TCP的独立连接,但有着低延迟,并对类似SPDY的多路复用流协议有更好的支持。 如果QUIC协议的特性被证明是有效的,这些特性以后可能会被迁移入后续版本的TCP和TLS协议(它们都有很长的开发周期)。
值得注意的是,如果QUIC的特性被证明是有效的,这些特性以后可能会被迁移到后续版本的TCP协议中。
TCP协议的实现是高度管制的。TCP协议栈通常由操作系统实现,如Linux、Windows内核或者其他移动设备操作系统。修改TCP协议是一项浩大的工程,因为每种设备、系统的实现都需要更新。
相反的,UDP协议在操作系统层面实现相对简单,基于UDP协议实现新的协议以验证Google对于TCP协议改进的理论,验证成本相对较低。
QUIC协议内置了TLS栈,实现了自己的传输加密层,而没有使用现有的TLS 1.2。同时QUIC还包含了部分HTTP/2的实现,因此QUIC的地位看起来是这样的:
从图上可以看出,QUIC底层通过UDP协议替代了TCP,上层只需要一层用于和远程服务器交互的HTTP/2 API。这是因为QUIC协议已经包含了多路复用和连接管理,HTTP API只需要完成HTTP协议的解析即可。
QUIC协议特性
1. 避免前序包阻塞
SPDY和HTTP/2协议现在都支持将页面的多个数据(如图片、JavaScript等)通过一个数据链接进行传输。该特性能够加快页面组件的传输速度,但是对于TCP协议来说,这会遇到前序包阻塞的问题。这是由于TCP协议在处理包时是有严格顺序的,当其中一个数据包遇到问题,TCP连接需要等待这个包完成重传之后才能继续进行。因此,即使逻辑上一个TCP连接上并行的在进行多路数据传输,其他毫无关联的数据也会因此阻塞。
QUIC协议直接通过底层使用UDP协议天然的避免了该问题。由于UDP协议没有严格的顺序,当一个数据包遇到问题需要重传时,只会影响该数据包对应的资源,其他独立的资源(如其他css、js文件)不会受到影响。
2. 减少数据包
前文已经介绍过QUIC协议在创建连接握手时,只需要1到2个数据包即可。这对于拥有高速互联网连接的网络环境下可能没有太大的感觉,因为此时一个数据包的延时大概在10~50ms之间。
一般来说延迟在50ms之内不会有太大的感觉。但是对于无线网络来说,情况就不太一样了。且不说传统2G/3G网络,即使是4G网络,客户端和服务器之间的延时也通常在100ms以上。传统TCP+TLS协议的传输方式,在创建连接时的4个数据包和QUIC协议的1个数据包相比,连接创建上就会多耗时300ms以上。
3. 向前纠错
QUIC协议有一个非常独特的特性,称为向前纠错(Forward Error Correction),每个数据包除了它本身的内容之外,还包括了部分其他数据包的数据,因此少量的丢包可以通过其他包的冗余数据直接组装而无需重传。
这类似网络层的RAID 5!
目前默认的冗余量是10%,既每发送10个数据包,其冗余数据就可以重新构建一个丢失的数据包。
向前纠错牺牲了每个数据包可以发送数据的上限,但是减少了因为丢包导致的数据重传,因为数据重传将会消耗更多的时间(包括确认数据包丢失、请求重传、等待新数据包等步骤的时间消耗)。
4. 会话重启和并行下载
底层协议切换到UDP协议之后的另一大好处是,连接不再依赖于来源IP。
对于TCP协议来说,标识一个TCP连接需要4个参数,既来源IP、来源端口、目的IP和目的端口。其中的任一参数改变,TCP连接就需要重新创建。
这对于传统网络来说影响不大,因为来源和目的IP相对固定。但是在无线网络中,情况就大不相同了。设备在移动过程中,可能会因为网络切换(如从WIFI网络切换到4G网络环境),导致TCP连接需要重新创建。
QUIC协议使用了UDP协议,不再需要这四元组参数。同时QUIC协议实现了自己的会话标记方式,称为连接UUID。当设备网络环境切换时,连接UUID不会发生变化,因此无需重新进行握手。
该特性除了可以减少无谓的连接重连之外,还可以充分利用设备的不同网络接口,进行资源的并行下载。因为虽然这些网络接口有不同的IP,但只要他们能够共享连接UUID,就能够并行的从服务器下载数据。
QUIC协议实践
Chrome浏览器从2014年开始已经实验性的支持了QUIC协议。可以通过在Chrome浏览器中输入chrome://net-internals/#quic
查看是否已经支持QUIC协议。如果还未支持,可以在chrome://flags/#enable-quic
中进行开启。
开始Chrome浏览器对QUIC协议的支持之后,可以在chrome://net-internals/#quic
中查看到当前浏览器的QUIC一些连接。当然目前只有Google服务才支持QUIC协议(如YouTube、 Google.com)。
关于防火墙
通常系统管理员会关注防火墙的TCP规则,而忽略UDP规则。如果要在防火墙之后使用QUIC协议,除了传统web服务需要开放的80/TCP
、443/TCP
之外,针对QUIC还需要开放443/UDP
的访问。
服务端使用QUIC协议
目前支持QUIC协议的web服务只有0.9版本以后的Caddy。其他常用web服务如nginx、apache等都未开始支持。curl表达了对QUIC协议支持的兴趣。
QUIC性能优势
在2015年的博文中,Google分享了一些关于QUIC协议实现的结果。
这些优势在诸如YouTube的视频服务上更为突出。用户报告通过QUIC协议在观看视频的时候可以减少30%的重新缓冲时间。
-END-
欢迎关注“互联网架构师”,我们分享最有价值的互联网技术干货文章,助力您成为有思想的全栈架构师,我们只聊互联网、只聊架构,不聊其他!打造最有价值的架构师圈子和社区。
本公众号覆盖中国主要首席架构师、高级架构师、CTO、技术总监、技术负责人等人 群。分享最有价值的架构思想和内容。打造中国互联网圈最有价值的架构师圈子。
长按下方的二维码可以快速关注我们
如想加群讨论学习,请点击右下角的“加群学习”菜单入群。
兼顾高可靠和低延迟,Google打算用QUIC协议替代TCP/UDP相关推荐
- 高吞吐、低延迟 Java 应用的 GC 优化实践
2019独角兽企业重金招聘Python工程师标准>>> 背景 高性能应用构成了现代网络的支柱.LinkedIn 内部有许多高吞吐量服务来满足每秒成千上万的用户请求.为了获得最佳的用户 ...
- 高tps、低延迟_如何在不到1ms的延迟内完成100K TPS
高tps.低延迟 马丁·汤普森(Martin Thompson)和迈克尔·巴克(Michael Barker)讨论了如何通过采用一种新的基础架构和软件方法来构建一种以不到1ms的延迟处理100K TP ...
- BDS-HA:构建高可用、低延迟的HBase服务
HBase可以支持百TB数据规模.数百万QPS压力下的毫秒响应,适用于大数据背景下的风控和推荐等在线场景.阿里云HBase服务了多家金融.广告.媒体类业务中的风控和推荐,持续的在高可用.低延迟.低成本 ...
- 网易云游戏来了:手机电脑电视随时接入可玩,高流畅度低延迟,还能跨终端无缝切换...
点击上方"AI遇见机器学习",选择"星标"公众号 重磅干货,第一时间送达 允中 发自 凹非寺 量子位 报道 | 公众号 QbitAI 囿于版号的游戏行业,终于快 ...
- 高并发、低延迟之C#玩转CPU高速缓存(附示例)
写在前面 好久没有写博客了,一直在不断地探索响应式DDD,又get到了很多新知识,解惑了很多老问题,最近读了Martin Fowler大师一篇非常精彩的博客The LMAX Architecture, ...
- 资深电竞发烧友走心盘点,五款高续航游戏低延迟蓝牙耳机分享
作为一个多年的音乐发烧友,经常混迹在各大数码产品论坛,也使用过各种耳机,什么动圈的.动铁的.有线的.无线的.国内的.国外的.小品牌的.国际主流的,我基本上都用过.虽然不敢说对整个耳机市场了如指掌,但是 ...
- 国产蓝牙耳机哪款值得入手?高性价比游戏低延迟蓝牙耳机推荐
当代人平时使用耳机的频率非常高,在公共场合更是人手必备.不少人受有线耳机缠线问题或是范围限制所扰,转而选择蓝牙耳机.蓝牙耳机属于近些年来的科技衍生产品,从2001年出现左右耳塞型耳机到2015年第一个 ...
- 小米air2se耳机只有一边有声音怎么办_2020高颜值游戏低延迟蓝牙耳机,高音质听声辨位非这五款蓝牙耳机莫属...
随着各大手机厂商陆续取消耳机接口以及TWS技术发展普及,让TWS真无线蓝牙耳机在整个耳机市场是大放异彩,本来无线的佩戴体验就更适用于便捷高效的生活方式,再加上技术的突破,在信号以及音质上都有着质的飞跃 ...
- 2020什么牌子蓝牙耳机性价比高?十大高颜值游戏低延迟蓝牙耳机推荐
如今随着手机的功能不断强大,手机的周边配件也是出现更多的时尚潮品,那么无线蓝牙耳机肯定是不可缺少的必需品了.蓝牙耳机在生活中不同的场合和场景都会用到:开车.听歌.运动.游戏.看影视...... 那么如 ...
- 双11真无线蓝牙耳机盘点分享,高音质游戏低延迟无惧卡顿
近年来,无论是广场舞还是长跑,无论是大家庭.小情侣,阿姨还是中小学生,体育和健身在大江南北都很受欢迎,并被热情追捧.说到运动,耳机自然是不可或缺的,所以如何选择一款合适的蓝牙运动耳机已经成为许多消费者 ...
最新文章
- 参加Python培训后能干嘛
- java基础-基本的输入与输出
- 二次元萌妹在电车上顺拐啾咪为哪般?
- Java自带的性能监测工具之jinfo
- java位运算实例详解——(amp;)、(|)、(~)、(^)、(lt;lt;)、(gt;gt;)
- Struts2.perperties中的配置详解
- 【C++】 C++标准模板库(十) 双向队列
- 创建型模式——单例模式
- Laravel 除了首页能正常访问,其它页面均404
- IE和Firefox对iframe document对象的差异性
- android系统(106)---Android Netd ndc
- python窗口图形界面编程上传图片_python GUI编程(Tkinter) 创建子窗口及在窗口上用图片绘图实例...
- 读《那些年,那些事 一个程序猿的奋斗史》 一点自己的感触
- DS3400 RDAC for RedHat5.3安装文档-sunleii@DC
- AI人机对战五子棋游戏【Python(pygame)+AI】并实现软件输出
- 云控微信开发SDK使用教程--手机微信收钱任务执行结果通知服务端
- 开源电子书项目FBReader初探(三)
- Merkle tree for non-membership proof
- java 求正割_Java中AQS基本实现原理
- 大数据架构师之路-大数据框架大全
热门文章
- OpenResty Redis 安装部署测试SET GET功能
- Linux IPC udp/ip socket 编程
- PoJ3278--Catch That Cow(Bfs)
- linux ssh 多台机器无密码相互登陆方法二
- 原创 leetcode/力扣 背包问题大总结,BAT程序员完整学习手册PDF开放下载!
- Acrobat Pro DC 教程,如何将文件合并为 PDF?
- Photoshop 入门教程「6」如何更改图像大小?
- 什么是 iPhone 和 Mac 上的“优化电池充电”功能?
- Python--day26--封装和@property
- UCC国际洗衣:风雨26年,铸就干洗行业实力品牌