HelloBug0

1 连接迁移条件判断

函数 ngx_quic_handle_frames 中处理完一个数据包中的所有帧之后, 满足以下两个条件,则表示发生了连接迁移。

  1. 当前数据包中没有探测帧(有探测帧表示是一个探测包,只是测试如果发生连接迁移路径是否可用,而不是真正发生连接迁移)
  2. 判断当前数据包的路径(pkt->path)和连接中保存的经过验证的路径(qc->path)不同 满足以上两个条件之后,调用函数 ngx_quic_handle_migration 进行下一步处理。

2 pkt->path 如何取值

函数 ngx_quic_handle_datagram 处理一个UDP数据包,这个UDP数据报中的所有的QUIC数据包有相同的客户端地址,在处理第一个QUIC数据包时,pkt->path为NULL,对其进行初始化之后,其他的QUIC数据包的path设置为第一个pkt的path。

函数 ngx_quic_handle_payload 用于处理一个QUIC数据包中的载荷,在对数据包中载荷成功解密之后,判断pkt->path是否为空,如果为空,设置pkt->path取值。

为什么不在处理QUIC数据包头中对pkt->path进行初始化?

为了在对载荷成功解密,即验证载荷正确加密之后判断是否发生了路径迁移,出于安全考虑。

pkt->path 的取值逻辑如下:

3 连接迁移处理

函数 ngx_quic_handle_migration 的处理逻辑如下:

综上: