HTTP3 Part5: QUIC帧类型

QUIC帧类型

Frame 类型 描述
STREAM 用于传输应用数据,带有流标识符。每个STREAM帧都属于一个特定的流(Stream),它包含数据的偏移量和长度信息,以便接收方能够正确地重组数据。
ACK 确认已成功接收的数据包,可能包含延迟信息。 ACK帧可以包括一个或多个ACK块,用于表示已成功接收的数据包区间。
RESET_STREAM 终止指定的流并传递错误代码。
STOP_SENDING 请求停止指定的流,并指示对等端停止发送。
CRYPTO 传输加密握手数据。
NEW_TOKEN 传输新的连接恢复令牌,优化后续连接。
MAX_DATA 通知对等方允许的最大数据量限制。
MAX_STREAM_DATA 指定单个流的最大数据量限制。
MAX_STREAMS 指定允许打开的最大流数量(双向或单向)。
DATA_BLOCKED 通知对等方流量被阻塞,等待对方提升限制。
STREAM_DATA_BLOCKED 指定流的流量被阻塞。
STREAMS_BLOCKED 通知对等方因流数量限制而被阻塞(双向或单向)。
NEW_CONNECTION_ID 传输新的连接标识符,支持连接迁移。
RETIRE_CONNECTION_ID 通知对等方不再使用某个连接标识符。
PATH_CHALLENGE 发送路径验证挑战数据包。
PATH_RESPONSE 响应路径验证挑战数据包。
CONNECTION_CLOSE 终止连接并发送错误信息(用于传输级或应用级)。
HANDSHAKE_DONE 服务端确认握手完成,客户端可以发送 1-RTT 数据。握手完成帧只可以由服务端发送。
PING 用于检测对等端是否活跃,没有负载。

下面是一些从参考资料摘录的帧介绍。

ACK帧

ACK帧 {
  类型 (i) = 0x02..0x03,
  最大确认数 (i),
  ACK延迟 (i),
  ACK块计数 (i),
  首个ACK块 (i),
  ACK块 (..) ...,
  [ECN计数 (..)],
}

ACK帧包含一个或多个ACK块(ACK Range)。ACK块标识被确认的数据包。如果帧类型为0x03,ACK帧也会包含到目前为止在该连接上收到的带有相关ECN标记的QUIC数据包的累计值。

属于不同数据包号空间的数据包可以使用相同的数值标识。数据包的一个确认需要同时标明数据包号和数据包号空间。

ACK块 {
  空档 (i),
  ACK块长度 (i),
}

空档(Gap):一个可变长度整型值,表示比前述ACK块中的最小数据包号小一的数据包之前连续未被确认数据包的数目。

ACK块长度(ACK Range Length):一个可变长度整型值,表示先前空档确定的最大数据包号之前连续被确认数据包的数目。

STREAM帧

流帧 {
  类型 (i) = 0x08..0x0f,
  流ID (i),
  [偏移 (i)],
  [长度 (i)],
  流数据 (..),
}

CRYPTO帧

加密帧 {
  类型 (i) = 0x06,
  偏移 (i),
  长度 (i),
  加密数据 (..),
}

每个加密级别都有一条单独的加密握手数据流,每条流都从偏移量0开始。也就是说每个加密级别都被视为一条单独的加密数据流。

这样的数据流其最大偏移量——偏移量与数据长度之和——不能超过2^26-1。

数据流没有一个明确的结束点,所以加密帧没有FIN位。

PATH_CHALLENGE帧和PATH_RESPONSE帧

通道挑战帧 {
  类型 (i) = 0x1a,
  数据 (64),
}

终端可以使用通道挑战帧(PATH_CHALLENGE frame,类型是0x1a)检查到对端的可达性以及进行连接迁移过程中的通道验证。

包含64位任意数据的通道挑战帧确保接收数据包比猜测值的正确性更简单。

接收方收到该帧后必须生成一个包含同样数据字段内容的回复通道帧

回复通道帧 {
  类型 (i) = 0x1a,
  数据 (64),
}

参考资料

Built with Hugo
Theme Stack designed by Jimmy