本发明属于通信技术领域,尤其涉及一种基于网络编码的传输层控制方法,可用于提升受干扰情况下无线通信设备的数据传输性能。
技术背景
无线通信作为当今通信发展的重要领域之一,已经成为通信的主要方式。使用合适的方法去提高无线通信的数据传输效率,提高无线通信在受到公用开放频段的干扰时数据传输的各项性能。常见的开放频段的干扰来源有隐藏终端,采用了异构技术或者非网络的无线设备等。目前,传输层控制TCP方法在无线通信中的应用十分广泛。这是一种面向连接的、可靠的、基于字节流的通信方法,利用传输层控制TCP方法进行数据传输时,通过对分组进行序号标识来保证不发生接收端丢失分组的情况,同时序号也保证了发送到接收端的分组按序接收。接收端需要对已成功收到的分组发回一个相应的确认ACK;如果发送端在合理的往返时间RTT内未收到确认ACK,那么对应的数据包就被假设为已丢失,将会被进行重新发送。同时,传输层控制TCP方法用一个校验和函数来检验数据是否有错误。
但是,在两个无线设备间使用传输层控制TCP方法进行数据传输时,会不可避免的受到公用开放频段的干扰,数据传输性能会受到很大的影响,比如吞吐量减小,网络时延增加。
技术实现要素:
本发明的目的是提出一种基于网络编码的传输层控制方法,以解决无线通信设备在存在干扰的公用开放频段下,数据传输性能受到严重影响的问题,减少数据分组的丢失,提高吞吐量和减小网络时延。
为实现上述目的,本发明的技术方案包括如下:
一种基于网络编码的传输层控制方法,发送端将要传输的数据流进行分组分块,每个块包含若干个分组,所述分组数为带宽乘以网络时延的值,再对分组进行编码后发送,接收端接收到分组后,对每个块初始化一个编码系数矩阵和一个相应的载荷矩阵,并且用分组中的参数进行矩阵的填充;发送对应分组的ACK,当发送端接收到ACK后,获取其中的反馈信息,以此来调度分组的发送和网络参数的更新,若编码系数矩阵和载荷矩阵都满秩,并且块的自由度足够时,对块解码并将数据传输给应用。
进一步根据所述基于网络编码的传输层控制方法,包括以下步骤:
步骤一:参数的初始化,包括当前往返时间、最小往返时间及丢失分组数;
步骤二:发送端进行数据分组、分块与编码;
步骤三:发送端发送分组并接收由接收端发送的确认信息;
步骤四:若块号blkno不在区间interval_2的范围内,或者(1-p)×onfly[currblk]<blksize不成立,则发送端更新网络参数;
步骤五:接收端接收分组并生成编码系数和载荷矩阵;
步骤六:接收端更新参数,对数据块进行解码,并对发送端的反馈,完成数据传输。
进一步根据所述基于网络编码的传输层控制方法,步骤一中参数的初始化,包括当前往返时间、最小往返时间及丢失分组数;
接收端与发送端同时初始化参数,当前往返时间RTT、最小往返时间RTTmin及丢失的分组数losses都初始化为0,要被发送的下一个分组的序列号seqno_nxt初始化为1,所述往返时间为分组由发送端发出,接收端收到分组后再发送确认信息ACK,并被发送端接收到的时间。
进一步根据所述基于网络编码的传输层控制方法,步骤二中发送端进行数据分组、分块与编码;
发送端先将要发送的数据流或文件分块,每个块包含blksize个分组,blksize大小为带宽乘以网络时延的值,每个分组为固定字节长度,所述blksize初始化为当前带宽与网络时延之积;若数据流或文件的其余部分不足以成为一个完整的分组,则用零填充,确保所有分组的长度相同;所述块不必是完全被分组填满,同时块任一i应该是在块i+1之前被填充;
分组与分块完成后,对分组进行编码,编码系数占用一个字节,一个编码分组的产生依赖于该块中的随机编码的所有分组,用于发生错误时的校验;
所述发送端在每个要发送的分组中包括:块号、编码系数、序列号seqno、载荷,所述编码系数由一个伪随机数的种子产生器生成,所述载荷为编码或非编码。
进一步根据所述基于网络编码的传输层控制方法,步骤三中发送端发送分组并接收由接收端发送的确认信息,发送端完成编码后,将数据分组发送到接收端,再由接收端发送确认信息ACK给发送端;
所述接收端对于接收的数据包,发送确认信息ACK,所述ACK中包括:可以解码的块的自由度ack_currdof、接收端已经确认的当前块中的块号ack_currblk、已经得到确认的分组序列号ack_seqno,所述可以解码的块的自由度ack_currdof即块中已收到的编码分组数;
若当前时间与最近分组的发送时间time_lastack的差值超过了重发超时时间RTO,则将令牌数tokens重置为最近分组发送前的值,令牌数为发送端含有的令牌个数,一个令牌允许CTCP发送端发送一个数据分组,令牌数以步长1递减一次,同时启动慢启动模式,所述慢启动模式即以步长1递增令牌数tokens;
若当前时间与最近分组的发送时间time_lastack的差值未超过重发超时时间RTO,且发送节点收到接收端发送的确认信息ACK,判断是否处于慢启动过程:若已经处于慢启动模式,慢启动模式即以步长1递增令牌数tokens,则将令牌数以步长1递增一次,令牌数为发送端含有的令牌个数,一个令牌允许CTCP发送端发送一个数据分组,同时若当前的令牌数大于慢启动阈值,即发送端允许处于慢启动模式时的最大令牌数,则切换到拥塞避免模式,即通过将tokens的值每次减小一半的速度,来达到控制链路流量的目的;所述CTCP为Coded TCP,即编码TCP;
若没有处于慢启动模式,则判断从接受端反馈的ACK信息的序列号是否大于最新的未确认分组的序列号,若是,则可以由得到最新的令牌数tokens的值,若不是,则可以由得到最新的令牌数tokens的值;
若当前时间与最近分组的发送时间time_lastack的差值未超过重发超时时间RTO,但发送节点没有收到接收端发送的确认信息ACK,发送端可以得到最新的令牌数tokens,利用最新的令牌数tokens做块的调度,以更好的发送要传输的分组;
发送端先初始化一个名为onfly的全零数组,发送端定义一个区间interval_1,将最新的未确认分组的序列号作为该区间的上界,将要被发送的下一个分组的序列号减1后的值作为该区间的下界,若序列号seqno在区间interval_1范围内,且当前时间小于有序列号的分组被发送时的时间戳与1.5倍的当前往返时间RTT之和,则将数组下标为B(seqno)值的元素以步长1递增一次;
若序列号seqno不在区间interval_1范围内,发送端定义一个区间interval_2,将当前发送端最小的未确认的块号currblk作为该区间的上界,将当前发送端最小的未确认的块号currblk和发送端要发送的块的数目numblks减去1后的值的和作为该区间的下界,若块号blkno在区间interval_2的范围内,且块号blkno与当前发送端最小的未确认的块号currblk相等,并且满足(1-p)×onfly[currblk]<blksize-currdof的关系,p为短期平均丢包率,则发送一个带有序列号的分组,然后将从块号为blkno中获取的要被发送的下一个分组的序列号seqno_nxt以步长1递增一次;
若块号blkno与当前发送端最小的未确认的块号currblk不相等,判断(1-p)×onfly[currblk]<blksize是否成立,若成立,则发送一个带有序列号的分组,然后将从块号为blkno中获取的要被发送的下一个分组的序列号seqno_nxt以步长1递增一次。
进一步根据所述基于网络编码的传输层控制方法,步骤四中若块号blkno不在区间interval_2的范围内,或(1-p)×onfly[currblk]<blksize不成立,则发送端更新网络参数;
收到ACK信息后,发送端先将收到的最新ACK的时间戳time_lastack的值更新为当前时间,再将当前往返时间RTT的值更新为发送端先将收到的最新ACK的时间戳time_lastack的大小减去有序列号的分组被发送时的时间戳T(seqno)的差值,然后才可以将RTTmin的值更新为RTT和旧的RTTmin两者当中的最小值;
若接收端已经确认的当前块中的块号ack_currblk大于当前发送端最小的未确认的块号currblk,则将发送端最小的未确认的块号currblk的值更新为接收端已经确认的当前块中的块号ack_currblk的值,同时将当前接收端已知的可以被解码的块的自由度currdof的值更新最近被确认的可以解码的块的自由度ack_currdof;
若接收端已经确认的当前块中的块号ack_currblk不大于当前发送端最小的未确认的块号currblk,将当前接收端已知的可以被解码的块的自由度currdof的值更新为可以解码的块的自由度ack_currdof和自由度currdof中的最大值;
若已确认的分组序列号ack_seqno的值大于最新的未确认分组的序列号seqno_una的值,则由seqno_una=ack_seqno+1可得到seqno_una的最新值,由losses=ack_seqno-seqno_una+1得到losses的最新值,由p=p×(1-μ)losses+1+(1-(1-μ)losses)得到短期平均丢包率p的最新值,所述μ为平滑因子,μ∈(0,1);
若已确认的分组序列号ack_seqno的值不是大于最新的未确认分组的序列号seqno_una的值,则可以由seqno_una=ack_seqno+1得到最新的未确认分组的序列号seqno_una的值。
进一步根据所述基于网络编码的传输层控制方法,步骤五中接收端接收分组并生成编码系数和载荷矩阵;
接收端开始接收分组,分组中有该分组所属的块的块号blkno,获取块号blkno,并且对于每个块号blkno,接收端初始化一个大小为blksize×blksize的编码系数矩阵Cblkno和一个相应的载荷矩阵Pblkno,所述blksize为块大小,默认为带宽乘以网络时延的值;
接收到新的分组,接收端将分组中的编码系数和载荷分别插入到块号blkno的编码系数矩阵Cblkno和载荷矩阵Pblkno中,然后判断矩阵是否满秩,即判断所接收的块中的分组是否和同一块中已接收的所有分组线性无关的。
进一步根据所述基于网络编码的传输层控制方法,步骤六中接收端更新参数,对数据块进行解码,并对发送端的反馈,完成数据传输;
若矩阵是线性无关的,则接收端的可以解码的块的自由度ack_currdof以步长1递增一次;同时,若可以解码的块的自由度ack_currdof等于blksize,则说明接收端已经确认的当前块中的块号ack_currblk已有足够的自由度,即可以对当前数据块进行解码操作,将接收端已经确认的当前块中的块号ack_currblk以步长1递增一次,接收端可以对有足够自由度的块进行解码操作,并将解码后的数据分组传输到相应的应用;
若矩阵是线性相关的,则接收端发送刚接收的对应分组的ACK给发送端,但不更新可以解码的块的块号ack_currdof和接收端已经确认的当前块中的块号ack_currblk的值。
本发明与现有技术相比,具有如下优点:
1.本发明所述方法应用在传输层,能够确保与传统无线设备的向后兼容性;
2.本发明所述方法不涉及操作系统的核心,不用考虑用户的操作系统或者网络基础设施的差异性带来的影响;
3.本发明所述方法在与传输层控制TCP方法共同作用在同一链路时,两者互不干扰;
4.本发明所述方法与传输层控制TCP方法相比较,吞吐量更大,网络时延更小。
附图说明
图1为本发明所述一种基于网络编码的传输层控制方法流程图;
图2为本发明所述一种基于网络编码的传输层控制方法的应用系统示意图;
图3为本发明仿真实验使用的测试平台示意图;
图4为本发明仿真实验1的结果示意图;
图5为本发明仿真实验2的结果示意图。
具体实施方式
为使本发明的目的、技术方案及优点更加清楚明白,对本发明所述方案和效果作进一步详细描述。
本发明所述方法在应用时分为发送端和接收端两部分。如图1及图2所示,本发明对所述一种基于网络编码的传输层控制方法,包括以下步骤:
步骤一:参数的初始化,包括当前往返时间、最小往返时间及丢失分组数。
接收端与发送端同时初始化参数,当前往返时间RTT、最小往返时间RTTmin及丢失的分组数losses都初始化为0,要被发送的下一个分组的序列号seqno_nxt初始化为1,所述往返时间为分组由发送端发出,接收端收到分组后再发送确认信息ACK,并被发送端接收到的时间。
步骤二:发送端进行数据分组、分块与编码。
发送端先将要发送的数据流或文件分块,每个块包含blksize个分组,blksize大小为带宽乘以网络时延的值,每个分组为固定字节长度,所述blksize初始化为当前带宽与网络时延之积。如果数据流或文件的其余部分不足以成为一个完整的分组,则用零填充,确保所有分组的长度相同。所述块不必是完全被分组填满,同时块任一i应该是在块i+1之前被填充。
分组与分块完成后,对分组进行编码,编码系数占用一个字节,一个编码分组的产生依赖于该块中的随机编码的所有分组,用于发生错误时的校验。
所述发送端在每个要发送的分组中包括:块号、编码系数、序列号seqno、载荷,所述编码系数由一个伪随机数的种子产生器生成,所述载荷为编码或非编码。
步骤三:发送端发送分组并接收由接收端发送的确认信息。
发送端完成编码后,将数据分组发送到接收端,再由接收端发送确认信息ACK给发送端。
所述接收端对于接收的数据包,发送确认信息ACK,在ACK中需指出:可以解码的块的自由度ack_currdof、接收端已经确认的当前块中的块号ack_currblk、已经得到确认的分组序列号ack_seqno,所述可以解码的块的自由度ack_currdof即块中已收到的编码分组数。
若当前时间与最近分组的发送时间time_lastack的差值超过了重发超时时间RTO,则将令牌数tokens重置为最近分组发送前的值,令牌数为发送端含有的令牌个数,一个令牌允许CTCP发送端发送一个数据分组,令牌数以步长1递减一次,同时启动慢启动模式,所述慢启动模式即以步长1递增令牌数tokens。
若当前时间与最近分组的发送时间time_lastack的差值未超过重发超时时间RTO,且发送节点收到接收端发送的确认信息ACK,判断是否处于慢启动过程:若已经处于慢启动模式,慢启动模式即以步长1递增令牌数tokens,则将令牌数以步长1递增一次,令牌数为发送端含有的令牌个数,一个令牌允许CTCP发送端发送一个数据分组,同时若当前的令牌数大于慢启动阈值,即发送端允许处于慢启动模式时的最大令牌数,则切换到拥塞避免模式,即通过将tokens的值每次减小一半的速度,来达到控制链路流量的目的,所述CTCP为Coded TCP,即编码TCP;
若没有处于慢启动模式,则判断从接受端反馈的ACK信息的序列号是否大于最新的未确认分组的序列号,若是,则可以由得到最新的令牌数tokens的值,若不是,则可以由得到最新的令牌数tokens的值。
若当前时间与最近分组的发送时间time_lastack的差值未超过重发超时时间RTO,但发送节点没有收到接收端发送的确认信息ACK,发送端可以得到最新的令牌数tokens,利用最新的令牌数tokens做块的调度,以更好的发送要传输的分组。
发送端先初始化一个名为onfly的全零数组,发送端定义一个区间interval_1,将最新的未确认分组的序列号作为该区间的上界,将要被发送的下一个分组的序列号减1后的值作为该区间的下界,若序列号seqno在区间interval_1范围内,且当前时间小于有序列号的分组被发送时的时间戳与1.5倍的当前往返时间RTT之和,则将数组下标为B(seqno)值的元素以步长1递增一次。
若序列号seqno不在区间interval_1范围内,发送端定义一个区间interval_2,将当前发送端最小的未确认的块号currblk作为该区间的上界,将当前发送端最小的未确认的块号currblk和发送端要发送的块的数目numblks减去1后的值的和作为该区间的下界,若块号blkno在区间interval_2的范围内,且块号blkno与当前发送端最小的未确认的块号currblk相等,并且满足(1-p)×onfly[currblk]<blksize-currdof的关系,p为短期平均丢包率,则发送一个带有序列号的分组,然后将从块号为blkno中获取的要被发送的下一个分组的序列号seqno_nxt以步长1递增一次。
若块号blkno与当前发送端最小的未确认的块号currblk不相等,判断(1-p)×onfly[currblk]<blksize是否成立,若成立,则发送一个带有序列号的分组,然后将从块号为blkno中获取的要被发送的下一个分组的序列号seqno_nxt以步长1递增一次。
步骤四:若块号blkno不在区间interval_2的范围内,或者(1-p)×onfly[currblk]<blksize不成立,则发送端更新网络参数。
收到ACK信息后,发送端先将收到的最新ACK的时间戳time_lastack的值更新为当前时间,再将当前往返时间RTT的值更新为发送端先将收到的最新ACK的时间戳time_lastack的大小减去有序列号的分组被发送时的时间戳T(seqno)的差值,然后才可以将RTTmin的值更新为RTT和旧的RTTmin两者当中的最小值。
若接收端已经确认的当前块中的块号ack_currblk大于当前发送端最小的未确认的块号currblk,则将发送端最小的未确认的块号currblk的值更新为接收端已经确认的当前块中的块号ack_currblk的值,同时将当前接收端已知的可以被解码的块的自由度currdof的值更新最近被确认的可以解码的块的自由度ack_currdof;
若接收端已经确认的当前块中的块号ack_currblk不大于当前发送端最小的未确认的块号currblk,将当前接收端已知的可以被解码的块的自由度currdof的值更新为可以解码的块的自由度ack_currdof和自由度currdof中的最大值。
若已确认的分组序列号ack_seqno的值大于最新的未确认分组的序列号seqno_una的值,则可由seqno_una=ack_seqno+1得到seqno_una的最新值,由losses=ack_seqno-seqno_una+1得到losses的最新值,由p=p×(1-μ)losses+1+(1-(1-μ)losses)得到短期平均丢包率p的最新值,所述μ为平滑因子,μ∈(0,1);
若已确认的分组序列号ack_seqno的值不是大于最新的未确认分组的序列号seqno_una的值,则可以由seqno_una=ack_seqno+1得到最新的未确认分组的序列号seqno_una的值。
步骤五:接收端接收分组并生成编码系数和载荷矩阵。
接收端开始接收分组,分组中有该分组所属的块的块号blkno,获取块号blkno,并且对于每个blkno,接收端只为blkno初始化一个大小为blksize×blksize的编码系数矩阵Cblkno和一个相应的载荷矩阵Pblkno,所述blksize为块大小,默认为带宽乘以网络时延的值。
接收到新的分组,接收端将分组中的编码系数和载荷分别插入到块号blkno的编码系数矩阵Cblkno和载荷矩阵Pblkno中,然后判断矩阵是否满秩,即判断所接收的块中的分组是否和同一块中已接收的所有分组线性无关的。
步骤六:接收端更新参数,对数据块进行解码,并对发送端的反馈,完成数据传输。
若矩阵是线性无关的,则接收端的可以解码的块的自由度ack_currdof以步长1递增一次。同时,若可以解码的块的自由度ack_currdof等于blksize,则说明接收端已经确认的当前块中的块号ack_currblk已有了足够的自由度,即可以对当前数据块进行解码操作,将接收端已经确认的当前块中的块号ack_currblk以步长1递增一次,接收端可以对有足够自由度的块进行解码操作,并将解码后的数据分组传输到相应的应用。
若矩阵是线性相关的,则接收端发送刚接收的对应分组的ACK给发送端,但不更新可以解码的块的块号ack_currdof和接收端已经确认的当前块中的块号ack_currblk的值。
本发明的效果可通过以下仿真实验进一步说明:
1.实验条件
该实验室测试平台包括服务器经路由器与千兆交换机相连,所述服务器为戴尔的PowerEdge850,3GHz Xcon,英特尔82571EBGigabit NIC;发送端和接收端使用Linux2.6.32内核,数据流量使用rsync生成;路由器运行FreeBSD4.11和一种用来模拟网络环境的软件IPFW-Dummynet,如图3所示,可构造各种传播延迟,丢包率,队列大小和链路速率等一系列的仿真网络条件。
2.实验内容
实验1:发送端和接收端分别使用不同的传输方法,在设定链路容量为25Mbps,当前链路的往返时间RTT为25ms的情况下,测得分组丢失率p,由和其中N=32,得到使用不同传输方法时的传输效率的对比结果,由图4所示,在分组丢失率相同的情况下,使用CTCP方法的数据传输效率明显优于其他的传输方法;同时,随着分组丢失率的变化,使用CTCP方法的数据传输效率的稳定性也是最好的。
实验2:在标准TCP和CTCP共享同一链路传输数据分组时,吞吐量会随着往返时间RTT的变化而改变。在这里我们分别设定链路容量分别为25Mbps和10Mbps,测出两种方法共享同一链路时的吞吐量随往返时间RTT的变化,如图5所示,两种方法的吞吐量始终比较接近,并没有因为共享同一链路的原因,使得任何一方的吞吐量严重减小。