多目标控制系统中TCP粘包问题的解决方法*

2017-09-18 00:24苟茹君1董广然季茂鹏
电讯技术 2017年9期
关键词:报文编程算法

党 琦**,苟茹君1,3,董广然,季茂鹏

(1.西安卫星测控中心,西安 710043;2.航天器在轨故障诊断与维修重点实验室,西安 710043; 3.宇航动力学国家重点实验室,西安 710043)

多目标控制系统中TCP粘包问题的解决方法*

党 琦**1,2,苟茹君1,3,董广然1,2,季茂鹏1,2

(1.西安卫星测控中心,西安 710043;2.航天器在轨故障诊断与维修重点实验室,西安 710043; 3.宇航动力学国家重点实验室,西安 710043)

测控设备采用传输控制协议/网际协议(TCP/IP)作为基础协议,进行遥控多通道并行工作时易造成网络数据粘包。针对此问题,在对TCP协议特点进行分析的基础上,通过讨论TCP编程模型和流交付模型,研究了发生TCP数据流粘包时的网络数据特征,并分析了发生网络粘包的原因,提出了局域网环境下采用短连接、发送端及格式数据组包3种解决网络粘包的方法。实际测试结果证明了这3种方法的适应性及格式数据方法还原TCP网络数据包的有效性,可为基于TCP应用软件开发提供借鉴。

多目标控制系统;TCP数据流;网络粘包;网络程序设计

1 引 言

随着信息技术的发展,以传输控制协议/网际协议(Transmission Control Protocol/Internet Protocol,TCP/IP)为基础的现代网络技术,已经渗透到各种设备的控制和相互间的信息传输中,并逐步演变成为一种重要的基础设施[1]。TCP/IP是一个由多种协议组成的协议族(Protocol Family)[2],它是一种开放的标准,可以用来连接各种来自不同厂商的机器,因此,越来越多的网络和网络应用程序采用了TCP/IP协议[3]。分层协议[4]简化了系统之间的编程模型,降低了互联成本,用户可以根据业务需求选择使用不同的协议。在实时数据传输、多媒体会议、数据拷贝等诸多方面,广泛使用用户数据报(User Datagram Protocol,UDP),在信息可靠传输要求较高的应用中,普遍使用了传输控制协议(Transmission Control Protocol,TCP),我国的航天测控网在构建中也采用了IP网络技术[5]。

TCP和UDP协议都基于IP层,但是TCP协议提供了一种面向连接的、可靠的字节流服务[3-4,6-7],数据以字节流的形式传递给接收者,读取TCP数据和读取串口数据一样,无法预知一次读调用会返回多少字节[3]。因此,在使用TCP协议进行信息传输的过程中,经常会产生粘包和拆包现象。

本文对TCP协议进行了研究,分析了易产生网络粘包和拆包的原因,并结合工作经验,设计了解决TCP粘包和拆包的方法。

2 多目标控制系统数据传输模型及其不足

我国航天测控系统经过50多年的发展,具备了对载人飞船和各类不同轨道卫星的发射、在轨运行以及返回测控能力[8]。随着技术的发展,我国的航天测控网正逐步向开放式、网络化转型。新一代测控网基于成熟的IP网络技术进行构建,采用的是TCP/IP协议[9-10]。受通信带宽、网络时延以及协议特性的限制,一般从控制中心到测控站信息传输处理系统[9]之间的信息传输采用UDP协议,从测站信息传输处理系统到多功能数字基带设备[11]的对航天器的指令信息,一般采用TCP协议。

空间交会对接[12]、卫星编队[13]等测控需求,催生了单台设备在同一波束内对多目标进行测控的技术发展。但是,由于存在多中心并行控制,以及TCP流传输的特点,很容易导致TCP粘包。多目标控制系统参见图1。

图1 多目标控制系统模型示意图Fig.1 Schematic diagram of multi-object control system model

3 TCP协议及粘包分析

3.1TCP编程模型

TCP是面向连接的协议,使用TCP的两个应用在彼此交换数据前必须先建立一个TCP连接[4],常采用的编程模型是客户-服务器(Client-Server)模型[16-17],如图2所示。

