https://www.zhihu.com/zvideo/1447315932791730176
1. QUIC简介
一种基于UDP的传输协议,用于提升网络加载速度,在弱网环境下表现较好。
2. QUIC数据格式
QUIC数据包分为Header和Data两部分。
- Frame Type:Stream、ACK、Padding、Blocked等
- Stream Frame:传输应用协议
3. QUIC实现原理
3.1 建立连接
回顾:建立连接-HTTPS
HTTPS的握手过程包含TCP握手和TLS握手
建立连接-QUIC
QUIC基于TLS实现连接建立。可以实现0-RTT握手。
前向安全:用来产生会话秘钥的长期密钥泄露出去,不会泄露以前的通讯内容。
3.2 可靠传输
可靠传输的要求
- 数据完整性:发送端发出的数据包,接收端都能收到。
- 数据有序性:接收端能按序组装数据包,解码得到原始数据。
数据完整性
实现方案:基于包号PKN和确认应答SACK的丢包重传机制
3.3 流量控制
滑动窗口
和TCP一样利用滑动窗口机制实现流量控制。 如果发送端收到了接收端的ACK帧,窗口就会向右滑动,发送新的数据包。
和TCP的不同
和TCP不同的是,QUIC的滑动窗口分为Connection和Stream两种级别
- Connection流量控制:规定了所有数据流的总窗口大小
- Stream流量控制:规定了每个流的窗口大小
3.4 拥塞控制
目的:通过拥塞窗口限制发送方的数据量,避免整个网络发生拥塞。
?swnd?
=
min
?
?[rwnd,?[cwnd]?
\text { swnd }=\min \text { [rwnd, [cwnd] }
?swnd?=min?[rwnd,?[cwnd]?
3.5 多路复用
首次提出:HTTP2
定义:单个TCP连接上可以同时发送多个HTTP请求
目的:解决HTTP1.1中单个连接1次只能发送一个请求的性能瓶颈 1个请求对应1个流,通过Stream ID就可以判断该数据帧属于哪个请求。
假设有A和B两个请求,对应的Stream ID分别为1和2。
存在问题:队头阻塞
解决方案:给每个请求流都分配一个独立的滑动窗口
3.6 连接迁移
定义:当客户端切换网络时,和服务器的连接并不会断开,仍然可以正常通信。
实现原理:QUIC的连接是基于64位的Connection ID,网络切换并不会影响Connection ID的变化,连接在逻辑上仍然是通的。
4. QUIC总结
问题:QUIC是如何提升网络加载速度的?
-
降低连接耗时:在客户端有缓存的情况下实现 0-RTT 建立连接 -
更灵活的拥塞控制:在用户态可以为每个请求配置不同的拥塞控制策略 -
无队头阻塞的多路复用:在用户态可以为每个请求配置不同的拥塞控制策略 -
连接迁移:网络切换不会中断数据传输
|