1.导读
在诸多的网络通信协议中,都会有序列号字段 sequence number ,这个字段主要用于丢包、乱序的处理。比如, RTP 包的头部序列号字段长度为 16 bits,取值范围为 [0, 65535]。
现在有这样一个问题:对于两个 RTP 包,如何比较哪一个包才是最新的包?
比如,序列号为 0 的包一定比序列号为 65535 的包小,是旧的包吗?再如,序列号为 65535 的包一定比序列号为 255 的包大,是最新的包吗?
当然不是这样,因为在判断序列号的连续性时要考虑回绕问题,不能直接根据数学意义上的大小进行比较。本篇将介绍 WebRTC 中与序列号回绕处理相关的算法。
2.序列号回绕
序列号的回绕方式有两种,分别是向前回绕和向后回绕。
2.1 ForwardWrap
向前回绕发生时,有如下特点:
包号呈向前递增趋势。
当前的包号很小,而前一个包号很大。
从上一个包号向前跨越包号 0 到当前的包号。
包号之间的距离小于包号类型能表示的数字个数的一半。
认为当前的包号是更大的包号,即当前包是更新的包。
下图展现了向前回绕的这些特点:
向前回绕
2.2 BackwardWrap
向后回绕发生时,有如下特点:
包号呈向后递减趋势。
当前的包号很大,而前一个包号很小。