图2 TCP编程模型Fig.2 TCP programming model

3.2TCP流交付模型

采用TCP协议进行数据交换双方之间好像被一个“管道”所连接,客户发起对等通信,服务器无限等待接收客户通信请求[2]。发送方写入字节流,接收方读取字节流[3,16]。流交付模型参见图3。

图3 流的交付示意图Fig.3 Diagram of stream delivery

为了说明TCP粘包现象,我们假设在主机A和主机B的应用程序之间建立一条TCP连接。另外,为简化问题,假设主机A要发送两条报文,并两次调用send,每条报文调用一次,如图4(a)所示。

图4 报文发送及可能的封装方式Fig.4 Message transmission and possible encapsulation

在主机A调用send时,send通常只是把数据复制到主机A的TCP/IP栈中就返回了,需要立即发送多少数据最终由TCP依据发送窗口、拥塞窗口、路径上的最大传输单元以及连接的输出队列中有多少数据决定[3]。在不考虑出错和EOF,并且假设应用程序读取了所有可读的数据,主机B读取报文时,会出现如图4所示的4种情况。

(1)正常情况

第一次正常读取了报文M1,第二次读取了报文M2,如图4(b)-(1)。

(2)双包粘合

一次读取了报文M1和报文M2粘合在一起的整包数据,如图4(b)-(2)。

(3)第一包部分数据和第二包数据粘合

第一次读取了报文M1的部分数据M11,第二次读取了报文M1报文剩余数据M12及报文M2全部,如图4(b)-(3)。

(4)第一包和第二包部分数据粘合。

第一次读取了报文M1的所有数据以及报文M2的部分数据M21,第二次读取了报文M2剩余数据M22,如图4(b)-(4)。

3.3TCP粘包的原因分析

对于图4所示的现象,我们逐一进行分析。

(1)正常情况

每个报文的发送、接收都很及时,系统能够像UDP一样及时处理报文。

(2)双包粘合

发送粘包或接收缓存区积压,此时一次读取了两个完整的报文,需要考虑解包问题。

(3)第一包部分数据和第二包数据粘合

读取比发送快,第一次读取取到了不完整的报文。

(4)第一包和第二包部分数据粘合

发送粘包或接收缓存区积压。

通过上述分析发现,在不考虑最大报文段长度(Maximum Segment Size,MSS)分段以及最大传输单元(Maximum Transmission Unit,MTU)分片[4]的情况下,产生TCP网络粘包和拆包的原因并不复杂,不外乎两种情况[17],一是发送端进行缓冲造成发送缓冲区粘包,二是接收方接收不及时造成缓冲区粘包和拆包。

4 TCP粘包解决方法

尽管TCP网络粘包和拆包的原因比较简单,但是要解决粘包和拆包,需要从下列几个方面去做工作:

(1)短连接方法——每次发数之前建立连接,数据发送完成后撤销连接,这样就不会形成粘包;

(2)发送端方法——发送端强制取消数据缓冲,接收端优化、精简接收进/线程或网络通信模型,提高报文接收效率;

(3)格式数据方法——采用有格式报文结构,接收端采用阻塞方法分段读取数据或使用数据缓存+组包法实现数据还原。

4.1短连接方式

在每次需要发送报文时,才与对方建立TCP连接,报文发送完成后即关闭连接。因为每次只发送一个报文,所以不会出现粘包现象。这种方法仅仅适用于客户端向服务器发送信息、服务器无反馈的场合。

4.2发送端方法

对于发送端引起的粘包,用户可通过编程设置来避免,TCP提供了强制数据立即传送的push操作指令,TCP收到该操作指令后,立即将本段数据发送出去,而不必等待发送缓冲区满。

4.2.1Nagle算法

Nagle算法最早是由John Nagle在1984年提出的[3],它要求在一个TCP连接上最多只能有一个未被确认的未完成的小分组,在该分组的确认到达之前不能发送其他的小分组。Nagle算法的优点是确认到达得越快,数据也就发送得越快。而在希望减少微小分组数目的低速广域网上,则会发送更少的分组[4]。这正是造成发送端数据粘包的原因。

4.2.2关闭Nagle算法

