丢包重传NACK与RTX - 判断包位置的算法

144 阅读1分钟

该函数的作用是为了弄清楚两个包的先后顺序, 进而判断是否属于丢包的情况, 是否需要执行nack逻辑.

函数AheadOf()

  • AheadOf(a, b), 比较a与b的顺序关系

  • a与b必须是无符号整数

  • 如果b排在a之前, 则返回true, 否者返回false

  • 并不是简单的数值大小的比较

  • AheadOf()首先判断a、b是否相等, 如果a等于b, 直接返回false
  • AheadOrAt()中之所以maxDist设置为2的16次方的一半加1(65536/2+1=32769), 是因为实际情况中即使乱序也不可能有这么大的跨度, 该值为极端值.
  • AheadOrAt()中调用ForwardDiff()将a、b顺序颠倒做减法, 即前面参数a-参数b

总结可能出现的情况:

  1. b > a, ForwardDiff()中a-b 返回负数, 转成无符号整型变成了大正值(65535), 65535 < maxDist , AheadOf()返回false

  2. b < a, ForwardDiff()中a-b 返回正数, AheadOf()返回true

  3. 发生回转, b在a的后面, 例如: a = 65535, b = 1, ForwardDiff()中a-b > maxDist, AheadOf()返回false

  4. 发生回转, b在a的前面, ForwardDiff()中a-b 返回负的大的值, 转成无符号整数为小的正的值, AheadOf()返回true

AheadOf()的第一种情况: 红色表示a值, 绿色表示b值

AheadOf()的第二种情况: 

AheadOf()的第三种情况:

AheadOf()的第四种情况 :