低速串行链路下IP/UDP/RTP数据包头的压缩( 八 )


种情况很少见,所以负数值编码范围更小,仅使用表中正数值剩余的部分 。
RTP时间戳值中小于-16384或大于4194303的改变都会导致强制发送未压缩的
FULL_HEADER,COMPRESSED_NON_TCP或COMPRESSED_UDP类型RTP头 。IPID和RTP顺序号字段都
只有16位,所以这些字段的负数delta都掩蔽为16位再进行编码(作为16位正数) 。
3.3.5.错误恢复
除了由FULL_HEADER和COMPRESSED_NON_TCP包设置外,当特定环境的4位顺序号增量不为1
时,解压器必须将环境置为无效并发送CONTEXT_STATE包回压缩器表示环境已经无效 。无效
环境的所有当前包都必须丢弃,直到收到一个FULL_HEADER或COMPRESSED_NON_TCP重建稳定
状态为止(除非使用了本节后面将描述的"twice"算法 。) 。由于在这一过渡时期可能会有
多个压缩包到达,解压器应该为每个收到的压缩包重新传输CONTEXT_STATE包,但应该限制
重传输率以避免反向通道的溢出 。
当链路中出现错误时,链路层通常将放弃损坏的包,但可以提供一个错误指示 。在相同
环境的另一个包传输前可能会消耗一些时间,然后该包将被解压器发现乱序而抛弃,造成至
少两个包丢失 。链路提供显示地错误指示是为了快速恢复,解压器可以有选择地发送一个咨
询CONTEXT_STATE包为最近的一个或多个活动环境(没必要为所有环境)列出最近有效的顺
序号和generation号 。对于给定的环境,假如压缩器还没有发送更高顺序号的压缩包,并且
generation号和当前号一致,则不需要任何校正动作 。否则压缩器就得选择标志环境为无效
以便下一个包以FULL_HEADER或COMPRESSED_NON_TCP模式(假如generation号不一致则需要
FULL_HEADER)发送 。不过可以注重到,假如链路层RTT时间比包间隙很大,这时已经有多个
不同环境的包沿链路发送了,这使得在压缩器收到CONTEXT_STATE包时顺序号可能已经增大 。
其结果就是有些环境被没必要地变为无效,导致额外地消耗了带宽 。
下图所示为CONTEXT_STATE包的格式 。第一个字节是类型码,答应CONTEXT_STATE包类型
被[3]中定义的通用压缩框架中的多个压缩方案共享 。包其余部分的内容取决于具体的压缩
方案 。在本文的IP/UDP/RTP压缩方案中,其余部分组织为一个块的列表,可以为多个环境指
示状态,前面为一个字节表示的块数目 。
IP/UDP/RTP压缩方案中使用了两个类型码值 。1表示采用8位会话环境:
01234567
--- --- --- --- --- --- --- ---
1=IP/UDP/RTP如CID为8位
--- --- --- --- --- --- --- ---
会话计数
--- --- --- --- --- --- --- ---
--- --- --- --- --- --- --- ---
会话环境ID
--- --- --- --- --- --- --- ---
I000顺序号
--- --- --- --- --- --- --- ---
00generation
--- --- --- --- --- --- --- ---
...
--- --- --- --- --- --- --- ---
会话环境ID
--- --- --- --- --- --- --- ---
I000顺序号
--- --- --- --- --- --- --- ---
00generation
--- --- --- --- --- --- --- ---
2表示使用16位的会话环境ID 。
会话环境ID按照网络字节顺序发送(最高位优先):
01234567
--- --- --- --- --- --- --- ---
2=IP/UDP/RTP如CID为16位
--- --- --- --- --- --- --- ---
会话数目
--- --- --- --- --- --- --- ---
--- --- --- --- --- --- --- ---
会话环境ID
--- --- --- --- --- --- --- ---
I000顺序号
--- --- --- --- --- --- --- ---
00generation
--- --- --- --- --- --- --- ---
...
--- --- --- --- --- --- --- ---
会话环境ID
--- --- --- --- --- --- --- ---

推荐阅读