Skip to main content

附录B. 拥塞控制伪代码 (Congestion Control Pseudocode)

本附录描述了第7章中描述的拥塞控制器的示例实现。

本节中的伪代码段作为代码组件获得许可;请参阅版权声明。


B.1. 相关常量 (Constants of Interest)

拥塞控制中使用的常量基于RFC、论文和常见实践的组合。

  • kInitialWindow: 初始在途字节数的默认限制,如第7.2节所述
  • kMinimumWindow: 最小拥塞窗口(字节),如第7.2节所述
  • kLossReductionFactor: 检测到新的丢包事件时用于减少拥塞窗口的缩放因子。第7章推荐值为0.5
  • kPersistentCongestionThreshold: 建立持续拥塞的时间段,指定为PTO乘数。第7.6节推荐值为3

B.2. 相关变量 (Variables of Interest)

实现拥塞控制机制所需的变量。

  • max_datagram_size: 发送方当前的最大有效载荷大小
  • ecn_ce_counters[kPacketNumberSpace]: 对等方在ACK帧中为数据包编号空间报告的ECN-CE计数器的最高值
  • bytes_in_flight: 所有已发送但尚未确认或声明丢失的包含至少一个引发确认帧或PADDING帧的数据包的大小总和(字节)
  • congestion_window: 允许在途的最大字节数
  • congestion_recovery_start_time: 当前恢复期开始的时间
  • ssthresh: 慢启动阈值(字节)

B.3. 初始化 (Initialization)

在连接开始时,按如下方式初始化拥塞控制变量。

伪代码详见RFC 9002原文附录B.3。


B.4. 发送数据包时 (On Packet Sent)

每当发送包含非ACK帧的数据包时,该数据包会增加bytes_in_flight。

伪代码详见RFC 9002原文附录B.4:

  • OnPacketSentCC(sent_bytes)

B.5. 数据包确认时 (On Packet Acknowledgment)

从丢包检测的OnAckReceived调用此函数,并提供来自sent_packets的新确认的数据包。

伪代码详见RFC 9002原文附录B.5:

  • InCongestionRecovery(sent_time)
  • OnPacketsAcked(acked_packets)
  • OnPacketAcked(acked_packet)

B.6. 新拥塞事件时 (On New Congestion Event)

当检测到新的拥塞事件时,从ProcessECN和OnPacketsLost调用此函数。如果尚未处于恢复期,这将启动恢复期并立即减少慢启动阈值和拥塞窗口。

伪代码详见RFC 9002原文附录B.6:

  • OnCongestionEvent(sent_time)

B.7. 处理ECN信息 (Process ECN Information)

当从对等方接收到带有ECN部分的ACK帧时调用此函数。

伪代码详见RFC 9002原文附录B.7:

  • ProcessECN(ack, pn_space)

B.8. 数据包丢失时 (On Packets Lost)

当DetectAndRemoveLostPackets认为数据包丢失时调用此函数。

伪代码详见RFC 9002原文附录B.8:

  • OnPacketsLost(lost_packets)

B.9. 从在途字节数中移除丢弃的数据包 (Removing Discarded Packets from Bytes in Flight)

当丢弃Initial或Handshake密钥时,在该空间中发送的数据包不再计入在途字节数。

伪代码详见RFC 9002原文附录B.9:

  • RemoveFromBytesInFlight(discarded_packets)

注意:完整的伪代码实现请参考RFC 9002官方文档附录B。所有变量名、函数名和算法逻辑保持原样,以确保实现的准确性和一致性。