- 一个数据包中可能包含多个流的流帧
- 一个数据包丢失,只会阻塞该数据包中的流,所以一个数据包中应尽可能少地包含多个流,避免丢包对多个流的影响
- 数据包的处理需处理到准备被应用协议接收之前才可以发送对该数据包的确认
-
终端收到一个它未发送过的数据包的确认,视为 Protocol Violation
(协议违背)错误
- 终端必须在max_ack_delay之间之内对ACK出发包进行确认
- 对于初始数据包和握手数据包必须立即确认
- ACK触发包指触发ACK确认的数据包,非ACK出发包通常指仅包含ACK帧的数据包,仅包含ACK帧的数据包不需要确认
- 用于确认的ACK帧可以和其他帧放在一个数据包里发生,减少网络负载
- 如果收到的数据包号小于或大于已经收到的ACK触发包的包号,应该立即发送ACK帧
-
如果收到的数据包的IP头部包含ECN标记,应该立即发送ACK帧
- 推荐:接收方在收到至少两个ACK出发包后应该发送一个ACK帧
- 接收方在决定是否要发送ACK帧作为响应前可以先处理几个可用的数据包,然后再发送ACK帧
- ACK帧中包含了端点收到的所有包的信息,收到的包越多,ACK帧的内容越大,当一个ACK帧不能放进单个QUIC数据包中时,数据包号更小的信息会被忽略
- 如果一些数据包已经被确认了,后续可以不对这些包进行追踪
- 接收方限制它记录的ACK块的数量和在ACK帧中发送的ACK块的数量,一方面避免ACK帧的尺寸过大,一方面停止追踪已经被确认的ACK块
- 如果ACK帧过大,ACK帧的发送方可能会丢掉一些ACK块,会造成某些数据包已经确认但是没有告诉对方,造成重传
- 接收方可以丢弃所有ACK块,但是必须保留已经被成功处理的最大的数据包号,这样接收方可以从后续数据包中恢复数据包号
- ACK可能丢包,导致发送端重发数据包
- 如果数据长时间大量的单向传输,接收端可以每经过一个RTT就发送一个PING帧,触发对端发送ACK帧,验证数据传输是否依然正常
- 端点收到一个数据包到发送ACK帧的时间间隔,应该在ACK帧中报告给对端,方便对端更准确的计算RTT时间
- 数据包和对该包进行确认的ACK帧所在的数据包的包号空间必须保持一致
-
填充帧消耗拥塞控制窗口,但是填充帧不需要ACK帧确认
- 启用ECN的端点收到IP数据包之后,统计IP数据包包头中的ECT(0)、ECT(1)或ECN-CE的数量,将这些信息放在ACK帧中
- 数据包号有不同的空间,ECN计数在每个数据包号空间里单独统计,如果一个IP数据包中包含多个不同数据包号空间的数据包,则每个数据包号空间里的ECN计数都要增加;重复的数据包不会导致ECN计数重复增加
- 在新路径上发向对端的前面几个数据包的IP头部设置ETC(0)或ECT(1)码点,如果发现设置ETC码点的数量和发送的不一致,则说明路径不支持ECN,即ECT(0)的数量需保持一致,ECT(1)的数量需保持一致,总数需保持一致
- 端点应该根据当前收到的最大包号里的ACK帧进行ECN验证
- ECN验证失败,终端必须禁用ECN,即发送的IP数据包中不再设置ECT码点
- ECN验证失败之后,终端可以继续定期验证路径是否支持ECN