APP下载

物联网应用中TCP协议重传机制的简化研究

2012-01-04冯翠丽刘波涛王青海

沈阳大学学报(自然科学版) 2012年1期
关键词:重传链表队列

冯翠丽,刘波涛,王青海

(1.长江大学 计算机科学学院,湖北 荆州 434023;2.胜利油田钻井工艺研究院 信息中心,山东 东营 257000)

物联网应用中TCP协议重传机制的简化研究

冯翠丽1,刘波涛1,王青海2

(1.长江大学 计算机科学学院,湖北 荆州 434023;2.胜利油田钻井工艺研究院 信息中心,山东 东营 257000)

以嵌入式Web服务为例,紧紧围绕该应用的具体要求,详细分析了如何设计并精简TCP的重传机制.随后的详细测试结果表明,该设计思路可行.

物联网;TCP/IP;嵌入式TCP;TCP重传

当前,研究得如火如荼的物联网技术中,首先要解决的一个问题是将嵌入式设备接入网络[1].其中,比较常见的一种实现方案是在嵌入式设备中集成精简后的TCP/IP协议栈而将该设备接入Internet[2-3].在此过程中,如果需要实现基于TCP协议的高层应用,就必须要根据嵌入式设备的具体功能来简化实现TCP协议,因此,如何针对该设备的具体应用来简化实现TCP协议的重传机制就成为一个技术难点.

1 标准TCP协议的重传机制

很多高层应用协议都依赖TCP协议提供的面向连接的、可靠的传输层服务,如 HTTP.在TCP数据传输的过程中,接受方在正确地接收到报文段后会给发送方返回一个确认,而发送方每次在发出一个报文段的同时会将其副本存入重传队列,并启动一个重传定时器.如果该定时器溢出时还没有收到该报文段的确认,发送方就认为该报文段已经丢失,并从重传队列中取出该报文段进行重传[4].

2 TCP重传机制的设计与实现

通用计算机系统有足够的资源支持实现复杂的TCP重传机制,这对于嵌入式Web服务器有限的资源及较低的处理速度来说既不现实也没有必要.在研究嵌入式系统TCP重传的实现过程中,需要解决的几个关键问题是:第一,TCP重传策略的选择,即TCP数据重传由哪一层负责;第二,重传定时器超时时间RTO(Retransmission TimeOut)如何计算,是动态采样还是取固定值,若是动态采样,应该采用哪种算法进行计算;第三,重传方式的选择,定时器超时后按照哪种方式进行重传;第四,TCP报文段如何有序存储,存储结构如何设计及操作.

以下以嵌入式Web服务器为例,阐述如何在嵌入式系统中实现TCP重传机制.

2.1 TCP重传策略的选择

嵌入式系统中,实现TCP重传至少有以下两种解决方案可供选择.

方案1 应用层参与重传[3].如果重传定时器超时,那么由应用程序负责重新生成报文段并发送.其优点是降低了嵌入式系统对于TCP重传的存储器要求.其缺点是应用层协议参与了TCP重传,严重破坏了协议栈的封装性,不利于应用扩展.

方案2 由TCP层负责重传.这是标准协议栈所支持的方式.其优点是遵循了标准TCP协议的封装性,便于应用扩展.其缺点是对嵌入式系统的存储量有一定的要求,因为该方式需要开辟一定大小的RAM缓冲区来分别存储输入、输出报文段.

嵌入式 Web服务器应用中,TCP重传方案采用以上两种方案之一均可.考虑到笔者所设计的嵌入式Web服务器存储能力有64 KB的片外RAM,而Web通信数据只有8~10 KB,因此采用方案二来实现TCP数据的重传.

2.2 RTO的计算

最初的标准规范[5]并没有强制规定RTO应如何计算,只是建议性地给出了一个计算的算法.随后的RFC文档[6]作了一系列关于RTO标准算法的规定,但仍然留下了很大的空间.此外,甚至有些操作系统的开发厂商在实现的时候并不考虑和遵照上述RTO的计算方法[7].不管采用哪种算法,动态计算RTO时都需付出很大的代价[8-9].考虑到嵌入式 Web服务器是一种基于Internet的简单控制及反馈系统,它与主控台PC机交换的报文段数不多,数据量不大,实时性要求也不高,因此,动态计算RTO既没有必要也不现实.在实际的实现中,可以根据实际的网络部署结构,进行多次试验以测算出从该系统到主控PC机的平均RTT(Round-Trip Time),并参考该RTT赋值于RTO一个固定值.用该方式实现的TCP,其服务的性能并不是最优的,但已足够给系统提供其需要的TCP服务.