局域网内一般不会出现拥塞,微小分组(tinygram)通常也不会引起麻烦[3],因此可以关闭局域网中的Nagle算法。Socket API提供了关闭Nagle算法的选项,可以避免发送方引起的粘包。具体代码如下:

……

DWORDdwErrorCode = 0;

BOOLbSet = TRUE;

dwErrorCode =setsockopt(m_hSocket,IPPROTO_TCP,TCP_NODELAY,(char*)&bSet,sizeof(BOOL));

if(dwErrorCode==SOCKET_ERROR)

{

//错误处理

……

关键词是文献内容的高度浓缩和精炼,其涌现的频次越高,表明其表达的研究主题热度越高,而高频关键词集中体现的是某研究领域的研究热点和趋势。此外,本部分主要分析指标为关键词频次和中心度,中心度表示在网络中节点的关键性作用,直接反映了对应关键词在整个研究网络中媒介能力以及资源调控的支点。

}

……

4.3格式数据方法

格式数据方法是通信双方约定信息格式,接收端的网络读取模型或数据处理模型根据数据边界特征还原数据包的一种方法,包括分段读取法和组包法。组包法是在数据边界特征的基础上,充分利用数据缓冲实现数据边接收边还原。它属于有界数据方法的一种,设置数据结束符与其类似。为了说明下列问题,我们定义报文头格式如下:

typedef struct tagFrameHead

{

DWORDm_dwTime;// 生成时间

DWORDm_dwSource;// 来源

DWORDm_dwSize;// 长度

}FRAMEHEAD。

4.3.1分段读取法

分段读取法是利用Socket应用程序编程接口(Application Programming Interface,API)以同步读取的方式,将报文按照结构定义人为分两次读取的方法:

(1)第一次,仅仅读取16个字节(报头长度),获取报头中信息实际长度;

(2)第二次读取长度为信息实际长度(报文信息内容),通过这种手段来避免粘包。

这种方法实现简单,分段读取的代码片段如下:

……

int nFHeadLen = sizeof(FRAMEHEAD);

int nRetLen = 0;

nRetLen = recv(m_hSocket,(char*)&m_cBuffRcv[0],nFHeadLen,0);

if(nRetLen <= 0)

{

……//连接断开,重连或做退出处理

continue;

}

//接收到数据进行相应处理

if(nRetLen == nFHeadLen)

{

// 获取信息字段长度

int nLen = *(UINT*)&m_cBuffRcv[12];

int nRet = 0;

// 继续读取数据信息字段内容

nRet = recv(m_hSocket,(char*)&m_cBuffRcv[nFHeadLen],nLen,0);

if(nRet == *(UINT*)&m_cBuffRcv[12])

{

nRetLen += nLen;

}

}

// 全帧信息处理

……

4.3.2组包法

组包法也是由接收方控制的方法,该方法的主要思想是在接收预处理单元定义一个数据接收缓冲区,一边接收一边判断缓冲区数据是否满足包头大小,如果满足包头大小,则判断缓冲区剩下数据是否满足包体大小,如果满足则提取数据进行处理。它的原理和分段读取法是一致的,但是组包法更加灵活,可以充分运用各种网络编程模型,特别是非阻塞异步I/O方式,能够提高网络通信的效率。组包法的编程模型和主要处理流程参见图5。

图5 组包法编程模型和主要处理流程Fig.5 Packet programming model and prime processing flow

5 测试情况说明

5.1测试环境

在测试中,机器B为服务端,等待连接并接收数据;机器A为客户端,发起连接并发送数据。机器A、B具体配置参见表1。

表1 测试用计算机配置表Tab.1 Configuration of the test computer

5.2短连接测试

机器A在每次发送数据前,先连接到服务器(机器B),而后发送一包数据,数据发送完毕即刻关闭连接,在这种情况下不会出现网络粘包现象。但是这种方法只有在数据单向传输时具有可操作性,而且连接的瞬时建立不论对服务端还是客户端程序的可靠性都是一种挑战。特别是对实时控制系统,瞬时连接引入了整个系统的不确定性。

5.3发送端方法测试

