物联网应用中TCP重传队列的设计与实现
2012-11-21陈宪超张兴海郑达标石海涛赵先进
陈宪超 王 辉,张兴海,郑达标,石海涛 赵先进
(徐工集团徐州建机工程机械有限公司,江苏 徐州 221001) (徐州赫思曼电子有限公司,江苏 徐州 221001) (徐州长航科技有限公司,江苏 徐州 221001)
物联网应用中TCP重传队列的设计与实现
陈宪超 王 辉,张兴海,郑达标,石海涛 赵先进
(徐工集团徐州建机工程机械有限公司,江苏 徐州 221001) (徐州赫思曼电子有限公司,江苏 徐州 221001) (徐州长航科技有限公司,江苏 徐州 221001)
物联网应用的关键技术之一就是要实现嵌入式设备的网络化,其中一种思路就是在嵌入式设备中集成简化后的TCP/IP协议栈。然而在精简TCP/IP协议栈中的TCP协议时会面临一个技术难题:如何根据实际应用设计合适的重传队列。以嵌入式Web服务为例,紧紧围绕嵌入式Web服务器应用的具体要求,详细分析了如何设计并实现TCP重传队列。测试结果表明,该设计思路可行。
物联网;TCP/IP;嵌入式Web服务器;嵌入式TCP;TCP重传队列
如何将嵌入式设备接入网络,进而实现物联网应用,是当前一个研究热点[1]。其中,比较常见的一种实现方案是在嵌入式设备中实现精简的TCP/IP协议栈后再将该设备接入Internet[2-3]。在此过程中,如果需要实现基于TCP协议的高层应用,就必须要根据嵌入式设备的具体功能来简化实现TCP协议,而设计实现TCP协议就必须要实现TCP重传队列。因此,如何有针对性地实现TCP重传队列就是一个技术难点。
1 标准TCP重传队列的功能及作用
TCP(Transmission Control Protocol,传输控制协议)是TCP/IP协议簇的核心协议, 也是TCP/IP协议簇中最复杂的协议。它是一种面向连接的、可靠的、基于字节流的运输层通信协议[4]。TCP之所以是一种可靠的协议,就在于它有一种完善的重传机制。在一般标准的TCP协议实现中,重传机制的关键问题是要计算RTO(Retransmission Time Out),花费的代价较大[4-7]。一旦得到RTO之后,剩下的操作就是当某个重传计时器超时后重发对应的TCP包,有多种方式可以完成该重发操作。在很多的TCP重传实现中,都需要借助一个重传队列来记录已经发送的TCP报文,并在超时后进行重传操作。
2 嵌入式TCP重传队列的设计与实现
2.1设计思路
图1 顺序链表结构示意图
笔者的设计思路是利用顺序链表记录每个已发送的TCP数据包,而当收到TCP确认报文时就从该顺序链表中删除相应的TCP数据包。同时,每隔一定的时间就触发一个TCP重传事件,以发送那些队列中已经超时所有TCP数据包。顺序链表的结构如图1所示。由图1可知,每个连接g_Conn[i]都单独维护一个TCP重传队列,该队列的长度用字段MemPkgNum记录,队首部地址由字段MemPoolHeader记录。该重传队列采用一个如图1所示的双层顺序链表来存储:第1层为一个_MEM_CELL型的结构体,用于存储可能需要重传(即已发送但没有确认)数据包的相关信息,以便维护该连接所有可能需要重传的TCP报文。字段Next的作用是将该连接中所有可能需要重传的TCP报文都连接在一个顺序链表上,字段RetryTimer是该包的定时器,字段RetryNum记录的该包重传的次数。字段ExpectAck是该结点中的关键字,在收到对方的确认后会通过该字段值来删除重传队列中相对于的包。BuffPtr和TotalPkgLen字段定义了该数据包实体的首地址和总长度。这种设计结构有如下方便:能在TCP发送模块在调用地层发送驱动发送数据包后直接将该包挂到此重传队列后面,也便于在ARP解析失败后直接进行ARP重传操作的处理。
2.2具体实现
设计完该数据结构后,剩下的工作就是要设计对应链表的相关维护操作,如构造操作、插入操作、查找操作和删除操作等。
1)链表结点的构造操作 构造链表结点的操作由Get_Mem()函数负责,在TCP发送模块中调用。每当系统需要发送TCP报文时,就会调用Get_Mem()以动态分配2个区块:其中一个区块用于构造_MEM_CELL型数据结构,以顺利完成顺序链表的相关操作;另外一个区块用于构造一个缓存,以装载要发送的TCP报文。该函数的实现流程如图2所示。
图2 Get_Mem()函数和Insert_Mem()函数的流程图
2)链表结点的插入操作 当Get_Mem()函数被成功调用后,系统就会调用Insert_Mem()函数将TCP报文插入到对应连接的顺序链表中。该函数的定义形式如下:void Insert_Mem(p_Conn,p_MemPtr,p_Ack)。该函数各参数的意义分别如下:p_Conn指明某个连接号、p_MemPtr指示了该结点对应的首地址指针,p_Ack说明了该TCP报文的期望号,它的实现流程如图2所示。
3)链表结点的查找操作 Search_Mem()函数用来查找某个TCP报文,该报文由指定的ACK号确定。
4)链表结点的删除操作 TCP模块在接收ACK型的TCP数据包后,会对该数据包进行合法性检查,如果认为该数据包是合法的,则会根据收到的ACK号调用Delete_BeforSeqMem()函数以删除那些已经成功发送的TCP报文。考虑到客户端有可能会对服务器发出的TCP数据包进行批量确认,因此凡是ACK字段小于或等于收到的ACK号的那些TCP数据包都应该被删除掉。Delete_BeforSeqMem()函数的作用是删除对应的结点,并释放该结点的内存区块,需要注意的是应先释放其BuffPtr所指的内存区块,再释放_MEM_CELL型结点所占的内存区块。
3 嵌入式TCP测试结果
笔者采用的测试方法是将嵌入式Web服务与PC机在RJ-45口及串口分别对接[8]。利用串口精灵接收嵌入式Web服务器的输出并显示,利用Sniffer Pro抓取PC机发送和接收的数据包。
图3所示的是笔者在测试顺序链表时系统输出的信息。图3中的第4行信息,即“Insert_Mem():firstly insert PkgNum=2”,表达的意义如下:系统将第2个TCP发送报文插入到重传队列的首部。从后续类似的信息也可以看出,每当系统发送了一个非RST型的TCP报文后,都会将该报文插入到重传队列中,以方便后续的重传操作;图3中的第6行信息,即“Search_Mem(): find PkgNum=2 Pkg”,说明系统在收到ACK型报文后,会利用该ACK号(即“576002”)在发送队列里查找那些ACK号小于等于的该ACK号的所有TCP报文;图3中的第24行和第26行信息,即“Delete_Mem():the first Pkg of PkgNum=5 deleted”和“Delete_Mem():the first Pkg of PkgNum=6 deleted”,说明系统在接收到ACK型的TCP报文9后,利用该ACK号删掉了重传队列中对应的报文5和报文6,图3中的第24行信息“Delete_BeforSeqMem(): total 2 pkgs are deleted”也说明了在函数Delete_BeforSeqMem()中删除了2个TCP包;图3中的第25行信息,即“Free_Mem(): free the PkgNum=5 success”,说明系统成功释放了该TCP包所占的内存区块。
图3 测试TCP顺序链表时的输出信息 图4 测试TCP重传计时器时的输出信息
由于将系统直接接到PC上时,网络环境比较稳定,为了迫使TCP启动重传模块,可以在服务器TCP层发送数据时人为将系统与PC机的网络断开一会儿后迅速连上。调试信息如图4所示。由图4可以看出,由于没有及时收到客户端的ACK而导致重发了报文5和报文6,并且在收到的报文9后删掉了顺序链表中对应的报文5和报文6。
为测试笔者实现的TCP重传模块是否能正常工作。笔者采用如下思路进行验证:分别在2个传输方向上进行验证,首先验证服务器是否能正常传输数据到客户端。试验过程中采用人工物理方式(如火烧)对嵌入式Web服务器系统中的传感器进行升温,并查看客户端PC机的Web浏览器是否能实时刷新显示该传感器的温度数据,结果如图5所示。该结果显示服务器能正常传输数据到客户端;接着验证客户端是否能正常上传数据到服务器,在客户端PC机上利用鼠标点击LED的“亮”或者“灭”控制开关,同时查看嵌入式Web服务器系统中的LED灯是否能同步亮/灭,结果显示,用户完全可以通过Web浏览器来控制Web服务器系统中的LED灯。该结果显示客户端能正常上传数据到服务器。因此,通过上述TCP重传队列实现的TCP重传机制能完成既定的嵌入式TCP服务。
图5 客户端动态获取服务器系统中的传感器温度数据
[1]黄文力,马礼, 王玉超.嵌入式Internet中TCP/IP协议栈的研究与设计[J].电脑开发与应用,2008,21(1):46-49.
[2] 冯翠丽,刘波涛.一种嵌入式TCP/IP协议栈的设计与实现[J].长江大学学报(自然科学版),2008,5(4):N331-333.
[3] 李金梁,景博.嵌入式Internet中TCP协议的设计与实现[J].微计算机信息,2005,21(7):40-138.
[4] 陈维良,赵俊超,魏少军.TCP/IP协议的ASIC设计与实现[J].微电子学,2002,32(2):97-101.
[5] 王敏杰,徐昌彪,刘光明.无线网络下TCP重传定时器研究[J].计算机工程与应用,2004(36):146-150.
[6] 章淼,熊勇强,吴建平.TCP重传计时器的实现和改进[J].计算机工程与应用,2000(12):132-146.
[7] 游海峰,何泾沙,张伟.基于TCP重传计时器的算法分析[J].电脑知识与技术,2007(1):83-89.
[8]刘波涛,冯翠丽,王青海,等.应用RTL8019AS的嵌入式Web服务器硬件实现[J].长江大学学报(自然科学版),2008, 5(1):N75-78.
[编辑] 洪云飞
10.3969/j.issn.1673-1409(N).2012.06.036
TN915.04
A
1673-1409(2012)06-N108-04