基于分层模型的流媒体隐蔽通信方法
技术领域
属于流媒体的信息隐藏领域。
背景技术
信息隐藏是信息安全领域中的新兴技术,它与加密技术相区别,正引起越来越多的研究者的关注。信息隐藏技术在国际上已有公认的定义如下:待隐藏的机密信息称为嵌入对象,用于隐藏嵌入对象的公开信息称为掩护对象,通常也称载体。通过特定的嵌入算法,将嵌入对象隐藏到掩护对象中,从而生成隐藏对象,这一过程称为嵌入过程。相反地,使用特定的提取算法从隐藏对象中提取出嵌入对象的过程则称为提取过程。嵌入过程和提取过程的执行者分别被称为嵌入者和提取者。嵌入过程和提取过程采用相同的密钥,这样的信息隐藏技术称为对称信息隐藏技术。
现有的信息隐藏技术和方法基本都集中在图像领域,基于音频的信息隐藏方法并不多,其中最为成熟的也是应用最为广泛的方法就是替换方法。基本的替换方法,就是试图用秘密信息比特替换掉伪装载体中不重要的部分,以达到对秘密信息进行编码,如果接收者知道秘密信息嵌入的位置,就能提取出秘密信息。
最低有效位替换算法,LSB(Least Significant Bit)替换方法就是在为了实现这个目的所采用的一种隐藏方法。计算机的数据文件都用二进制来表示,以图像文件为例,假设每一个象素用8位比特表示,最低位的比特的改变对象素值的影响是所有比特位中最小的,简单LSB替换法就是基于这种思想,将最低位替换成待隐藏的消息,在不引起注意的情况下达到隐藏秘密消息的目的。
目前基于音频的最低有效位替换方法的信息隐藏方法并不多见。美国某民间组织曾在一个信息隐藏会议上介绍过一种隐藏方法,他们将一段大小为8kB的音频压缩编码文件作为待隐藏的机密信息,将一段大小为64kB的音频压缩编码文件作为载体。将8kB的机密信息用最低有效位替换算法嵌入到64kB的载体文件中;成功嵌入之后,再用与嵌入过程完全相反的提取过程把8kB的音频文件完整的提取出来。此种隐藏方法成功的将最低有效位替换算法应用到基于压缩语音编码的信息隐藏领域,但是,这种方法类似基于图像的隐藏方法,缺乏实时性,另外这种隐藏方法对隐藏载体要求很苛刻,只能是某种特定的压缩语音编码,这就大大降低了此种方法的实用性。
如果将基于图像等文件实现信息隐藏称为静态隐藏,那么基于流媒体的信息隐藏技术就可以称为动态隐藏。流媒体是指采用流式传输的方式在Internet播放的媒体格式。流媒体又叫流式媒体,它是指商家把视频节目当成数据包发出,传送到网络上。近来,随着互联网飞速发展,流媒体技术被越来越广泛的应用到网络上,网络流媒体应用日益普及,采用流媒体作为信息隐藏载体有着不可比拟的优点。
流媒体信息隐藏已有不少研究成果被报道。这些成果提出了相应的隐藏算法和初步的传输方案,但传输方案与具体的载体相关,不便于基于各种载体的隐蔽通信系统间的互操作;而且缺少对数据传输完整性的保证,对隐蔽通信系统实际支持的应用也未作考虑。
发明内容
本发明针上述问题,提出一种分层的流媒体隐蔽传输系统模型,保证了数据传输的可靠性,且适应隐藏算法,隐蔽应用,网络环境等的多样性。该系统模型对流媒体隐蔽通信系统的设计开发具有指导意义。
所述方法是在两台用网络设备连接的电脑终端上依次按以下步骤实现的:
步骤(1),初始化
在源电脑终端上,设立:音频输入模块,机密信息嵌入模块,流媒体传输模块,以及流媒体传输初始化模块,
在目的电脑终端上,设立音频输出模块,机密信息提取模块,流媒体传输模块,以及流媒体传输初始化模块,
所述两个流媒体传输初始化模块,各设有流媒体传输的目的终端的网络地址输入窗口以及流媒体的文件格式输入窗口,以及为所述两台电脑终端进行流媒体传输所用的会话初始化协议,相应的,向流媒体传输模块输出所述目的终端的网络地址和流媒体的文件格式,
所述音频输入模块,用音频采集设备采集原始的语音数据,依次经过编码、封装后形成待发送的语音编码数据包,再向机密信息嵌入模块输出,
所述音频输出模块,输入端与所述流媒体传输模块的输出端相连,把收到的被封装的语音编码数据包解码,转换到原始语音数据,再通过音频输出设备播放出来,
所述两个流媒体传输模块,各利用设定的网络传输协议来准确无误的完成封装好的语音编码数据包的传输工作,及时的从源电脑终端送达目的电脑终端,
所述机密信息嵌入模块,设有:待隐藏的机密信息输入端口,以及来自所述音频输入模块的语音编码数据包的输入端口,输出为送往源电脑终端的流媒体传输模块的已经嵌入机密信息的语音编码数据包,
所述机密信息提取模块,输入为来自目的电脑终端流媒体传输模块的已经嵌入机密信息的语音编码数据包,输出为机密信息,以及送往音频输出模块的语音编码数据包,
所述机密信息嵌入模块和机密信息提取模块组成一个隐藏通信模块,含有:隐蔽通信应用层SIA、隐蔽传输管理层STM和隐蔽通信适配和执行层SAE,其中:
隐蔽通信应用层SIA,输入端与所述音频输入模块的语音编码数据包的输出端相连,同时提供人机接口,输入用户待传输的机密信息,把该机密信息复制到隐蔽传输管理层STM的相应的发送缓冲区,同时,还在Windows平台上采用微软基本类程序库MFC提供的SIA层的数据结构处理输入数据,记录机密信息的长度及接收文件的总长度;
隐蔽传输管理层STM,其中定义了以下原语:
SEND,表示完成不定长度的机密数据的可靠发送,
RECEIVE,该原语完成机密数据的可靠接收,
CONNECT,该原语负责初始化STM对等端,为同步序列号,
DISCONNECT,该原语负责中断STM传输,
LISTEN,该原语的功能是监听来自对等端的请求,
同时,定义了以下数据结构,SIA层数据发送缓存、SIA层数据接收缓存,当前待发送帧缓存,当前接收帧缓存,当前连接状态,当前序列号,最后收到的确认号,最后收到的序列号,超时门限,
此外,又定义了以下STM层的8比特的帧格式,其中包括:
SYN,1比特,位于第0比特位,用于建立连接,声明起始序列号,
ACK,1比特,位于第1比特位,确认标志域,表示确认序列号有效,
FIN,1比特,位于第2比特位,结束标志域,用于结束一个连接,
LENGTH,5比特,位于第3-7比特位,表示除了头部以外的STM层帧携带的数据长度,
SEQ,3比特,位于第0-2比特位,为STM层帧序列号,
ANN,3比特,位于第3-5比特位,表示STM层帧携带的确认序列号,
TYPE,2比特,位于第6、第7比特位,为应用类型标志,根据应用类型向SIA层提交数据,其中,应用类型包括:即时消息和文件两种,针对两种不同应用类型,系统分别采用相应的处理函数,
DATA,0-31字节,为STM层帧携带的数据净荷;
所述一个STM帧构成了一个面向STM的隐蔽传输管理层数据单元STMDU,
在所述STM层还设立了下属各连接状态:
IDLE,表示系统处于连接空闲状态,等待连接到达,已被发送或接收,
SYN-SENT,表示已经发送SYN,等待接收SYN+ACK,“+”号表示“与”
SYN-CONF,表示已经接收SYN+ACK,准备发送ACK,
SYN-RECV,已经接收SYN,准备发送SYN+ACK,
SYN-REPL,表示已经发送SYN+ACK,等待接收ACK,
ESTAB,适时发送FIN,并准备接收FIN,
FIN-RECV,表示已经接收FIN,准备发送ACK或ACK+FIN,
WAIT,表示已经发送FIN,等待接收ACK或ACK+FIN,
CLOSING,表示已经接收ACK,等待接收FIN,
LAST-ACK,表示已经接收FIN,准备发送ACK,
PERSIST,表示已经发送ACK,准备发送FIN,
OVER,表示已经发送FIN,等待接收ACK,
所述STM层分别在发送过程和接收过程中为隐蔽通信应用层SIA和隐蔽通信适配和执行层SAE提供机密信息的可靠隐蔽传输服务,
隐蔽通信适配和执行层,设有下列数据结构:大小为一个STMDU的发送缓冲区,大小为一个STMDU加一个隐蔽通信适配和执行数据单元SAEDU的接收缓冲区,发送缓冲区读指针,接收缓冲区写指针,用以判断是否发送完一个STMDU的发送缓冲区剩余数据长度,实时传输协议RTP序列号缓存,接收标志和丢包标志,
隐蔽通信适配和执行层SAE,依次按以下步骤把上层STM派发的数据单元STMDU嵌入到流媒体载体中,以及提取流媒体载体中携带的STMDU,其步骤如下:
第1步:STMDU和标志位的提取和嵌入,所述标志位包括:同步位SYN,表明源方的初始序列号,确认序号有效位ACK,对方的序列号,结束位FIN,
第2步:根据设定的隐蔽通信的最大传输单元MTU把数据单元STMDU分散为隐蔽通信适配和执行层数据单元SAEDU,提取时依据数据到达的先后顺序形成完整的STMDU,
第3步,用实时传输协议的序列号实现STMDU的丢包检测,
第4步,标记一个流媒体分组中是否带有机密信息,
步骤(2),依次按以下步骤进行隐蔽通信:
步骤(2.1)源终端用户输入目的终端网络地址,向目的端用户发送流媒体传输请求,
步骤(2.2)目的端用户作出收到请求的应答,启动音频输入和音频输出模块,
步骤(2.3)源端用户在收到应答后启动音频输入和音频输出模块,
步骤(2.4)依次按以下步骤进行隐蔽通信发送:
步骤(2.4.1)源端用户在所述SIA层输入待传输的机密信息,在SIA层将机密信息发送到相应的发送缓冲区,并记录数据长度,
步骤(2.4.2)所述STM层依次按下述步骤进行传输:
第1步:在超时门限未超过预设的上限时,对发送缓存表中的所有帧,定时器加1,
第2步:在发送标志被重置时,执行下一步骤,
第3步:在有收到新帧时把超时门限重置为最低门限,或重新计时,
第4步:释放发送缓存表中等待时间最长的一个帧,一旦发送窗口被填满,则返回,
第5步:准备制作新帧,
隐蔽通信适配和执行层SAE,依次按下述步骤把上层隐蔽传输管理层STM待发的数据单元STMDU嵌入到流媒体载体中:
步骤(2.5)依次按以下步骤进行隐蔽通信接收:
步骤(2.5.1)SAE层依次提取并判断是否有隐藏信息标志,释放有后续分段标志,实时传输协议RTP序列号是否联系的标志以及是否发现丢包的标志,
步骤(2.5.2)记录当前RTP包的序号,
步骤(2.5.3)计算局部变量Key,
Key=Continue×1000+Enable×100+Perturb×10+Follow其中,Continue,表示RTP包是否连续,不连续为1,连续为0,Enable,表示是否有隐藏信息,有隐藏信息为0,无隐藏信息为1,Perturb,表示是否有丢包,丢包则为1,否则为0,Follow表示是否有后续分段,有后续分段就为1,无后续分段则为0,
步骤(2.5.4)判断Key的值:
若Key≥1000,表示RTP不连续,清空SAE的接收缓存,设置Perturb标志,返回,
若Key≥100或者Key=10,表示没有隐藏或者有丢包,重置Perturb标志,返回,
若Key<10,表示有隐藏信息,且有后续分段,提取当前RTP包中的隐蔽信息,保存到接收缓冲区,
若Key=0,表示有隐藏信息,无后续分段,则提取当前RTP包中的隐藏信息,设置接收标志,重置接收缓冲区指针,返回;
步骤(2.5.5)在STM层,按以下步骤处理:
步骤(2.5.5.1)检查接收标志,判断SAE层是否收到完整新帧,
步骤(2.5.5.2)在SAE层收到完整新帧后,把SAE层的接收缓存复制到STM层的接收缓冲区,清空SAE层的接收缓存,重置接收标志,
步骤(2.5.5.3)根据当前连接状态,调用不同的处理函数,对所收到的帧进行处理;
步骤(2.5.6)有新的STMDU到达时,SIA层取走机密信息。
本发明有以下优点:
1.该隐蔽系统具有适应性。与现有的流媒体信息信息隐藏方法相比,此种分层方法能屏蔽由载体不同对隐藏方法和传输方法的限制。
2.隐蔽通信的应用的设计与通信系统是分开的,同时与隐藏算法也是分开的,通信系统对隐蔽应用提供统一的可靠传输服务。
附图说明
图1.系统运行示意图。
图2.系统模块图。
图3.隐藏模块分层示意图。
图4.STM层连接状态转移图。
图5.系统运行示意图。
具体实施方式
硬件环境:
两台用网络设备链接好的电脑终端,电脑终端上均具有音频采集设备(如麦克风)和音频输出设备(如耳机)。
系统的模块划分:
流媒体传输初始化模块、音频输入模块、音频输出模块、隐蔽通信嵌入模块、隐蔽通信提取模块、流媒体传输模块。系统模块示意图见附图2。
1.流媒体传输初始化模块
该模块的主要功能是,为两台电脑终端进行流媒体传输建立传输通道,例如用会话初始化协议(Session Initiation Protocol SIP)来完成会话建立即流媒体传输的初始化工作。该模块的初始化工作包括流媒体传输的目的终端的网络地址,流媒体的文件格式。
2.音频输入模块
该模块的主要功能是在流媒体传输初始化完成后,通过电脑终端的音频采集设备(如话筒)采集语音数据,并将原始的语音数据通过特定的编码方式转换成语音编码,并把这些编码之后得到的文件封装成待发送的数据包。该模块的初始化工作是在流媒体传输初始化完成之后才开始进行,包括检查音频采集设备是否运转正常,音频数据接收端口以及发送端口是否被占用。该模块的输入是由音频采集设备采集到的原始的没有经过任何编码处理的语音数据,输出是经过封装的语音编码数据包。
3.音频输出模块:
该模块的功能是在电脑终端接收到流媒体文件后,将这些被封装的语音编码数据包通过特定的解码方式转换成原始的语音数据,并把这些语音数据通过音频输出设备(如耳机)播放出来。该模块的初始化工作是在流媒体传输初始化完成之后才开始进行,检查音频输出设备是否正常。该模块的输入是经过封装的语音编码数据包,输出是原始的语音数据。
4.机密信息嵌入模块:
该模块的功能是将机密信息嵌入到已经封装好的语音编码数据包中。初始化工作包括,各缓冲区清零,确定待嵌入的机密信息和隐藏载体。该模块的输入为待隐藏的机密信息和作为隐藏载体的已经封装好的语音编码数据;输出为已经嵌入机密信息的语音编码数据包即隐藏对象。
5.机密信息提取模块:
该模块的功能是将机密信息从封装好的语音编码数据包中提取出机密信息。初始化工作包括,清空整个缓冲区。该模块的输入为已经嵌入机密信息的语音编码数据包即隐藏对象;输出为机密信息和语音编码数据包。
6.流媒体传输模块:
该模块的功能是,利用现有的网络传输协议来完成流媒体文件即封装好的语音数据包的传输工作,并能保证所有数据能准确无误的、及时的从源电脑终端到达目的电脑终端。该模块的初始化工作包括,检查流媒体传输信道是否已经成功建立,待传输的数据包是否准备完毕。由于该模块的功能是将数据从一个电脑终端传输到另一个电脑终端,所以该模块的输入和输出都是封装好的语音编码数据包。
隐蔽通信模块分层模型
机密信息的提取实际上是机密信息嵌入过程的逆过程,两个模块的工作原理基本一样,只是对数据的处理顺序是相反的,因此机密信息的嵌入和提取两个模块也可以合成一个模块即隐蔽通信模块。
隐蔽通信分层模型的核心思想是层次分工。隐藏算法、隐蔽应用都是多样的,这就要求隐蔽通信系统具有适应性首先通信系统的设计应当与隐藏算法分开,使得隐藏算法只需要针对无差别的语音编码数据,而不必关心这些编码的具体意义。其次隐蔽应用的设计应当与通信系统分开,同时也与隐藏算法分开,通信系统对隐蔽应用提供统一的可靠传输服务。经上述分析可见,隐蔽通信系统应当分成至少3个层次,最上层是隐蔽应用,它的作用对象是机密信息;最下层是隐藏算法,它的作用对象是一般化的码流;而在这两层之间必定要有一层,对上提供可靠的传输服务,对下组织一般化的码流,同时通过一定的机制保证信息传递的同步以及克服传输中的差错。
流媒体隐蔽通信由3个独立的逻辑层次构成,将隐蔽通信模型划分为3个独立的逻辑层次,即隐蔽通信适配和执行层(SAE,Steganographic Adaptation & Execution layer),隐蔽传输管理层(STM,Steganographic Transmission Management layer)和隐蔽信息应用层(SIA,Steganographic information application layer)。隐蔽通信分层示意图见附图3。
1.隐蔽通信适配和执行层(SAE)
这一层负责将上层STM派发的数据单元STMDU嵌入到流媒体载体中,以及提取流媒体载体中携带的STMDU。因为流媒体载体不同,使用隐藏算法不同,其隐藏容量也就不同。SAE层需要屏蔽这些差异,对上层提供一致信息隐藏接口,实现透明的STMDU传输服务。SAE层内部定义的操作包括以下内容。第一,STMDU和标志位的嵌入和提取,这是自然的。第二,根据隐藏算法支持的最大传输单元(MTU)将STMDU分段为SAEDU,以及将收到的SAEDU重 组,形成完整的STMDU,完成“适配”操作,需要维护是否还有后续分组的标记。第三,借助流媒体通信提供的相关信息(例如RTP的序列号),实现SAEDU的丢包检验。一个SAEDU的丢失意味着整个STMDU不能正确接收,已经接收的不完整的STMDU也被丢弃,等待对方重传。第四,标记或识别一个流媒体分组中是否携带有机密信息。
综上所述,SAE对STM提供的服务是实现STMDU的透明发送和接收,通过下面2个接口原语来实现。(1)Embed;该原语将STMDU嵌入到相应流媒体载体中。(2)Extract;该原语将接收到SAEDU重组,向STM提交STMDU。SAE层数据结构及说明见表1。
2.隐蔽传输管理层(STM)
STM定义的功能是提供机密信息的可靠隐蔽传输服务,包括同步控制、差错检测和流量控制。第一,同步控制和差错检测采用序号确认机制实现,类似于TCP协议中的同步和重传。所不同的是在隐蔽通信模型中采用面向STMDU而非面向字节的序号。STMDU中不可避免要携带分组长度。SAE出于隐藏容量的限制并没有提供数据的长度,机密信息提取算法只能提取所有可能的隐蔽数据,但并不清楚这些数据是否都是机密数据。当STMDU中携带了长度,一个STMDU的确认就等价于这个长度的数据也被确认。第二,隐蔽通信系统需要维护一个有限状态机。需要说明,状态设置要考虑到流媒体发送接收可能是异步的,而不由STM决定,在每一个状态中响应行为要么发送,要么接收,而不能兼有。状态的维护需要若干标志位,例如同步位SYN,确认序号有效位ACK,结束位FIN。设置SYN的意义在于声明本方的初始序列号,ACK位的意义在于确认对方的序列号。这一位通常只在第一帧中不被设置,因为此时还没有确认对方的初始序列号。第三,STM包含应用类型的标志域,使得不同的隐蔽应用可以同时通过一条隐蔽信道传输,可以对应用类型定义优先级以保证紧急任务先被执行。第四,流量控制采用滑动窗口机制实现。考虑到流媒体本身就是周期性的,而且存在网络延时,因此从一个分组的发送到被确认之间的时间不可忽略。滑动窗口协议可以提高信道的利用率,具体的窗口长度和协议需要根据流媒体应用、隐藏容量、网络环境等因素综合考虑。
可见,STM提供可靠的机密信息隐蔽传输服务。因此,我们在STM定义了如下原语。(1)SEND;该原语完成不定长度的机密数据的可靠发送。(2)RECEIVE;该原语完成机密数据的可靠接收。(3)CONNECT;该原语负责初始化STM对等端,同步序列号。(4)DISCONNECT;该原语负责中断STM传输。(5)LISTEN;该原语的功能是监听来自对等端的请求。STM层的数据结构及介绍见表2。
同步控制和差错检测是采用序号确认机制来实现。这种机制类似于TCP协议中的同步和重传。不过,所不同的是TCP通过面向字节的序列号保证可靠提交,但在隐蔽通信模型中,一个面向STMDU的序号机制可能会更好。第一,STMDU中不可避免要携带分组长度。SAE层出于隐藏容量的限制并没有提供数据的长度,隐藏算法只能提取所有可能的隐藏数据, 即一个MTU的数据,但并不清楚这些数据是否都是机密数据。当STMDU中携带了长度,一个STMDU的确认就等价于这个长度的数据也被确认。第二,一个长度域和一个面向分组的序号域相加大致相当于一个面向字节的序号域,与两个面向字节的序号域相比,采用两个面向分组的序号和一个长度,可以相当于节省一个长度域。
STM层的流量控制采用滑动窗口机制实现。考虑到流媒体本身就是周期性的,而且存在网络延时,因此从一个分组的发送到被确认之间的时间不可忽略。滑动窗口协议可以提高信道的利用率,具体的窗口长度和协议需要根据流媒体应用、隐藏容量、网络环境等因素综合考虑。
STM层的帧格式见表3,其中各个域的涵义见表4。
STM层的连接状态定义见表5。连接状态转移示意图见附图4。
3.信息隐藏应用层(SIA)
SIA完成人机接口,适应多种交互模式,例如即时消息和存储文件。SIA向STM屏蔽应用类型的差异,提供统一的机密信息数据净荷。在SIA上看传输带宽受隐藏容量和实际网络环境的限制,STM可能阻塞SIA的发送。在接收方STM向SIA提交数据净荷,SIA根据接收到的应用类型,采用相应交互方式和用户接口来进行隐蔽通信。SIA层的数据结构和操作系统相关,我们在Windows平台上采用了MFC提供的控件,见表6。在此我们对部分非核心的控件略去不提。
隐蔽通信的整个步骤如下:
步骤1:用户1输入目的地网络地址,系统往用户2终端发送流媒体传输请求;
步骤2:用户2在收到请求之后作出应答,同意进行流媒体文件传输,同时启动语音采集和音频输出模块;
步骤3:用户1在收到应答之后启动音频输入和音频输出模块;
步骤4:用户1和用户2开始进行流媒体传输;
下面开始是隐蔽通信发送段的步骤:
SIA层
步骤5.1:用户1在SIA层提供的人机接口输入待传输的机密信息,机密信息被复制到STM层的相应的发送缓冲区,并记录数据长度;
STM层
步骤5.2.1:检查超时门限是否已经超过预设的上限,如果没有超过则继续,
如果超过超时门限上限,则重传,
步骤5.2.2;如果超过了则返回错误,通知应用程序;
步骤5.2.2:对发送缓存表中所有的帧,定时器加1;
步骤5.2.3:检查发送标志,如果没有被重置,说明SIA层还在继续发送,STM层不能 继续操作,就此返回。如果被重置,说明SIA层空闲,此时可以继续下一个步骤;
步骤5.2.4:如果有新收到的帧,则将超时门限重置为最低门限,或重新计算超时门限。判断方法是检查最后收到的确认号前一个序号的帧是否还在缓存;
步骤5.2.5:释放已经被确认的缓存帧;
步骤5.2.6:首先在发送缓存表中查找一个等待时间最长的帧,然后比较这一帧的等待时间是否超过了超时门限上限,如果超时则重传这一帧;
步骤5.2.7:如果发送窗口已经被填满,那么不能继续发送新帧,就此返回;
步骤5.2.8:准备制作新的一帧,根据当前连接状态,调用不同的处理函数,决定是否有新帧要发送以及新帧的内容。
SAE层
步骤5.3.1:如果当前发送帧缓冲区长度为0,且STM层设置了发送标志,则复制STM层的当前帧到SAE层的发送帧缓冲区,记录帧的总长度,重置发送标志;
步骤5.3.2:如果经过步骤1后,当前发送帧缓冲区长度不为0,则执行步骤3,否则转到步骤5.3.4;
步骤5.3.3:根据隐藏容量和剩余待发送数据的长度取适当的长度执行嵌入,并嵌入隐蔽信息标志,如果此时待发送数据长度不为0,则嵌入有后续分段标志,否则嵌入无后续分段标志,返回;
步骤5.3.4:嵌入不含有隐蔽信息标志;
下面是隐蔽通信接收端的步骤
SAE层
步骤6.1.1:提取是否有隐蔽信息标志到局部变量Enable,无隐蔽信息时为1,有隐蔽信息时为0;提取是否有后续分段标志到局部变量Follow,有后续分段时为1,无后续分段时为0;检查RTP序列号是否连续,记录到局部变量Continue,不连续为1,连续为0。此外还有SAE层的成员变量Perturb,之前有丢包时为1,没有发生丢包为0;
步骤6.1.2:记录当前RTP包的序号。计算局部变量
Key=Continue×1000+Enable×100+Perturb×10+Follow
步骤6.1.3:如果Key≥1000,清空SAE的接收缓存,设置Perturb标志,返回;
步骤6.1.4:如果Key≥100或者Key=10,重置Perturb标志,返回;
步骤6.1.5:如果Key<10,提取当前RTP包中的隐蔽信息,保存到接收缓冲区;步骤6.1.6:如果Key=0,设置接收标志,重置接收缓冲区指针,返回;
STM层
步骤6.2.1:检查接收标志,如果没有被设置说明SAE层还未收到完整新帧,就此返回;
步骤6.2.2:将SAE层的接收缓存复制到STM层的接收缓冲区,清空SAE层的缓存,重 置接收标志;
步骤6.2.3:根据当前连接状态调用不同的处理函数,对新收到的帧做处理;
SIA层
步骤6.3:当有新的STMDU到达,都会通知应用层试图取走数据。应用层会在接收缓冲区中查找到字符串结束符,找到结束符后便取走数据清空缓冲区。
运行实例:
用户1终端的网络地址设为192.168.1.2,用户2终端的网络地址设为192.168.1.3,语音压缩编码方式选择为G.711u。
用户1在系统界面上输入目的终端用户2的网络地址,向用户2发送流媒体传输请求。用户2在收到来自用户1的流媒体传输请求之后,用户2同意流媒体传输,并向用户1发送一个同意的请求。用户1收到来自用户2同意流媒体传输的消息后,给用户2回复一个确认消息,同时,用户1终端的麦克风开始采集语音,并把这些采集到的语音数据压缩成G.711编码文件,编码文件被封装成RTP数据包,通过网络发送给目的终端用户2。用户2在收到来自用户1的确认消息后也开始在采集语音,将语音数据压缩编码,封装成RTP数据包,把数据包发往目的终端用户1。
用户1和用户2之间的流媒体传输开始之后,用户1就可以与用户2进行隐蔽通信了。用户1在系统界面上输入要传输的机密信息,输入框中的字符串被复制到STM层的相应的发送缓冲区,并记录数据长度。STM层从发送缓冲区取出数据,在此数据编码之前添加一些特定的比特位,组成机密信息数据帧,并将此数据帧送往SAE层。在SAE层从上层送来的数据帧被嵌入到封装好的RTP包中。G711u编码下的LSB嵌入方法比较固定,这种编码方式的最低有效位是没个语音帧的最后一个比特位,在SAE层每个封装好的RTP包中的语音帧中的最后一个比特数据将被替换在STM层形成的成机密信息数据帧的其中一个比特数据。
用户2终端在收到RTP数据包之后,对各个STM数据帧各标志位逐个查看,再查看RTP序列号是否连续,通过计算公式计算出数据,在根据数据判断该RTP包是否含有机密信息。如果含有机密信息,则将该数据包放入相应的缓冲区,等待STM层对其进行处理。STM层对含有机密信息的数据包进行逐层解包,去掉系统添加的各个标志位,将机密信息提取出来并重组成完整的机密信息。最后由SIA层将机密信息呈现给用户2。
系统运行示意图见附图5。
表1 SAE层的数据结构
数据结构 |
说明 |
发送缓冲区 |
大小为一个STMDU |
接收缓冲区 |
大小为一个STMDU加一个SAEDU,以防止溢出 |
发送缓冲区的读指针 |
在读数据时被引用,填充新帧时被重置 |
接收缓冲区的写指针 |
在缓存数据时被引用,一帧接收完成时被重置 |
发送缓冲区剩余数据长度 |
用以判断是否发送完一个STMDU |
RTP序列号缓存 |
用于检测新收到的RTP包序列号是否连续,即有无丢包 |
接收标志 |
当收到新的完整的STMDU时设置标志,STM接收后重置 |
丢包标志 |
当检测到丢包时被设置,直到一帧结束被重置 |
表2 STM层的通用数据结构
数据结构 |
说明 |
SIA层数据发送缓存 |
缓存SIA层请求的数据净荷,附带读指针和剩余数据长度 |
SIA层数据接收缓存 |
缓存接收到的STA层数据净荷,附带写指针和累计数据长度 |
当前待发送帧缓存 |
制作新帧的场所,附带帧长度,最大长度可根据协议设定,也可预 先设定为某个值 |
当前接收帧缓存 |
用以解析帧结构和数据,长度在解析后才可获得 |
当前连接状态 |
枚举类型变量,用以记录当前连接状态 |
当前序列号 |
用以记录当前发送帧的序列号 |
最后收到的确认号 |
依据此确认号释放本方发送缓存 |
最后收到的序列号 |
依此序列号确定本方确认序列号 |
超时门限 |
当计时器超过超时门限时发生重传,超时门限递增。当超时门限超 过了某个预设的上限时认为网络环境过于糟糕无法再继续传输,即 发生全局错误 |
发送标志 |
用来表示有新的STMDU等待发送,SAE层取走后重置,在重置前STM 层处于等待状态 |
请求确认标志 |
本地的接收线程请求发送线程送出一个ACK,发送线程在发出确认帧 或捎带确认后重置这一标志 |
表3 STM层的帧格式
表4 STM层帧格式的各个域的涵义
域的名称 |
比特数 |
涵义 |
SYN |
1 |
同步标志域,用于建立连接,声明起始序列号 |
ACK |
1 |
确认标志域,表示确认序列号有效 |
FIN |
1 |
结束标志域,用于结束一个连接 |
TYPE |
2 |
应用类型标志,根据应用类型向SIA层提交数据 |
LENGTH |
5 |
STM层帧携带的数据长度,不包括头部 |
SEQ |
3 |
STM层帧的序列号 |
ANN |
3 |
STM层帧携带的确认序列号 |
DATA |
0~31字节 |
STM层帧携带的数据净荷 |
表5 STM层上的连接状态
连接状态 |
涵义 |
接收或发送 |
IDLE |
系统处于连接空闲状态,等待连接到达 |
两者 |
SYN-SENT |
已经发送SYN,等待接收SYN+ACK |
接收 |
SYN-CONF |
已经接收SYN+ACK,准备发送ACK |
发送 |
SYN-RECV |
已经接收SYN,准备发送SYN+ACK |
发送 |
SYN-REPL |
已经发送SYN+ACK,等待接收ACK |
接收 |
ESTAB |
在适当的时候发送FIN,并准备接收FIN |
两者 |
FIN-RECV |
已经接收FIN,准备发送ACK或ACK+FIN |
发送 |
WAIT |
已经发送FIN,等待接收ACK或ACK+FIN |
接收 |
CLOSING |
已经接收ACK,等待接收FIN |
接收 |
LAST-ACK |
已经接收FIN,准备发送ACK |
发送 |
PERSIST |
已经发送ACK,准备发送FIN |
发送 |
OVER |
已经发送FIN,等待接收ACK |
接收 |
表6 SIA层的数据结构
数据结构 |
说明 |
即时消息编辑窗口 |
使用CEdit控件,用户在此编辑即时消息 |
即时消息显示窗口 |
使用CRichEdit控件,通信双方发送的即时消息和系统提示信 息都会显示在这个窗口 |
发送文件的路径 |
保存将要发送的文件路径,由“打开文件”的通用对话框得到 |
接收文件的文件名 |
保存此文件名以缓存文件,并显示在“保存文件”的通用 对话框中 |
发送文件对象 |
CFile对象,用以操作发送文件 |
接收文件对象 |
CFile对象,用以操作接收缓存文件 |
接收文件的总长度 |
用以判断文件是否接收完成,并用来计算接收进度 |
当前接收的文件长度 |
累加量,记录当前已经接收的文件长度 |
发送文件步骤标记 |
表示现在已经进行到发送文件过程的第几个步骤 |
接收文件步骤标记 |
表示现在已经进行到接收文件过程的第几个步骤 |