图6是发送端禁用Nagle算法前后用WireShark工具软件的抓包比对结果。虽然在关闭Nagle算法后进行的实验中没有出现粘包,但该方法只是解决了发端不粘包的问题,而当发端发送频率较高,或由于网络突发使某个时间段数据包到达收端较快时,就会出现收端来不及接收而导致的网络粘包,因此该方法不能完全解决粘包问题。

(a)开启Nagle算法时Wireshark抓包结果

(b)关闭Nagle算法时Wireshark抓包结果图6 发送端禁用Nagle算法前后Wireshark抓包结果Fig.6 Wireshark capture results before and after Nagle algorithm is closed

5.4格式数据方法测试

不论发端是否禁止Nagle算法,也不论收端采用分段读取法还是组包法,都能正确的还原数据包,没有出现粘包现象。但是分段读取法使得网络接收和信息处理的耦合比较大,而采用组包法,网络通信可以采用通用的模型,组包由数据预处理实现,提高了软件复用及处理效率。

6 结 论

本文对TCP协议的特点及编程模型进行了分析,研究了在不考虑MSS分段和MTU分片情况下产生网络粘包、拆包的原因,并给出了针对性的解决方法。从测试情况可以看出:

(1)短连接虽然也可以解决粘包问题,瞬时的连接对双方软件的可靠性要求比较高,不建议使用;

(2)关闭Nagle算法只能避免发送方引起的粘包,不能解决全系统的问题,但是在局域网内,可以在发端关闭Nagle算法以提高信息发送的实时性;

(3)采用格式数据的方法需要收端进行分段读取或组包还原,无论哪种方法,都可以有效解决网络粘包问题,从软件结构上讲,笔者更倾向于组包法。

另外,由于TCP协议本身的局限,在实时控制系统中使用TCP协议时,用户需要进行保活探查,以保证需要发送数据时连接可用。

[1] 竹下隆史,村山公保,荒井透,等.图解TCP/IP[M].乌尼日其其格,译. 5版.北京:人民邮电出版社,2013.

[2] 王雷. TCP/IP网络编程技术基础[M].北京:清华大学出版社,2012.

[3] SNADER J C. TCP/IP高效编程——改善网络程序的44个技巧[M].陈涓,赵振平,译.北京:人民邮电出版社,2011.

[4] STEVENS W R. TCP/IP协议详解卷1:协议[M].范建华,胥光辉,张涛,等,译.北京:机械工业出版社,2014.

[5] 李卫平,党琦,陈刚. 自适应双平面信息无缝传输实现方法研究[J].飞行器测控学报,2011,30(2):33-36. LI Weiping,DANG Qi,CHEN Gang. Adaptive method of double plane information non-loss transmission[J].Journal of Spacecraft TT&C Technology,2011,30(2):33-36.(in Chinese)

[6] COMER D E. 用TCP/IP进行网际互连第1卷:原理、协议与结构[M].林瑶,蒋慧,杜蔚轩,等,译. 4版.北京:电子工业出版社,2001.

[7] 中嶋谦互. 网络游戏核心技术与实战[M].毛姝文,田剑,译. 北京:人民邮电出版社,2011.

[8] 于志坚.我国航天测控系统的现状与发展[J].中国工程科学,2006,8(10):42-46. YU Zhijian. Status quo and development of spaceflight TT&C systems[J].Engineering Science,2006,8(10):42-46.(in Chinese)

[9] 党琦,王崇晖,董广然,等. 一种航天测控站数据传输处理系统构件化实现[J].电讯技术,2015,55(10):1141-1145. DANG Qi,WANG Chonghui,DONG Guangran,et al.A component-based realization on the data transmission & processing system in aerospace TT&C stations[J].Telecommunication Engineering,2015,55(10):1141-1145.(in Chinese)

[10] 王玮,和应民. 测控网中TCP协议的研究与仿真[J].应用科技,2008,35(4):48-52. WANG Wei,HE Yingmin. Research and simulation of TCP in the space TT&C net[J].Applied Science and Technology,2008,35(4):48-52.(in Chinese)

[11] 刘军,王轶,马明,等. 典型测控系统自动化运行的设计与实现[J].电讯技术,2006,46(5):197-199. LIU Jun,WANG Yi,MA Ming,et al.Automatically running a representative TT&C system:design and realization[J].Telecommunication Engineering,2006,46(5):197-199.(in Chinese)

