该函数的作用是为了弄清楚两个包的先后顺序, 进而判断是否属于丢包的情况, 是否需要执行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
总结可能出现的情况:
-
b > a, ForwardDiff()中a-b 返回负数, 转成无符号整型变成了大正值(65535), 65535 < maxDist , AheadOf()返回false
-
b < a, ForwardDiff()中a-b 返回正数, AheadOf()返回true
-
发生回转, b在a的后面, 例如: a = 65535, b = 1, ForwardDiff()中a-b > maxDist, AheadOf()返回false
-
发生回转, b在a的前面, ForwardDiff()中a-b 返回负的大的值, 转成无符号整数为小的正的值, AheadOf()返回true
AheadOf()的第一种情况: 红色表示a值, 绿色表示b值
AheadOf()的第二种情况:
AheadOf()的第三种情况:
AheadOf()的第四种情况 :