跳到主要内容

10. 连接终止

10. 连接终止 (Connection Termination)

已建立的 QUIC connection 可以通过以下三种方式之一终止:

  • idle timeout (第 10.1 节)
  • immediate close (第 10.2 节)
  • stateless reset (第 10.3 节)

10.1 空闲超时 (Idle Timeout)

如果任一 endpoint 在其 transport parameters (第 18.2 节) 中指定了 max_idle_timeout, 当连接保持空闲的时间超过双方 endpoint 通告的 max_idle_timeout 值中的较小者时, 该连接会被静默关闭, 其状态也会被丢弃.

10.1.1 活性测试 (Liveness Testing)

endpoint 可以使用 PING frame (第 19.2 节) 测试连接活性, 或防止 idle timeout.

10.1.2 推迟空闲超时 (Deferring Idle Timeout)

如果 endpoint 希望维持连接, 它可能需要发送 ack-eliciting packet 以避免 idle timeout.

10.2 立即关闭 (Immediate Close)

endpoint 发送 CONNECTION_CLOSE frame (第 19.19 节) 以立即终止连接.

10.2.1 关闭连接状态 (Closing Connection State)

发送 CONNECTION_CLOSE frame 之后, endpoint 进入 closing state.

10.2.2 排空连接状态 (Draining Connection State)

endpoint 收到 CONNECTION_CLOSE frame 时进入 draining state.

10.2.3 握手期间的立即关闭 (Immediate Close during the Handshake)

endpoint 可以在握手期间, 在使用适当加密级别的 packet 中发送 CONNECTION_CLOSE frame 来关闭连接.

10.3 无状态重置 (Stateless Reset)

stateless reset 是为无法访问某个连接状态的 endpoint 提供的最后手段.

10.3.1 检测无状态重置 (Detecting a Stateless Reset)

endpoint 通过检查 datagram 末尾的 16 字节来检测潜在的 Stateless Reset.

10.3.2 计算无状态重置令牌 (Calculating a Stateless Reset Token)

stateless reset token MUST 难以猜测.

10.3.3 循环 (Looping)

Stateless Reset 的设计保证: 如果不知道 stateless reset token, endpoint 就无法生成 Stateless Reset.