[QUIC] QUIC Frames
PADDING
PADDING Frame {
Type (i) = 0x00,
}
这个帧用于增加 QUIC 包的大小。
对于 Initial
包, 可以用它来增加包大小以达到要求的最小包的大小限制。
填充 QUIC 包以对抗流量分析。
这个帧的大小为1字节,表明自己是一个 PADDING
帧。
PING
PING Frame {
Type (i) = 0x01,
}
通信双方可以使用 PING
帧来验证对方是否依然在线或者对方节点是否可达。
这个帧的大小为1字节,表明自己是一个 PING
帧, 不携带任何数据。
对于 PING
帧的接收方,需要为携带此 PING
帧的 QUIC 包发送 ACK
.
当没有长时间没有上层应用程序数据需要传输时, 为了防止链接因为空间超时而被关闭,可以通过发送 PING
帧来保持当前连接不被断掉。
ACK
接收方通过发送 ACK
帧来通知发送方它成功接收并处理了相关的 QUIC 包。
ACK
帧中可以包含一到多个 ACK 范围(ACK Ranges). ACK 范围表明确认接收的包。
ACK Frame {
Type (i) = 0x02..0x03,
Largest Acknowledged (i),
ACK Delay (i),
ACK Range Count (i),
First ACK Range (i),
ACK Range (..) ...,
[ECN Counts (..)],
}
Largest Acknowledged
: 整数, 表示当前接收方接收并发送确认的最大包编号.
ACK Delay
: 整数, 表明发送当前 ACK 的延迟(Delay). 单位是 milliseconds.
计算公式:delay = ACK Delay
* (2 ^ ack_delay_component
(transport parameter))
不直接在这里编码原始 delay 值的原因是:想用最少的字节数来编码更大的范围,以牺牲精确度为代价。
ACK Range Count
: 表示当前帧中 ACK Ranges
的 ACK 范围的数量。
First ACK Range
: 整数, 表示在当前 Largest Acknowledged
包之前的连续的包的数量。
也就是, 当前 ACK范围的最小 Packet Number 是 Largest Acknowledged
- First ACK Range
ACK Ranges
: 包含一组 ACK 范围,通知发送方我们已经成功接收并处理。 它有着特殊的编码规则,后边描述。
ECN Counts
: 略
ACK 范围