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.