QUIC协议在分布式系统架构中的实践
如果无法正常显示,请先停止浏览器的去广告插件。
1. QUIC 协议在分布式系统架构中的实践
OPPO / 李龙彦
OPPO网络优化领域技术专家,多年网络协议栈开发经验。目前主要
负责OPPO的移动端网络库、接入层安全的架构设计和研发工作。从
0-1建设了OPPO特色的QUIC(HTTP/3)协议,并成功在OPPO各个
业务的进行上线,对网络传输效率以及安全有较大的提升。
2. 01 . Quic协议介绍
02 . OPPO分布式系统架构
03 . Quic协议在分布式架构中的优化
04 . Quic协议实现中的问题案例分享
3. server
client
DNS解析
TCP三次握手
DNS
HTTPDNS
Server
Local DNS
HTTPDNS
SYN_SENT
(socket, connect)
1 RTT
SYN
LISTEN
(socket, bind, listen)
(accept阻塞)
SYN_RCVD
SYN, ACK
(connect返回)
ESTABLISHED
ACK
Client Hello
TLS四次握手
(accept返回)
ESTABLISHED
Server Hello,Cert,ServerKeyEx
2 RTT
TLS 1.2握手
ClientKeyEx,ChangeChipherSpec
ChangeChipherSpec
用户数据传输
User request
一个请求的过程
1 RTT
用户请求响应
Response data
DNS + 4RTT
4.
5. user
space
HTTP over QUIC
HTTP/2
QUIC
Multistreaming
TLS
user
space
TLS1.3 key negotiation
BoringSSL
is a fork of OpenSSL
flow control
congestion control
kernel
space
TCP
UDP
IP
kernel
space
6.
7. TCP+TLS1.2
TCP+TLS1.3
QUIC
8.
9. QUIC协议解决了TCP的队头阻塞问题
• HTTP/2提出了“流”的概念,实现了在一条连接上的并发请求。
• 但是TCP协议是内核态协议,无法识别“流”,QUIC连接实现在用户态,可以识别“流”。
10. 单调递增的包序号,解决了TCP重传包的二义性。
11.
12. OPPO统一接入层业务规模
数千级业务集群
数十万级容器实例
千万级QPS
数亿级用户
13.
14.
15.
16.
17. 现在业界的TLS卸载都是基于硬件的,QUIC上由于boring SSL的引入,
TLS
1
卸载
TLS的硬件卸载如何无缝兼容,也是能让QUIC大规模运行的关键
0RTT
2
优化
连接
3
迁移
QUIC设置的0-RTT的开启条件比较苛刻,在实际运行中0-
RTT率并不高,安全的提高0-RTT率是QUIC优化的重要手
段
要正确实现连接迁移并不容易,需要充分考虑的QUIC包的传输路径,即
使在同一台机器下,正确处理多核下UDP数据包传递也不容易
18. 将非对称加密过程卸载到QAT加速卡中
针对Nginx进行适配
异步处理方式
支持强大的压缩加速能力
实现了对BoringSSL库的支持,支持Quic
协议
19. OPPO的安全网关基于Nginx进行自研定制化,
继承了Nginx的异步设计特性。
OPPO与英特尔联合开发基于Quic协议的SSL卸
载方案,包括加解密库的QAT加速适配、Quic
协议栈和QAT引擎的异步化等措施。
通过这些优化,在一台web服务器中能够并发进
行TLS1.2/TLS1.3/Quic的加速,在QAT引擎库
中实现了对Open SSL和Boring SSL的同时支
持。
20. TCP+TLS1.3 性能提升达4.05倍
QUIC 性能提升达3倍
21.
22. 通过设备ID信息作为补充IP地址的补充验证,提高0-RTT率
23. 实际过程中会产生的问题:
1. 四层架构的影响:LVS、DPVS等四层负载均衡工具
基于四元组进行转发,会转发到不同的后端服务
上,导致无法连接迁移;
2. 多核的影响:由于多核的原因,连接迁移中源地址
的改变可能会让接下来的数据包去到不同的进程,
影响socket数据的接收
24.
25.
26.
27.
28. 业内统计数据全球有7%地区的运营商对UDP有限速或者禁闭,除了运营商还有很多企业、公共场合也会
限制UDP流量甚至禁用UDP。这对使用UDP来承载QUIC协议的场景会带来致命的伤害。
对此,OPPO安全网关采用多路竞速的方式使用TCP和QUIC同时建连。除了在建连进行竞速以外,还可
以对网络QUIC和TCP的传输延时进行实时监控和对比,如果有链路对UDP进行了限速,可以动态从QUIC
切换到TCP。
29. 作用
交互过程
1. 用于测试网络连接的可达性和延迟情况 1. 服务端不需要回PONG帧,ACK即可。
2. 解决连接迁移失败问题 2. PING帧中包含Token
3. 触发网络拥塞控制
PING帧的实现有
哪些问题?
如何实现
接入层架构中如何设计间隔时间
1. 1-RTT时的时候,需要在连接建立完成 1.发送时间间隔如何与四层负载均衡的超时时间进
后开始发送PING帧。 行权衡?又该如何与七层网关进行权衡?
2. 0-RTT的时候,无法确定连接是否建立
完成,PING帧该何时发送?
30. 保持和探测连接活性、及时关闭“坏死”连接,提升连接复用率
解决连接迁移偶然失败的问题
31. TOA / UOA:通过将源IP/端口信息放置到IP头的options中,服务端通过ip头中的option获取源IP
信息,支持的信息有限,V6存在局限性;
ProxyProtocol:基于TCP的协议都是使用这种方式,通过将源IP/端口信息放置到每个UDP的
payload的起始位置,服务器端在获取报文后,将前面payload的源IP信息取出来,支持V4/V6;
32.
33.
34. 通过弱网实验测试,QUIC在开启0-RTT时,其延迟要比HTTP降低20%,比HTTPS要降低50%以上。
现在主要在海外商店、小布助手等多个业务上线使用QUIC。
35. 在海外软件商店、小布助手上线后,性能有显著提升:接口成功率提升3%~13%,秒开率提升
2%~19%,平均延时提升27%~50%。
36.
37. 握手包乱序导致建连时间特别长
Retry报文引起建连需要2-RTT
38. 为了防止放大攻击,握手需要多个RTT
39.
40.
41. 更多网络相关知识,请关注我的
微信公众号:网络小菜鸟