从服务器发起请求开始追踪,细说数据包在 QUIC 协议中经历的每一步。大量实例代码展示,简明易懂了解 QUIC。
前言
本文介绍了在 QUIC 服务器在收到 QUIC 客户端发起的第一个 UDP 请求— Initial 数据包的分析、处理和解密过程,涉及Initial数据包的格式,数据包头部保护的去除, Packet Number 的计算,负载数据的解密,client hello 的解析,等等。本文的 C 实现采用 OpenSSL,并基于 IETFQUIC Draft-27。
术语
**PacketNumber :**数据包序号
**Initial Packet:**初始数据包
**Variable-length Integer Encode:**可变长度整型编码
**HMAC:**Hash-based messageauthencation code,基于 Hash 的验证信息码
**HKDF: **HMAC-based Extract-and-Expand KeyDerivation Function,基于 HMAC 的提取扩展密钥衍生函数
AEAD: authenticated encryption withassociated data, 带有关联数据的认证加密
ECB: Electronic codebook,电子密码本
GCM: Galois/Counter Mode,伽罗瓦/计数器模式
IV: InitialVector, 初始化向量
基本概念介绍
Initial 数据包的结构
Initial 包是长头部结构的数据包,结构如图 3.1 所示,在 CRYPTO 帧后面需要跟上 PADDING 帧,这是 QUIC 协议预防 UDP 攻击的手段之一。一般情况下,CRYPTO 帧太短了(确实也有比较长“一锅炖不下”的情况,可参阅 QTS-TLS 4.3节),服务端为了响应 CRYPTO, 必须发送数据长度大得多的握手包(Handshake Packet),这样就会造成所谓的反射攻击。
QUIC 使用三种方法来抑制此类攻击:
-
含有 ClientHello 的数据包必须使用 PADDING 帧,达到协议要求的最小数据长度 1200 字节;
-
当服务端响应未经验证
Tags:
又拍云 
![[爱了]](/js/img/d1.gif)
![[尴尬]](/js/img/d16.gif)