办理TCP网络传输“粘包”问题
当前位置:以往代写 > C/C++ 教程 >办理TCP网络传输“粘包”问题
2019-06-13

办理TCP网络传输“粘包”问题

办理TCP网络传输“粘包”问题

副标题#e#

当前在网络传输应用中,遍及回收的是TCP/IP通信协议及其尺度的socket应用开拓编程接口(API)。TCP/IP传输层有两个并列的协议:TCP和UDP。个中TCP(transport control protocol,传输节制协议)是面向毗连的,提供高靠得住性处事。UDP(user datagram protocol,用户数据报协议)是无毗连的,提供高效率处事。在实际工程应用中,对靠得住性和效率的选择取决于应用的情况和需求。一般环境下,普通数据的网络传输回收高效率的udp,重要数据的网络传输回收高靠得住性的TCP。

在应用开拓进程中,笔者发明基于TCP网络传输的应用措施有时会呈现粘包现象(即发送方发送的若干包数据到吸收方吸收时粘成一包)。针对这种环境,我们举办了专题研究与尝试。本文重点阐明白TCP网络粘包问题,并团结尝试功效提出了办理该问题的对策和要领,供有关工程技能人员参考。

一、TCP协议简介

TCP是一个面向毗连的传输层协议,固然TCP不属于iso拟定的协议集,但由于其在贸易界和家产界的乐成应用,它已成为事实上的网络尺度,遍及应用于各类网络主机间的通信。

作为一个面向毗连的传输层协议,TCP的方针是为用户提供靠得住的端到端毗连,担保信息有序无误的传输。它除了提供根基的数据传输成果外,还为担保靠得住性回收了数据编号、校验和计较、数据确认等一系列法子。它对传送的每个数据字节都举办编号,并请求吸收方回传确认信息(ack)。发送方假如在划定的时间内没有收到数据确认,就重传该数据。数据编号使吸收方可以或许处理惩罚数据的失序和反复问题。数据误码问题通过在每个传输的数据段中增加校验和予以办理,吸收方在吸收到数据后查抄校验和,若校验和有误,则扬弃该有误码的数据段,并要求发送方重传。流量节制也是担保靠得住性的一个重要法子,若无流控,大概会因吸收缓冲区溢出而丢失大量数据,导致很多重传,造成网络拥塞恶性轮回。TCP回收可变窗口举办流量节制,由吸收方节制发送方发送的数据量。

TCP为用户提供了高靠得住性的网络传输处事,但靠得住性保障法子也影响了传输效率。因此,在实际工程应用中,只有要害数据的传输才回收TCP,而普通数据的传输一般回收高效率的udp。

二、粘包问题阐明与对策

TCP粘包是指发送方发送的若干包数据到吸收方吸收时粘成一包,从吸收缓冲区看,后一包数据的头紧接着前一包数据的尾。

呈现粘包现象的原因是多方面的,它既大概由发送方造成,也大概由吸收方造成。发送方引起的粘包是由TCP协议自己造成的,TCP为提高传输效率,发送方往往要收集到足够多的数据后才发送一包数据。若持续屡次发送的数据都很少,凡是TCP会按照优化算法把这些数据合成一包后一次发送出去,这样吸收方就收到了粘包数据。吸收方引起的粘包是由于吸收方用户历程不实时吸收数据,从而导致粘包现象。这是因为吸收方先把收到的数据放在系统吸收缓冲区,用户历程从该缓冲区取数据,若下一包数据达到时前一包数据尚未被用户历程取走,则下一包数据放到系统吸收缓冲区时就接到前一包数据之后,而用户历程按照预先设定的缓冲区巨细从系统吸收缓冲区取数据,这样就一次取到了多包数据(图1所示)。

治理TCP网络传输“粘包”问题

图1

治理TCP网络传输“粘包”问题

图2

治理TCP网络传输“粘包”问题

图3

粘包环境有两种,一种是粘在一起的包都是完整的数据包(图1、图2所示),另一种环境是粘在一起的包有不完整的包(图3所示),此处假设用户吸收缓冲区长度为m个字节。

不是所有的粘包现象都需要处理惩罚,若传输的数据为不带布局的持续流数据(如文件传输),则不必把粘连的包分隔(简称分包)。但在实际工程应用中,传输的数据一般为带布局的数据,这时就需要做分包处理惩罚。

在处理惩罚定长布局数据的粘包问题时,分包算法较量简朴;在处理惩罚不定长布局数据的粘包问题时,分包算法就较量巨大。出格是如图3所示的粘包环境,由于一包数据内容被分在了两个持续的吸收包中,处理惩罚起来难度较大。实际工程应用中应只管制止呈现粘包现象。

