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


完整设计细节 。它在IPv4中通常就是一个IP头,后面接着是一个UDP头和UDP负载(可能为一
个RTP头及其负载) 。不过,FULL_HEADER也可以携带IP封装的包,其中可能有两个IP头
及其相应的UDP和RTP 。对于IPv6,该包还可能是IPv6和IPv4头的组合 。通常每个后续头都
由前一个头的类型字段来指示 。
FULL_HEADER包与IPv4或IPv6包的区别在于它必须携带压缩环境ID和4位的顺序号 。为了
避免头变大,这些值被插入到IP和UDP头的长度字段中,因为实际的长度可以根据链路层提
供的长度推算出来 。这里需要2个16位长的字段:它们来自包中的头两个可用头 。对于
IPv4/UDP包,第一个长度字段是IP头总长度字段,第二个字段是UDP头长度字段 。对于IPv4
封装包,第一个长度字段为第一个IP头的总长度字段,第二个字段是第二个IP头的总长度字
段 。
如5.3.2节所规定,环境ID(CID)和4位顺序号的位置取决于是采用8位还是16位环境ID,
如下图所示(16位宽,左边为最高位):
对于8位环境ID:
- - - - - - - - - - - - - - - -
01GenerationCID第一长度字段
- - - - - - - - - - - - - - - -
- - - - - - - - - - - - - - - -
0seq第二长度字段
- - - - - - - - - - - - - - - -
对于16位环境ID:
- - - - - - - - - - - - - - - -
11Generation0seq第一长度字段
- - - - - - - - - - - - - - - -
- - - - - - - - - - - - - - - -
CID第二长度字段
- - - - - - - - - - - - - - - -
第一长度字段的起始位表示CID的长度 。CID的长度要么对于所有环境均相同,要么必须
提供两个额外包类型来分别指示COMPRESSED_UDP和COMPRESSED_RTP包格式采用8位还是16位
CID 。对于IP/UDP/RTP压缩方案,第一长度字段的第二位为1表示当前为4位顺序号 。
在IPv6的COMPRESSED_NON_TCP包中使用Generation字段方法如[3]所述 。IPv4实现不使用
COMPRESSED_NON_TCP包,压缩器应该将generation字段设置为0 。为了使IPv4和IPv6操作一
致,当解压器接收到Generation值后就将它存在环境中,并在CONTEXT_STATE包中返回最近
的值 。
当接收到一个FULL_HEADER时,接收方将整个头存在由环境ID选择的环境中 。4位顺序号
也存在环境中,从而可实现解压器和压缩器的同步 。在使用COMPRESSED_NON_TCP包时,顺序
号插入到该包的“Data字段”中,并且D位设置参照[3]的第6节所述 。在接收到
COMPRESSED_NON_TCP包后,接收方将Generation号和存在环境中的值进行比较 。假如不同,
则环境已经过期,需要用该FULL_HEADER包来进行刷新 。假如一致,则压缩的IP和UDP头信息,
顺序号,以及RTP头都存入已保存的环境中 。
保存环境所需要的内存数量取决于FULL_HEADER中到底封装了多少个头 。最大头的大小可
通过压缩/解压缩双方协商得到 。
3.3.2.COMPRESSED_RTP包格式
假如包中RTP头的二次差分值为0,则解压器只需在前一个包的未压缩头上加上存储的一
次差分值就可以重建该包 。双方之间只需传输会话环境标识符和顺序号就可以维持同步和检
测出丢失包 。
假如包中RTP头某些字段的二次差分值不为0,则要在双方要传输这些字段的新的一次差
分结果的压缩编码 。除了要把新的一次差分值加到解压器会话环境的未压缩头上,也要加到
那些二次差分为0的后续包的相应字段上并显式地存储到环境里 。每当一次差分改变时,都
要对其进行传输和存储 。在实际应用中,唯一需要用到一次差分的字段就是IPv4ID字段和
RTP时间戳字段 。
RTP顺序号字段的增量为1 。假如顺序号变化不是1,则必须进行通信以报告该区别,但并

推荐阅读