《武汉工程大学学报》  2021年02期 203-208   出版日期:2021-04-30   ISSN:1674-2869   CN:42-1779/TQ
数据传输改进方案在医疗设备监测系统的应用


随着物联网技术的发展,远程医疗设备监测系统得到了广泛应用。其中,保证数据传输的准确性一直是研究的重要方向。据“2021年度医疗器械注册工作报告”显示,当前远程医疗设备监测系统中,多数数据流由传输控制协议(transmission control protocol,TCP)/网络控制(internet porotocol,IP)协议控制传输[1]。研究表明,由于我国人口众多、医疗设备数量远超别国,远程医疗设备监测系统会出现同时间段内大量设备请求建立TCP连接并发送数据的情况[2]。突发数据流的出现,时常引起网络拥塞、服务器故障等问题。TCP拥塞控制能保证远程医疗设备监测系统通信网络不会因为网络流量增大而引起阻塞。TCP拥塞控制机制通常利用主动队列管理[3],通过实时计算设备TCP连接请求队列的平均队列长度,对这个平均队列长度进行调控,维持网络性能。平均队列长度是当前网络流量的判断值,主动队列管理机制通过此值进行算法分析,处理网络拥塞问题。在医疗设备实现TCP连接后,设备会把要传递的信息通过自定义数据帧的形式,以通信指令向服务器传输。系统将采用多线程技术,并发执行多个TCP连接,同时接收多组数据,大幅提高资源使用率。多线程下,线程接收数据速度如果快于线程储存数据速度,会造成数据包不能及时储存而丢弃。基于此本文设计双缓存队列结构[4],双缓存队列采用链式存储结构组建成单链表环形结构,不仅解决了顺序存储结构下固定长度无法扩展的问题,还对远程医疗设备监测系统中数据丢失的问题进行处理。本文将对传统拥塞控制算法进行改进,并结合双数据缓存队列,提出基于拥塞控制的多线程双缓存算法,为远程医疗设备监测系统中的网络拥塞和储存速度缓慢的问题提供解决方案。1 问题的提出医疗设备监测系统整体分为3层,分别是终端层、传输层和用户层。系统整体架构如图1所示。[终端层][传输层][医疗设备][NBIOT][服务器][用户层]图1 系统整体架构Fig. 1 Overall architecture of system系统采用窄带物联网(narrow band internet of things,NBIOT)模块作为医疗设备的传输装置,首先使用通信格式的指令向服务器申请建立TCP连接;随后服务器开辟多线程,设立临界区保护,实施主动队列管理方案与多设备完成连接;连接成功后,医疗设备发送数据包,服务器通过多线程缓存队列接收数据并储存。随机早期丢弃算法(random early detection,RED)是现阶段应用于远程医疗设备监测系统中使用频次最高的主动队列管理算法[5]。RED算法主要是通过TCP请求队列的大小去判断网络是否可能造成拥塞情况[6],然后设定一个丢弃概率。系统通过丢弃概率对连接请求丢弃,从而使网络拥塞不会发生[7]。然而随着应用环境的变化,传统RED算法仍有许多缺点。首先,在面对网络流量大幅度提高时,RED算法丢弃概率也大幅度增加,这是以较高的丢包率换取较高吞吐量的做法,虽然保证了TCP请求队列稳定,但是并没有将系统使用率最大化[8]。其次,算法没有考虑到服务器接收数据的流量,服务器接收数据流量大小会影响TCP请求队列的响应时间,这也是队列长度变化因素之一。因此,在降低丢包率,提升TCP请求响应速度上,RED算法有很大的改进空间。对此,诸多学者提出了多种改进方案,如根据区间划分不同的丢弃概率计算方式的任务型随机早期丢弃算法(task-based random early detection,TRED)、避免队列高缓冲区空闲的主动随机早期丢弃算法等[9]。在服务器开发中,对于数据通信设计的普遍做法是建立2个各司其职的线程。一个是数据接收线程,负则接收已建立TCP连接的设备发送的数据包;另一个是数据处理线程,对接收的数据进行解析并储存。但是在传输过程中,无法保证2个线程的工作速度相同。当处理慢于接收时,系统容易造成数据丢失,为此需有缓存区来进行调节[10]。缓存区采用链式存储队列,内存大小在申请建立后可变更,是能够动态申请内存的结构。链式存储解决了在顺序存储结构下,因为读速度慢于写速度而造成的覆盖现象。链式存储队列的使用过程中有着更低的内存碎片、更小的时间复杂度。然而在队列使用过程中,还有着另外一个麻烦。缓存队列在多个线程间被反复调用,会有互斥现象的出现,所以每当缓存队列被一个线程调用后,都将被加锁。调用结束必须先与当前线程解锁,然后才能被下一个线程调用。反复加锁、解锁的操作,不利于系统高效运行。2 RED算法的改进传统的RED算法中,使用[J(n)]代表第n个TCP请求到达服务器时的平均队列长度,[K(n)]代表第n个请求到达服务器时平均队列长度变化量,[L(n)]代表第n个请求到达服务器时的瞬时队列长度,[O]表示权重[11]。平均队列长度与平均队列变化量表达式为:[Jn=1-O·Jn-1+O·L(n)] (1)[K(n)=(1-O)·K(n)+O·[L(n)-L(n-1)]](2)RED算法通过低通滤波器对平均队列长度进行处理,权值[O]表示滤波器中的时间常数。[O]设置过大,结果对瞬时数据没有及时反映;设置过小,影响平均队列更新速度。因此本文所有实验中均取[O=0.02]。平均队列长度变化量能够体现网络流量情形,[K]为正则队列长度加速增加,网络趋于拥塞状态;为负则加速减少,网络负载缓和。RED算法设定了中间阈值[Smid],[Smid]会随着[K]的值变化而改变。当[K]大于0时,[Smid]将随之减少;反之,当[K]小于0时,[Smid]将增大。[Smid]表达式如下:[Smid=Smid+1, K<0Smid , K=0Smid-1, K>0] (3)RED算法中设置[Smid]的最小阈值[Smin]、最大阈值[Smax],通过利用2个参数与平均队列长度的对比,能够确定不同的网络状态。算法设置最大丢弃概率[Pmax],根据不同状态,计算丢弃概率[P]。在K小于0的情况下,丢弃概率[P]计算下:[P=0 , J≤SminJ-SminSmax-SminPmax, Smax≥J>Smin1 , J>Smax] (4)在K大于0的情况下,丢弃概率P计算如下:[P=0 , J≤SminJ-SminSmax-SminPmax, Smid≥J>Smin1 , J>Smid] (5)上述公式表明,平均队列长度变化量[K]小于0时,网络流量降低,若此时平均队列长度[J]未达[Smin],服务器无需进行丢弃;若此时平均队列长度[J]超过[Smax],服务器将停止接收TCP连接请求,使队列负载稳定在合理范围,避免服务器崩溃;其余情况服务器通过丢弃概率P进行队列控制,保障系统平稳运行,同时增大[Smid],使平均队列长度下次进入增加状态会从一个合理[Smid]值调试。当平均队列长度变化量[K]大于0时,网络流量增高,若此时平均队列长度[J]超过[Smid],服务器就要停止接收TCP连接请求,以更为积极的丢弃策略应对加速增长的平均队列长度。传统RED算法虽然能保证系统的稳定性,但是其仅从队列长度进行管理,忽视了队列变化由服务器流量决定,并且[K]大于0时丢弃策略激进[12]。针对这些问题,本文提出了RED算法改进方案新型随机早期丢弃算法(new random early detection,NRED),其本质是引入一个表示队列长度与服务器传输速度的情况的值,对传统的RED算法的丢弃概率进行进一步低通滤波,得到更为平衡的丢弃概率,并且能够通过这个值自适应改变丢弃策略。在NRED算法中,对中间阈值[Smid]的取值有了新的限定条件。设定一个值[i]用来反应队列的变化趋势,根据公式(1)与公式(2),得到J与K的值。如果[K]大于[i],表示队列增速过快;如果[K]小于[-i],表示队列快速减少;如果[K]在[-i]与[i]之间,表示队列变化目前处于稳定状态。新的[Smid]计算公式如下:[Smid=Smid+1 , K<-iSmid , -ii] (6)在NRED算法中,定义[α]为[ΔT]这个时间段内服务器接收数据量流速[D]与服务器带宽[C]之比。[β]为[ΔT]这个时间段内服务器接收数据总量[M]与需要占用带宽资源的比例。[α=DC] (7)[β=MΔT·C] (8)通过判断[α]与[β]的关系,可以得到当前的服务器的状态。如果[α]大于[1+β],服务器流量大,服务器接收的数据包堆积。如果[α]小于[1-β],服务器流量小,服务器闲置,利用率低。如果[α]介于两者之间,服务器流量处于均衡状态,缓存区队列数量起伏低。基于队列变化状态与服务器流量状态,得到了NRED算法丢弃概率[P]的计算公式。在[JSmax]时,请求队列缓存区已满,已经开始拥塞,需将请求全部丢弃;[J]处于[Smin]与[Smax]之间,则需要进行以下分类讨论。当[K<-i]且[α<1-β]时,TCP请求队列会不断减少且服务器流量降低。为提高服务器的使用率,应让丢弃策略降低,避免无效丢弃。这个情况下丢弃概率[P]计算如下:[P=(J-SminSmax-SminPmax)1-J] (9)当[K<-i]且α>1+β时,TCP请求队列减少,但服务器忙碌状态,服务器流量会逐渐空闲。为使服务器能时刻保持饱和状态,应动态调整丢弃策略,以[J+i]的值作为队列衰减系数,丢弃概率[P]计算如下:[P=(J-SminSmax-SminPmax)1-(J+i)] (10)当K处于[-i]与[i]之间时,TCP请求队列长度保持平稳,这种情况下丢弃概率[P]无须特别处理,与传统RED算法一致,公式如下:[P=J-SminSmax-SminPmax] (11)当[K>i]且[α<1-β]时,服务器流量低,但随之而来将有大量数据加速涌入,为保证加速增长的队列不会造成服务器负担,应根据队列增长速度,主动调整丢弃策略,其计算如下:[P=J-SminSmid-SminPmax, J≤Smid1 , J>Smid] (12)当[K>i]且[α>1+β]时,服务器忙碌且TCP请求队列快速增加,易造成网络拥塞现象,进而导致连接请求集体丢弃。此时应采取激进的方式控制丢弃策略,以[11+J-i]作为判断队列增长速度的标志,动态调整丢弃策略,丢弃概率[P]计算如下:[P=(J-SminSmid-SminPmax)11+J-i, J≤Smid1 , J>Smid] (13)传统的RED算法能够将队列长度稳定地维持在一个比较低的数值,因此在面对数据突发时,也能保证平均队列长度低于所设定的最大阈值,避免大量丢包情况[13]。NRED算法对比RED算法,加入对队列的当前变化趋势的判断,队列变化模型与队列管理算法相结合,能够预测队列长度的变化趋势,自适应调整丢包策略。3 多线程双缓存队列数据接收线程与数据处理线程分别设立接收缓存队列、发送缓存队列,接收缓存队列用于执行读操作,将已接收数据传入处理线程;发送缓存队列用于执行写操作,将接收线程传来的数据传入处理线程进行数据分析。由于数据接收线程与数据处理线程不会同时操作同一个缓存队列,所以数据接收线程与数据处理线程不需要再读写每一个数据单元时都进行同步/互斥操作,避免了冲突的发生[14]。接收缓存队列que1与发送缓存队列que2通过两个互斥锁lock1、lock2与数据接收线程与数据处理线程相绑定,数据接收线程与数据处理线程只有取得对应的锁才可以控制缓存队列。缓存队列整体结构包括出入队操作所用的头指针front与尾指针rear、入队数量计数器len。len的值是判断出入队的条件,若len不等于0且小于设定好的队列最大长度,意味着队列中有数据可读也有队列空间可供写入。除此之外,双缓存队列还包括节点结构,节点结构分为两个部分,分别是数据域elem与指针域next。以存储len组elem型数据为例,队列结构如图2所示。[图2 队列结构Fig. 2 Structure of queue][front][elem][next][elem 0][elem 1][elem 2][reat]当接收线程向处理线程传递数据时,系统对接收线程绑定的队列 que1(对应 lock1)与处理线程绑定的队列 que2(lock2)做队列状态的判断。若 que2为空,接收线程将待传输数据插入 que1中。直到que1到达满状态时,接收线程与处理线程同时停止对与队列绑定,并交换队列控制权。此时,处理线程绑定lock2处理que1的数据,接收线程绑定lock1向que2 传递数据。若 que2不为空,处理线程对que2中的数据进行处理。直到que2到达空状态时,接收线程与处理线程才停止对与队列绑定,并交换队列控制权。设队列长度为5,que1通过接收线程接收elem 型数据,并与空状态的que2交换 ,然后处理线程对que1的数据进行处理,队列交换流程如图 3所示。[elem 0][elem 1][elem 2][elem 3][elem 4][que 1][que 2][que 2][que 1][que 2][que 1][elem 0][elem 1][elem 2][elem 3][elem 4][elem 0][elem 1][elem 2][elem 3][elem 4][数据接收线程][数据接收线程][交换][数据接收线程][数据处理线程][数据处理线程][数据处理线程]图3 队列交换图Fig. 3 Diagrams of queue exchange4 实验部分为了验证NRED算法比传统的RED算法确实有性能的提升,本文选用NS2平台仿真比较其丢包率[15]。远程医疗设备监测系统所用到的网络拓扑结构为星形拓扑网络,发送端采用TCP Reno协议,设置服务器带宽[C=1 Mbps],传输延迟为50 ms,数据包平均大小为2 kB。实验设定N为发送数据包个数,比较[N=45]、[N=55]、[N=65]这3种不同网络环境下的NRED算法与RED算法丢包率。实验中其余仿真参数的数值设定如表1所示。表1 NRED算法仿真参数表Tab. 1 Simulation parameters of NRED algorithm[实验参数 数值 最小阈值 / kB 40 最大阈值 / kB 120 权重系数 0.02 初始中间阈值 / kB 80 初始最大丢弃概率 / % 0.1 ]通过对不同算法进行仿真实验,其丢包率如图4所示。由图4仿真实验丢包率对比中可以看出,面对更大的突发流,RED算法虽然丢包率从1.8%提升到6.5%,但是不会产生大规模丢包现象。NRED算法对比RED算法,丢包率下降程度明显,说明NRED算法对提升系统性能有着更好的效果。远程医疗设备监测系统使用NRED算法确保了系统不会发生超载崩溃现象,但是完成TCP连接后,服务器对于数据包的储存过程依然会造成数据丢失。为验证双缓存队列技术能否解决上述问题,将继续进行对比实验,对比实验参数设置如表2所示。对比实验将分别用45、55、65台医疗设备分别与服务器建立连接,随后发送5组大小为2 kB的数据包。第一组实验无NRED算法、无双缓存队列技术;第二组实验采用NRED算法、双缓存队列技术。对于NRED算法参数配置与仿真实验相同,网络拓扑结构为星形拓扑网络,发送端采用TCP Reno协议,设置服务器带宽[C=1 Mbps],传输延迟为50 ms。每组实验共计100次,每次实验均需保证医疗设备断开服务器,并重新与服务器连接。实验结果如表3所示。表2 对比实验参数表Tab. 2 Parameters of comparative experiment[实验参数 数值 每组数据发送间隔 / s 0.5 每次实验连接间隔 / s 60 实验带宽 / Mbps 1 发送连接次数 100 连接成功发送数据数/组 5 每组数据大小 / kB 2 ]表3中通过记录不同数量的医疗设备成功连接服务器的结果,得到在不同实验条件下成功建立连接的比率。同时,记录医疗设备连接成功后服务器接收数据的结果,得到不同实验条件下服务器成功接收数据包的比率。由表3可知,系统在使用改进方案后,不同数量的医疗设备成功与服务器建立连接的比率均有提升,其结果也与仿真结果吻合,表明使用NRED方案对于实现设备连接具有提升作用。此外,系统在接收已连接成功的设备数据时,使用双缓存方案具有更高的接收成功率。5 结 论针对远程医疗设备监测系统中,服务器要面对多设备同时发送数据的情况,如果对网络流量不加以控制则会引发网络拥塞现象,如果对数据包处理不及时则会造成数据丢失现象,本文研究了基于拥塞控制的多线程双缓存算法。服务器利用NRED算法,根据当前网络情况,自适应调整医疗设备的网络接入量,从而确保每个医疗设备能够与服务器建立连接。连接成功后,服务器通过带有多线程安全的双数据缓存队列对数据进行处理。实验结果表明,运用基于拥塞控制的多线程双缓存算法的数据传输改进方案,有效提升了医疗设备与服务器的数据传输能力,达到了预期效果。