连接迁移补充说明
- 连接迁移是指IP地址或Port端口发生变更,比如客户端发生连接迁移,则客户端的IP地址或Port端口发生改变
- QUICv1仅支持客户端发生连接迁移,支持服务端在一种情况下发生“连接迁移”,即服务端在发送给客户端传输层参数
preferred address
中指定首选服务端地址,表示建议客户端使用首选服务端地址,客户端也可以选择不使用
- 只要是端点(客户端或服务端)发生连接迁移,都需要对端对其发起连接验证,也可以不校验,但是不安全
- 发起连接验证使用通道挑战帧(PATH_CHALLENGE Frame),响应对端的连接验证使用通道回复帧(PATH_RESPONSE Frame)
- 通道挑战帧、通道回复帧、新连接ID帧、填充帧属于探测帧,其他类型的帧属于非探测帧,包含探测帧的包是探测数据包,否则为非探测数据包
- 通道挑战帧只允许出现在 0-RTT 包或 1-RTT 包中,通道回复帧只允许出现在 1-RTT包中
- 发生连接迁移的数据包只允许是 0-RTT 包或 1-RTT 包
- 发生连接迁移的数据包中一定不包含探测帧
- 包含通道挑战帧和通道回复帧的数据包并没有发生连接迁移
- 通道挑战帧和发生连接迁移的数据包中通常使用新的目的连接ID,只有在类似NAT的网络环境中,可能出现客户端的地址发生改变,但是目的连接ID没有改变
- 客户端想要发起连接迁移,在客户端侧一定有新的未使用的服务端连接ID,即目的连接ID,如果没有,则无法发生连接迁移
- 服务端收到的发生连接迁移的数据包的包号必须是当前收到的最大包号,否则直接丢弃该数据包
- 服务端发现客户端发生了连接迁移,但是在服务端侧没有新的客户端连接ID可用,则直接丢弃该数据包
- 客户端和服务端在握手过程中互相发送传输层参数
active_connection_id_limit
指示端点愿意保存的对端的连接ID的最大数量,端点根据该值通过发送新连接ID帧 (NEW_CONNECTION_ID Frame),创建新的连接ID,由对端保存使用,该值必须大于等于2
- 端点通过传输层参数
disable_active_migration
表示是否支持对端发生连接迁移
- 客户端如果连续发送两个连接迁移数据包,如果服务端对其发起的路径验证都通过,则第二次发起的连接迁移的客户端地址会作为和服务端最终通信的地址,第一次发起的连接迁移的客户端地址作为备用通信地址;如果第一次发起的连接迁移的客户端地址还没有完成路径验证,则第一次的客户端地址表示的路径会被服务端释放
- 客户端发生连接迁移,服务端对其路径验证通过之后,会发送新令牌帧(NEW_TOKEN Frame),方便后续客户端使用该令牌,和服务端快速完成握手过程
- 客户端在决定使用新的客户端地址之前,可以先发起通道挑战帧,对新路径进行验证,也可以直接使用新的客户端地址,触发服务端发起通道挑战帧,通过这种方式隐式验证到服务端是否可达
- 客户端发生连接迁移,服务端对其进行路径验证,使用的目的连接ID是服务端保存的未使用过的客户端连接ID
- 客户端发起的连接迁移的次数一定小于等于服务端保留的客户端连接ID的数量,客户端主动发起的连接迁移,使用的目的连接ID一定是一个新的目的连接ID