ROHC协议简介

引言

在网络传输和无线通信的过程中,我们会用到很多传输协议,诸如TCP/IP,UDP等。这些协议的报文头都有一定的规律,并且很大一部分在传输过程中是不变的,当我们单次传输的数据比报文头还短时,报头就成了一个累赘。我们可以利用报头的变化规律对报头进行压缩,提高传输效率。ROHC就是这么一种协议。

以下是我看了一些论文和英文版的白皮书之后归纳出来的内容,适合像我一样的初学者看,快速了解这一协议。

ROHC协议原理

预备知识:
完整的信号报头(信头)包括:静态信头 + 动态信头 ,分别有各自的 域 和 值。
解压方需要知道压缩方的传输协议才能解压,协议通过profile标识,对每一种协议固定一个PID
解压方通过 CID 和 PID 实现解压。CID在后面有解释。
文景(contex):英文直译是上下文的意思。在这里表示压缩后的信息。

预备工作
压缩方:
将完整信号报头(信头)保存在本地的“压缩文景”数据结构中。 <- 之后按照这个“表”传递变化的值域;
为每个文景分配一个文景标识符(CID) <- 用于唯一识别数据流;

解压方:
将完整的信头域和值保存到本地“解压文景”数据结构;
建立起一个完整的解压文景后,压缩方才开始发送压缩后的分组;
在后续的数据传输中,解压方根据分组的 CID 查找解压文景进行解压;

压缩方状态:

IR(initiation and refresh state)状态:
初始化/重置状态。初始化/更新文景中的静态/动态域信息。
动作:连续发送全部 PID 和 CID,以及未压缩的明文信息。

FO(first order)一级压缩状态:
动作:传递完整的动态信头域信息。【即简单粗暴地砍掉静态部分,动态部分不压缩】

SO(second order)二级压缩状态:
最高级压缩状态。
动作:仅传递动态域压缩后的值。

解压方状态:

NC(no context)状态:
无文景状态。数据流刚开始传递时的状态。
动作:接收并保存压缩方在 IR 状态发的包含完整信头的分组,解压 IR 包。
对应压缩方状态:IR
跳转条件:成功解压一个IR包 -> FC状态。

SC(static context)静态文景状态:

解压方获得了足够的静态域信息,希望接收包含完整动态信头的压缩分组。
动作:接收并保存压缩方在 FO 状态发的包含完整动态信头的分组,解压 FO 包
对应压缩方状态:FO

跳转条件:
成功解压一个FO包 -> FC状态。
连续 k2 个包解压失败 -> NC状态

FC(full context)全文景状态:
获得了足够的静态域信息和动态域的变化规律信息。
动作:解压 SO 包。
对应压缩方状态: SO
跳转条件:连续 k1 个包解压失败 -> SC状态。

压缩方的基本状态图如下:

解压方的状态图如下:


ROHC协议有好几种模式,分别适用于
无反馈信道(U-mode)
弱反馈信道(O-mode)
强反馈信道(R-mode)

单向(uni-directional)U 模式:
当不存在或不能使用反馈信道时,ROHC 工作在 U 模式,此时解压方不能向压缩方发送反馈信息。 为保证压缩健壮性和压缩率, 压缩方采用乐观逼近原则和周期性原则进行状态转移。

乐观逼近原则:在 IR 状态或 FO 状态时,压缩方向解压方连续发送 n 个分组时就认为解压方建立了正确的解压文景,于是向高级 FO、SO 状态转移。

周期性原则:压缩方在 FO、SO 状态一定时间 timeout 后,就转移到低级压缩状态。

双向乐观(bi-directional optimistic)O 模式:
当无线链路存在可以利用的反馈信道时,ROHC 工作在 O 模式,压缩方向高级状态转移采用乐观逼近原则或者正反馈原则, 向低级状态转移采用负反馈原则。

正反馈原则:当无线链路允许发送反馈分组的时候,解压 方一旦正确解压具有更新文景特性的分组时, 就向压缩方发送正反馈分组,允许压缩方向高级压缩状态转移。

负反馈原则:当无线链路允许发送反馈分组的时候,解压方连续错误地解压 ROHC 分组时, 就要向压缩方发送负反馈分组,促使压缩方向低级状态转移,并发送带有完整信息的分组,以便解压方接收到这些分组后更新解压文景信息,保持压缩和解压文景同步。

双向可靠(bi-directional reliable)R 模式:
当无线链路质量比较好的时候, 状态转移完全采用反馈原则。 压缩方向高级状态转移采用正反馈原则,向低级状态转移采用负反馈原则。

压缩算法

我们可以发现,ROHC协议并没有规定了压缩的算法,它只在行为级模型上规定了状态的跳转,对于不同的压缩算法,ROHC的压缩效率大有不同,所以压缩算法选取是ROHC协议使用的核心。
目前主流的压缩算法有以下两种:

LSB最低有效位压缩编码算法:
LSB 压缩算法是对连续分组中值变化不大的域进行压缩编码,压缩方只传输域值的 k个最低有效位 LSBs,而不是原始域值,LSBs 是要压缩的值 v 与已正确传递到解压方而作为参考值 v_ref 的二进制编码差异的最低有效位,k 是 LSBs 的比特位数。 解压方接收到 LSBs 后,用其取代先前正确接收而作为解压参考值的 v_ref 的 k 个最低有效位,获得原始值。

其实就是指传有变化的部分。核心思想和云天明的只送大脑是一样的
虽然看着简单,但是效率却出奇的高,是最重要的压缩算法之一。

- W-LSB 基于窗口最低有效位压缩编码算法
原理跟上面的LSB基本相同,只是W-LSB做的更彻底,通过调节窗口的大小,只传跟上一次不同的几位,达到更高的效率。

文章转载自:Joyce的博客