2.3 TCP重传方式的选择

TCP重传方式可以采用以下两种方式之一.

(1)拉回方式,即假定发送方连续发送了m帧,如果发现第n(n≤m)帧数据超时,那么发送方重传第n帧及第n帧以后的所有帧.对应的实现可以是一个TCP连接维护一个定时器,一旦定时器超时,就重传该TCP连接重传队列中所有的TCP报文段.

(2)选择方式,即假定发送方连续发送了m帧,若发现第n(n≤m)帧数据超时,则发送方重传第n帧.对应的实现可以是一个TCP报文段维护一个定时器,一旦定时器超时,就重传该报文段.

上述两种方式各有优缺点,前者实现简单且能节约系统的RAM区间,一个连接维护一个定时器,维护比较简单,但因超时后重传的是该连接重传队列中所有的TCP包,故增加了网络通信负担,容易引起拥塞.相比之下,后者实现时,在每一个TCP报文段都需要实现一个定时器,维护起来较复杂,但超时后重传的是对应的一个包,这样不会增加网络负担,是标准TCP/IP协议栈实现的方式.嵌入式系统中如果存储资源允许(例如笔者设计的系统),用选择方式进行重传效果会更好.

2.4 缓冲区数据结构的设计及操作实现

目前有很多方式来实现上述TCP重传队列,笔者采用一个双层顺序链表结构来实现,如图1所示.

由图1的实现可知,每个连接g_Conn[i]都单独维护一个TCP重传队列,该队列各字段意义如表1所示.该队列的第一层用于存储可能需要重传(即已发送但没有确认)报文段的相关信息,第二层是可能需要重传的报文段实体.这样设计的目的是:TCP发送模块在调用发送驱动发送某个报文段后能很方便地将该报文段插入到该重传队列中去.

有了这样一个结构,剩下的工作就是维护该链表,即进行构造、插入、查找和删除操作.

图1 双层顺序链表结构示意图Fig.1 Schematic diagram of double sequential linked list

表1 双层顺序链表中各字段的意义Table 1 The significance of the field in the double sequential linked list

(1)构造链表节点的操作.每当系统需要发送TCP报文段时,就会调用Get_Mem()动态分配两个区间:一个分配给_MEM_CELL型节点,便于实现顺序链表的各种操作;另外一个Buf分配给实际要发送的TCP报文段.该函数实现如图2(a)所示.

(2)插入链表节点的操作.Insert_Mem()函数负责将由Get_Mem()构造的TCP报文插入到对应连接的顺序链表中,其输入参数分别是连接号、该节点的首部地址指针和期望Ack,其实现如图2(b)所示.

(3)查找链表节点的操作.函数Search_Mem()用来查找指定Ack号的TCP报文,其实现过程如图3(a)所示.

(4)删除链表节点的操作.每当TCP接收模块在收到合法的Ack型的TCP数据包时,就会调用函数Delete_BeforSeq Mem().考虑到客户端有可能对服务器发出的TCP数据进行批量确认,因此该函数实现时是删掉顺序链表中所有Ack字段值小于或等于接收Ack号的节点,其实现过程如图3(b)所示.其中,函数Delete_Mem ()的功能是删除给定的节点,并释放该节点的空间,具体实现时要注意先释放其Buff Ptr所指的空间,再释放_MEM_CELL型节点的空间,否则容易造成内存泄露.

3 TCP重传的测试

这里采用的测试方法是将该嵌入式Web服务器与PC机在RJ-45口及串口分别对接.将嵌入式Web服务的调试信息从串口输出,并由串口精灵显示[10].笔者对文中实现的TCP重传模块进行测试时,输出的信息如图4所示.

图4 测试TCP顺序链表时的输出信息Fig.4 Output when testing the sequential linked list

由图4可知,每当服务器发送一个非RST型的TCP报文时,都会被插入到顺序链表中,如信息“Insert_Mem():firstly insert Pkg Num=2”表明,在收到客户端的TCP连接请求后,服务器会发送一个TCP应答报文段,该报文段在发送完后立即被插入到重传队列中;信息“Search_Mem():find Pkg Num=6 Pkg”“Delete_Mem():the first Pkg of Pkg Num =5 deleted”“Delete_BeforSeq Mem():total 2 pkgs are deleted”表明,服务器利用收到的报文9删掉了重传队列中Ack号比其Ack号要小的报文5和报文6;信息“Free_Mem():free the Pkg Num=5 success”则表明成功地释放了被删除的报文段的RAM空间.

