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


在设计阶段为了实现简单而牺牲一些通用性,或者在设计上灵活通用但为了简单性可对设计
进行子集化 。通过在压缩和解压器之间用更复杂的模型通信改变头字段还可以达成更好的压
缩效果,但其复杂性却是没必要的 。下一节将讨论这里列出的一些折中方案 。
2.1.单工与全双工
在没有其它限制的情况下,单工链路上的压缩方案应成为首选 。但为防止错误发生,单
工链路上的操作需要用一个含有压缩状态信息的未压缩包头进行周期性的刷新 。假如明显的
错误信号可以返回,则恢复延迟也可以实质性地缩短,无错误情况的开销也会降低 。为了实
现这些性能的优化,本规范包括了一个可逆向发送的明显错误指示 。
在单工链路中,可以使用周期性刷新来取代 。解压器一旦侦测到错误存在于某个特定的
流中,它可以简单地放弃该流中所有的包直到接收到一个未压缩的头为止,然后继续解压 。
其致命弱点在于可能要在恢复解压前要放弃大量的包 。周期性刷新的方法在[3]的3.3节中进
行描述,它应用于单工链路的IP/UDP/RTP压缩,或者应用于其它非TCP包流的高延迟链路 。
2.2.分片与分层
在低速链路上发送大型数据包所需时间而导致的延迟对于单向音频应用不算什么大问
题,因为接收方可以适应延迟变动 。但对于交互式的交谈,最小端到端延迟是非常要害的 。
对大的,非实时数据包进行分片以答应小的实时包在分片间隙进行传送可以降低这种延迟 。
本规范只处理压缩,并且假定,假如包括分片,也将被处理为一个单独层 。将分片和压
缩按这种方式进行集成并不可取,因为一旦如此,在没有必要或不可能进行分片的情况下,
连压缩都不能使用 。类似地,应该避免预留协议的任何需求 。除了要求链路层提供一些包类
型码,一个包长度指示和良好的错误检测外,该压缩方案可独立于任何其它机制而应用在本
地链路的两端 。
相反,单独对IP/UDP和RTP层进行压缩丢失了太多的压缩效率,这些效率可以通过将它们
一起对待而得到 。由于相同的函数可以应用于所有层,实现跨越这些协议层边界的方案是恰
当的 。
3.压缩算法
本文定义的压缩算法主要利用了RFC1144[2]描述的TCP/IP头压缩的设计 。读者可以参考
该RFC获取更多的关于对包头进行压缩的基本动机和通用原理 。
3.1.基本概念
对TCP头压缩的研究发现,IP和TCP头有一半的字节在整个连接期间保持不变,这正是降
低数据率的两个要素中的首要因素 。因此,在发送一次未压缩头之后,可以将这些字段从其
后的压缩头中除去 。其余的压缩来自对变化字段进行区分编码以减少长度,以及在通常情况
下根据包长度计算变化而完全删除掉变化字段 。这一长度由链路层协议指示 。
对于RTP头的压缩也可以采用一些相同的技术 。不过最大的收获在于人们发现,尽管每个
包中总有几个字节要发生变化,但包与包之间的区别却是恒定的,因此二次差分为0 。在会
话期间,通过维护压缩与解压器共享的未压缩头与一次差分序列,所需通信的便只有二次差
分为0的指示了 。在这种情况下,假如不考虑任何信息丢失,则解压器在收到一个压缩包后
可以通过将一次差分结果加到保存的未压缩头来重建原始包头 。象TCP/IP头压缩为多个同时
的TCP连接维护一个共享状态一样,IP/UDP/RTP压缩也应该为多个会话环境维护状态 。一个
会话环境是由IP源地址和目的地址,UDP源端口和目的端口,以及RTP的SSRC字段定义 。解压

推荐阅读