概念理解
原视频: QUIC核心原理和握手过程_哔哩哔哩_bilibili
quic包传输原理
每个quic包都有自己的号码, 如果丢失一个quic包就知道丢失了quic包里的什么数据流, 其他quic包不需要停着不动等待前面丢失的quic包重传, 只需要重传必要的quic包, 以此来解决TCP的队头阻塞问题
但是丢包的数据刚好是阻塞浏览器渲染页面的文件, 比如是CSS的一部分, 那么我们的页面还是无法渲染, 看着解决了队头阻塞问题, 另一个问题又出现了
0-RTT
三次握手为什么是1-RTT, 因为在第三次client发送ack的时候就可以直接发送数据了, 不需要等待, 所以实际上只有1-RTT.
为什么quic的通信可以是0-RTT?
因为quic包将加密方式和信息都已经整合到发送的quic包中了, 所以可以和数据一起进行发送, 从而达到0-RTT.
所以可以理解为1-RTT
是quic的首次通信, 而0-RTT
是通信的恢复.
1-RTT握手的本质还是: TCP+TLS
- 一开始客户端会发送
client hello
打招呼 - 接着服务端会响应
server hello
作为确认 - 这两步的作用可以理解为加密初始化, 两步完成以后下面的信息都是加密信息了
数据包解析
1-RTT建立连接
- 发送
client hello
数据包
在最开始打招呼的时候就已近包含了加密随机数,加密套件, 压缩方式等等加密信息
- 响应
server hello
数据包
服务端的server hello
也提供了相应的加密参数内容
正是两步双方提供了各自需要的加密参数, 生成了人中间人不知道的秘钥
- 服务端发送数据包
除了连接信息就是加密信息了
意思就是服务端在发送server hello
之后, 还会把一些关于安全的扩展信息跟着一起发送,比如证书.
- 客户端响应
Finished
- 服务端响应
HANDSHAKE_DONE
而且这些quick包一般会分为多个同时进行发送, 在确认发送完毕以后客户端会响应Finished来表示握手正式完成, 一般来说服务端也会响应 HANDSHAKE_DONE
来表示握手正式完成.同理实际上在客户端发送HANDSHAKE_DONE
的同时就已经可以发送数正式的据包了.
- 接下来就是包含HTTP/3的数据传输
0-RTT通信恢复
quic实现
GitHub - netty/netty-incubator-codec-quic
使用示例: reactor-netty/reactor-netty-incubator-quic at main · reactor/reactor-netty · GitHub