当前位置: 首页 > 后端技术 > Java

揭开“QUIC”的神秘面纱

时间:2023-04-01 14:30:37 Java

作者:赵勇QUIC读起来和Quick很像,但其实真的很快。可以很好的解决应用在传输层和应用层面临的各种需求,包括处理更多的连接、安全、低延迟等。目前在互联网领域,QUIC可以说是刮起了新一代互联网传输协议的风。对于开发者来说,了解QUIC有助于提升对延迟敏感的应用、音视频、购物支付等应用场景的体验。1QUIC有两大优势*0RTT,建立低延迟传输。传统的TLS协议需要二次握手来实现用户数据的传输。第一层包括TCP的三次握手,来回至少需要一次;第二层是TLS协议的握手,需要经过ClienHello和ServerHello的几次握手包才能开始用户数据传输。虽然TLS1.3在TLS握手阶段做了优化,支持在第一个ClientHello包中传输数据,但是TCP握手还是不能保存。QUIC协议摒弃了TCP协议,使用UDP作为底层传输协议,进一步压缩了TCP的三次握手带来的延迟,实现了真正的0RTT。这个优势对于延迟敏感的应用程序非常有吸引力,也为视频应用程序切换到QUIC协议提供了动力。*加密传输大多数互联网公司都非常重视用户的安全和隐私,并不断推动数据的加密传输。这项工作需要两个协议的支持,即HTTP协议和DNS协议。(1)HTTP协议从1.1版本升级到2.0再升级到3.0,本身不涉及加密,只是在延迟问题上做了改进。但是,与HTTP协议关联的TLS协议进行了全时加密,从TLS1.2升级到TLS1.3,不仅增强了加密强度,还大大加密了原本的明文握手。甚至,TLS协议计划在未来对所有握手部分进行加密。(2)DNS协议和HTTP协议也处于关联状态,但HTTP协议中的域名信息难免会被泄露。所以DNS的加密一般会同时进行。目前主流的解决方案是使用TLS进行加密,但是QUIC协议具有类似TLS的加密能力,性能更好。这打破了TLS协议对加密的垄断,成为其最大的竞争对手。2QUIC的使用很多年前,Google和Meta(原Facebook)就对QUIC协议进行了研究,甚至Facebook实现了QUIC的TCP版本。后来他们在研究上分成了两个阵营,一个是谷歌的gQUIC,一个是IETF-QUIC。但最后他们达成了一致,都属于IETF-QUIC阵营,也就是今天QUIC的雏形。作为主要推动者,Google和Facebook旗下的应用程序已经广泛使用QUIC进行通信。那么他们和各大互联网厂商在QUIC上取得了哪些进展呢?谷歌:作为应用广泛的移动操作系统Android,其内置的浏览器组件Webview默认支持QUIC,Chrome及其衍生浏览器也支持QUIC。还有一些与用户生活息息相关的应用,如Youtube、Gmail、Googlemap、GooglePlay等,也会尝试使用QUIC。这些将在支持的场景中默认执行QUIC传输。Facebook:Facebook、Messenger、Instagram、Whatsapp等知名应用与谷歌采用类似的QUIC策略。苹果:苹果在QUIC上的策略没有那么激进,但它已经为QUIC作为未来的趋势做好了准备,包括支持QUIC推出的DoH服务器。此外,Apple在最新的iCloud+PrivateRelay中使用了QUIC作为代理传输协议。CloudFlare:作为CDN厂商,ClouFlare一直在大力推广QUIC的使用,覆盖大量chrome+小站模式的流量,并让这些流量默认使用QUIC。Snapchat:跟随谷歌的脚步,这款流行的聊天软件也大量使用了QUIC。国内互联网厂商:快手和搜狐视频主要使用QUIC传输视频,目前是国内最快的。微信、淘宝、爱奇艺、抖音、百度都在部分流量或部分延迟场景下开启了QUIC。QUIC的使用逐渐成为国内互联网厂商的趋势。3QUIC协议格式经历了长期的演进和两大阵营的研究。QUIC协议有许多分支和变体。这里我们省略一些之前变化的描述,着重介绍当前的情况。目前QUIC协议主要有两个分支版本。gQUIC的一个版本,由Google构建并广泛使用。QUIC的payload内容中只能看到ClientHello包和Rejection包。其他数据包都是加密的,没有秘钥是看不到的。因此,我们先介绍一下曝光的内容。下图是gQUIC的ClientHello包结构,在wireshark中显示IETFQUIC。这是因为两个分支在合并,这部分基本相同,包括包头、CRYPTO和PADDING。header是一些基本信息,重要的是版本号和ConnectionID。CRYPTO包含特定的握手参数,这是与gQUIC和IETFQUIC最大的区别。但它们的功能相似,都提供了握手所需的域名、加密参数等信息。下图是gQUIC中的格式,是谷歌自己定义的:IETFQUIC中的CRYPTO安装了一个TLSClientHello,基本上是直接照搬TLS格式。下图是IETFQUIC的CRYPTO格式。从外部格式来看,这是两个QUIC分支最大的区别:这里介绍了从外部可以看到的格式,并且已经解释了90%。其他部分在Wireshark中都有明确的解释。.另外,最新版本的QUIC(两个分支)使用了EncryptedClientHello机制。前面介绍的ClientHello在流量中处于“加密”状态。它看起来像是一些随机字节,并且只使用了前几个字节。区分不同的QUIC版本。但是这个“加密”的密钥是隐藏在ClientHello包中的,真正的密钥可以当场计算解密。因此,Wireshark能够看??到明文的ClientHello内容。这种“加密”类似于当年的P2P协议。都是为了增加DPI设备的处理难度,最终还是需要CPU的算力。如果CPU算力不够,明文是看不到的。4QUIC交互过程Wireshark提供了QUIC流量的解密功能,可以看到使用秘钥加密前的具体内容。这样我们也可以直观的看到QUIC的交互过程。实际上,QUIC承担了TCP的功能,主要是可靠传输的保障能力。从下图可以看出,内部会发送大量的ACK报文来确认数据已经收到,并在此基础上产生重传等拥塞控制相关的能力。除了可靠传输的保证能力外,QUIC内部还有流机制。每个流都可以认为是一个独立的流,这样QUIC本身就是一个很大的加密传输隧道。QUIC内部实际传输数据的协议一般是HTTP3,这在QUIC和HTTP3之间建立了强绑定。很多时候,人们会将两者视为一回事。Wireshark目前不解析HTTP3,只能看到一些二进制数据。但是HTTP3继承了HTTP2,数据是压缩过的。仅仅几个字节可能是一个巨大的压缩请求的结果。综上所述,QUIC协议是一种融合了多种优秀特性的新型互联网传输协议,顺理成章地成为了各大互联网厂商的新宠。对此,华为还推出了HMSCore网络加速套件——hQUICKit,帮助开发者在应用中快速支持QUIC协议,辅以智能拥塞算法,最终为用户提供更快的连接建立速度和更强的抗丢包能力。和更高的吞吐量。hQUIC适用于游戏、视频通话、在线TV/VOD、VR实时直播等应用场景。其服务优势包括:易于使用:提供简单易用的编程接口,屏蔽网络细节。兼容性:兼容gQUIC协议,支持Cronet接口。提升移动网络体验:提升弱网环境下的用户体验。hQUICKit更多信息请参考:https://developer.huawei.com/...开发指南:https://developer.huawei.com/...更多详情>>访问hQUIC官网华为开发者联盟获取开发指导文档华为移动服务开源仓库地址:GitHub、Gitee关注我们,第一时间了解HMSCore最新技术资讯~