为了制止粘包现象,可采纳以下几种法子。一是对付发送方引起的粘包现象,用户可通过编程配置来制止,TCP提供了强制数据当即传送的操纵指令push,TCP软件收到该操纵指令后,就当即将本段数据发送出去,而不必期待发送缓冲区满;二是对付吸收方引起的粘包,则可通过优化措施设计、精简吸收历程事情量、提高吸收历程优先级等法子,使其实时吸收数据,从而只管制止呈现粘包现象;三是由吸收方节制,将一包数据按布局字段,工钱节制分多次吸收,然后归并,通过这种手段来制止粘包。

#p#分页标题#e#

以上提到的三种法子,都有其不敷之处。第一种编程配置要领固然可以制止发送方引起的粘包,但它封锁了优化算法,低落了网络发送效率,影响应用措施的机能,一般不发起利用。第二种要领只能淘汰呈现粘包的大概性,但并不能完全制止粘包,当发送频率较高时,或由于网络突发大概使某个时间段数据包达到吸收方较快,吸收方照旧有大概来不及吸收,从而导致粘包。第三种要领固然制止了粘包,但应用措施的效率较低,对及时应用的场所不适合。

一种较量周全的对策是:吸收方建设一预处理惩罚线程,对吸收到的数据包举办预处理惩罚,将粘连的包分隔。对这种要领我们举办了尝试,证明是高效可行的。

三、编程与实现

1.实现框架

尝试网络通信措施回收TCP/IP协议的socket api编程实现。socket是面向客户机/处事器模子的。TCP实现框架如图4所示。

治理TCP网络传输“粘包”问题

图4


#p#副标题#e#

2.尝试硬件情况:

处事器:pentium 350 微机

客户机:pentium 166微机

网络平台:由10兆共享式hub毗连而成的局域网

3.尝试软件情况:

操纵系统:windows 98

编程语言:visual c++ 5.0

4.主要线程

编程回收多线程方法,处事器端共有两个线程:发送数据线程、发送统计显示线程。客户端共有三个线程:吸收数据线程、吸收预处理惩罚粘包线程、吸收统计显示线程。个中,发送和吸收线程优先级设为thread_priority_time_critical(最高优先级),预处理惩罚线程优先级为thread_priority_above_normal(高于普通优先级),显示线程优先级为thread_priority_normal(普通优先级)。

尝试发送数据的数据布局如图5所示:

治理TCP网络传输“粘包”问题

图5

5.分包算法

针对三种差异的粘包现象,分包算法别离采纳了相应的办理步伐。其根基思路是首先将待处理惩罚的吸收数据流(长度设为m)强行转换成预定的布局数据形式,并从中取出布局数据长度字段,即图5中的n,尔后按照n计较获得第一包数据长度。

1)若n<m,则表白数据流包括多包数据,从其头部截取n个字节存入姑且缓冲区,剩余部门数据依此继承轮回处理惩罚,直至竣事。

2)若n=m,则表白数据流内容刚好是一完整布局数据,直接将其存入姑且缓冲区即可。

3)若n>m,则表白数据流内容尚不足组成一完整布局数据,需留待与下一包数据归并后再行处理惩罚。

对分包算法详细内容及软件实现有乐趣者,可与作者接洽。

四、尝试功效阐明

尝试功效如下:

1.在上述尝试情况下,当发送方持续发送的若干包数据长度之和小于1500b时,常会呈现粘包现象,吸收方经预处理惩罚线程处理惩罚后能正确解开粘在一起的包。若措施中配置了“发送不延迟”:(setsockopt (socket_name,ipproto_tcp,tcp_nodelay,(char *) &on,sizeof on) ,个中on=1),则不存在粘包现象。

2.当发送数据为每包1kb~2kb的不定长数据时,若发送隔断时间小于10ms,偶然会呈现粘包,吸收方经预处理惩罚线程处理惩罚后能正确解开粘在一起的包。

3.为测定处理惩罚粘包的时间,发送方依次轮回发送长度为1.5kb、1.9kb、1.2kb、1.6kb、1.0kb数据,共计1000包。为制造粘包现象,吸收线程每次吸收前都期待10ms,吸收缓冲区设为5000b,功效吸收方收到526包数据,个中长度为5000b的有175包。经预处理惩罚线程处理惩罚可获得1000包正确数据,粘包处理惩罚总时间小于1ms。

尝试功效表白,TCP粘包现象确实存在,但可通过吸收方的预处理惩罚予以办理,并且处理惩罚时间很是短(尝试中1000包数据总共处理惩罚时间不到1ms),险些不影响应用措施的正常事情。

    关键字:

在线提交作业