HelloBug0

1 管理收到的数据包包号

每收到一个数据包,在数据包中的所有帧都处理结束之后,调用ngx_quic_ack_pacjet 函数,将当前包的包号放入ACK Range中。

注意

要点

假设当前数据包包号空间中已经收到的数据包包号为N

综上:

综上:

ngx_quic_ack_packet 函数的功能不是发送ACK帧,而是将当前包的信息放入ACK Range中。

2 确认收到的数据包

在调用函数 ngx_quic_output 发送数据包时,在每个数据包号空间中调用 ngx_quic_generate_ack 函数,在该函数中判断是否需要发送ACK帧。

2.1 发送ACK帧的条件

以下三个条件同时满足,则等待一段时间再发送ACK帧,否则在当前数据包中发送ACK帧。

  1. 没有要发送的帧
  2. ctx->send_ack小于2
  3. 和上一次发送ACK帧的时间间隔小于传输层参数max_ack_delay的取值

2.2 ctx->send_ack取值变化

ngx_quic_ack_packet 中设置 ctx->send_ack 的取值,如下:

ngx_quic_generate_ack 中,在将ACK帧放入发送队列之后,设置 ctx->send_ack = 0