连接迁移说明(RFC9000 第9章 )
- QUIC握手完成之前,终端不能发起连接迁移,即握手过程中发送端的IP和Port地址一定不能发生变化
- 如果端点发送的传输层参数 disable_active_migration为真,则在连接建立之后,接收端一定不能发生连接迁移
- 端点地址的变化存在两种情况,一种是使用的网络环境发生变化,比如从WiFi切换到蜂窝网络,客户端使用的目的连接ID发生改变;一种是中间设备,比如NAT,将端点的源IP地址映射到一个新的出口IP或者新的Port,客户端使用的目的连接ID不变
- 如果对端的地址发生变化,接收端可以选择丢弃,也可以选择发起连接验证
- 客户端进行连接迁移时,无需验证服务端的地址
- 路径验证之后,应该向对端发送NEW_TOKEN帧,提供新的令牌
- QUICv1版本仅支持客户端发生连接迁移,即客户端的IP地址或Port发生改变
- 连接迁移之后,需要重新设置拥塞控制状态和RTT上下文,但如果是NAT重绑定,拥塞控制状态和RTT上下文一般保持不变
- 发生连接迁移之后,接收方的数据包可能出现乱序,因为不同的网络路径的RTT不同
- 服务端发现客户端发生了连接迁移,需要对新路径进行连接验证,拥塞控制状态和RTT上下文的切换可在收到客户端的PATH_RESPONSE帧之后,因为如果验证失败,服务端和客户端之间还会使用旧路径,即使用原来的拥塞控制状态和RTT上下文
- 如果发送的PATH_CHALLENGE帧没有收到响应,应该重发该帧类型,并且等待比之前更长的时间等待PATH_RESPONSE帧
- 使用不同的客户端地址发送数据包时,使用不同的目的连接ID,防止攻击者将某个用户的网络活动互相关联起来
- 客户端随时可以使用一个新的目标连接ID,即使并没有发生连接迁移
- 客户端不应该在使用0长度的连接ID时发生迁移,因为服务端难以将迁移前和迁移后的路径关联起来
- 客户端在沉默一段时间之后,可能希望改变IP或Port减少网络路径之间的关联性,但是这样会造成对端重置其拥塞状态等,不建议经常这样做
- 服务端在传输层参数中提供preferred_address参数,里面提供服务端的其他IP地址、连接ID等信息
- 客户端可以选择一个适合其网络的IP地址进行路径验证,如果验证通过,则使用新的IP地址和服务端通信,注意路径验证的目的IP、目的连接ID是服务端在preferred_address参数中提供的IP地址、连接ID
- 如果客户端对服务端的新IP进行路径验证通过,后续通过该新IP地址和服务端通信;如果服务端在旧的IP上收到属于新IP路径上的包,则丢弃处理;如果收到之前发给旧IP的包,则进行处理
- 客户端想要使用新的服务端首选IP,但是此时也想改变一下自己的IP或者Port,此时客户端使用新的客户端地址同时对原始和首选服务端地址发送地址验证,哪个成功了用哪个,验证过程中,如果首选服务端地址提前通过验证,则放弃对原始服务端地址的路径验证。如果服务端的首选服务器地址上收到的包,发现客户端发生了连接迁移,则也要发起路径验证
- 首选地址中的连接ID,可以在任何网络路径上使用,并不必须在客户端使用服务端的首选地址的时候使用