[12] 王忠贵. 交会对接任务天基双目标测控通信设计[J].飞行器测控学报,2012,31(3):1-5. WANG Zhonggui. Design of a space-based dual-object TT&C system for China’s first rendezvous and docking mission[J].Journal of Spacecraft TT&C Technology,2012,31(3):1-5.(in Chinese)

[13] 刘建平,刘帆,谷小松,等. 面向编队卫星群的单波束多目标测控资源调度方法[J].宇航动力学学报,2011,1(2):87-92. LIU Jianping,LIU Fan,GU Xiaosong,et al.A scheduling method of single-beam multi-target mechanical scanning TT&C resources for formation satellites cluster[J].Journal of Astrodynamics,2011,1(2):87-92.(in Chinese)

[14] 宋敬彬,孙海滨. Linux网络编程[M].北京:清华大学出版社,2010.

[15] TANENBAUM A S,WETHERALL D J. 计算机网络[M].严伟,潘爱民,译. 5版. 北京:清华大学出版社,2012.

[16] FOROUZAN B A. TCP/IP协议族[M].王海,张娟,朱晓阳,等,译. 4版.北京:清华大学出版社,2011.

[17] 李林峰. Netty权威指南[M].北京:电子工业出版社,2014.

MethodsforSolvingTCPStickyPacketProbleminMulti-objectControlSystems

DANG Qi1,2,GOU Rujun1,3,DONG Guangran1,2,JI Maopeng1,2

(1.Xi′an Satellite Control Center,Xi′an 710043,China; 2.Key Laboratory for Fault Diagnosis & Maintenance of Spacecraft in Orbit,Xi′an 710043,China; 3.State Key Laboratory of Astronautic Dynamics,Xi′an 710043,China)

It′s easy to cause the problem of network data sticking when the tracking,telemetry and command(TT&C) equipment works in multi-channel and parallel state by using transmission control protocol/Internet protocol(TCP/IP) as the basis protocol.According to the analysis of TCP features,through discussion of the TCP program model and stream delivery model,the network data features have being researched when TCP data stream stick happens,and the cause of data stream stick is analyzed. Three methods for solving the problem are given by short links,transmitter side process and format data packet. The test results have verified the adaptability of three methods and the effectiveness of rebuilding TCP network data packet by using the format data method. The research provides the reference for the software development based on TCP.

multi-object control system;TCP data stream;sticky packet;network programming

date:2016-12-13;Revised date:2017-04-11

10.3969/j.issn.1001-893x.2017.09.018

党琦,苟茹君,董广然,等.多目标控制系统中TCP粘包问题的解决方法[J].电讯技术,2017,57(9):1082-1087.[DANG Qi,GOU Rujun,DONG Guangran,et al.Methods for solving TCP sticky packet problem in multi-object control systems[J].Telecommunication Engineering,2017,57(9):1082-1087.]

TP274;V55

:A

:1001-893X(2017)09-1082-06

党琦(1972—),男,陕西富平人,1994年于西北大学获学士学位,2006年于西北工业大学获硕士学位,现为高级工程师,主要从事计算机网络、应用软件技术等方面的研究;

Email:dangqifuping@163.com

苟茹君(1971—),女,陕西西安人,高级工程师,主要从事遥测信号处理及应用软件技术研究;

董广然(1976—),男,河北唐海人,工程师,主要从事计算机应用软件技术研究;

季茂鹏(1983—),男,山东泰安人,工程师,主要从事计算机应用软件技术研究。

2016-12-13;

:2017-04-11

**通信作者:dangqifuping@163.com Corresponding author:dangqifuping@163.com

猜你喜欢
报文编程算法
基于J1939 协议多包报文的时序研究及应用
编程,是一种态度
元征X-431实测:奔驰发动机编程
CTCS-2级报文数据管理需求分析和实现
编程小能手
纺织机上诞生的编程
基于MapReduce的改进Eclat算法
Travellng thg World Full—time for Rree
浅析反驳类报文要点
进位加法的两种算法