由于将开发板直接接到PC上时,网络环境比较稳定,因此,为了迫使TCP启动重传模块,可以在服务器TCP发送报文段时人为地将试验板与PC机的网络断开后迅速连上.由图4中的信息 “Retransmit the Pkg Num =5 Pkg”和“Retransmit the Pkg Num=6 Pkg”可知,第7、8个报文段实质上是对第5、6个报文段的重传.

笔者通过实时获取嵌入式Web服务器的传感器温度来验证客户机能否正确地下载数据,通过客户端的Web页面来控制嵌入式Web服务器的LED灯亮/灭来验证客户端能否正确地上传数据.嵌入式WebSever演示如图5所示.经笔者验证可知,这种TCP重传机制能完成既定的嵌入式TCP服务.

图5 客户端动态地获取服务器的传感器温度Fig.5 Dynamically access the sensor's temperature of server in client

通过以上测试可知,顺序链表的操作无误,TCP重传模块工作正常,采用该重传机制的TCP能完成正常的TCP服务.

4 结 语

详细讨论了如何设计并实现TCP协议的重传机制,并作了相关测试,验证了该设计思路的可行性.为嵌入式设备中顺利实现嵌入式TCP/IP协议栈进而实现物联网技术打下了坚实的基础.

[1] International Telecommunication Union UIT.ITU Internet Reports 2005:The Internet of Things[R/OL].[2011-06-26].http:∥ www.itu.int/osg/spu/publications/internet of things/.

[2] 冯翠丽,刘波涛.一种嵌入式TCP/IP协议栈的设计与实现[J].长江大学学报:自然科学版:理工卷,2008,5(4):331-333.

[3] 李金梁,景博.嵌入式Internet中TCP协议的设计与实现[J].微计算机信息,2005,21(7):40-41,138.

[4] 王敏杰,徐昌彪,刘光明.无线网络下TCP重传定时器研究[J].计算机工程与应用,2004,40(36):146-150.

[5] Information Sciences Institute University of Southern California.RFC 793:Transmission Control Protocol[S/OL].[2011-07-15].http∥www.faqs.org/rfcs/rfc793.html.

[6] Vern Paxson,Mark Allman.RFC 2988:Computing TCP's Retransmission Timer[S/OL].[2011-07-15].http:∥www.faqs.org/rfcs/rfc2988.html.

[7] 王轶骏,薛质,李建华.基于TCP/IP协议栈指纹辨识的远程操作系统探测[J].计算机工程,2004,30(18):7-9.

[8] 严云洋,冯径.TCP拥塞控制的实现与改进[J].计算机应用研究,1999,26(1):35-37.

[9] 潘建平,顾冠群,吴国新.TCP/IP拥挤控制研究[J].小型微型计算机系统,1999,20(4):251-256.

[10] 刘波涛,冯翠丽,王青海,等.应用RTL8019AS的嵌入式Web服务器硬件实现[J].长江大学学报:自然科学版,2008,5(1):75-78.

TCP Retransmission Mechanism Simplification Research in Application of Internet of Things

FENGCuili1,LIUBotao 1,WANGQinghai2
(1.Department of Computer Science,Yangtze University,Jingzhou 434023,China;2.Information Center,Drilling Technology Research Institute of Shengli Oilfield,Dongying 257000,China)

Taking the design of the embedded Web Server as an example,aiming at the concrete requirements of the application,the design and realization of a streamlined TCP retransmission mechanism are discussed in detail.Subsequent detailed test results show that the design ideas are feasible.

Internet of things;TCP/IP;embedded TCP;TCP retransmission

TN 915.04

A

1008-9225(2012)01-0030-05

2011-08-08

国家重大专项资助项目(2011zx013).

冯翠丽(1980-),女,河南太康人,长江大学讲师,硕士.

刘乃义】

猜你喜欢

重传链表队列
队列里的小秘密
基于多队列切换的SDN拥塞控制*
基于二进制链表的粗糙集属性约简
跟麦咭学编程
在队列里
面向异构网络的多路径数据重传研究∗
基于链表多分支路径树的云存储数据完整性验证机制
丰田加速驶入自动驾驶队列
数据链路层的选择重传协议的优化改进
链表方式集中器抄表的设计