附录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。所有变量名、函数名和算法逻辑保持原样,以确保实现的准确性和一致性。