当前位置:七道奇文章资讯编程技术VC/C++编程
日期:2011-03-22 13:55:00  来源:本站整理

办理TCP网络传输"粘包"问题[VC/C++编程]

赞助商链接



  本文“办理TCP网络传输"粘包"问题[VC/C++编程]”是由七道奇为您精心收集,来源于网络转载,文章版权归文章作者所有,本站不对其观点以及内容做任何评价,请读者自行判断,以下是其具体内容:

当前在网络传输利用中,遍及采取的是TCP/IP通信协议及其尺度的socket利用开辟编程接口(API).TCP/IP传输层有两个并列的协议:TCP和UDP.此中TCP(transport control protocol,传输掌握协议)是面向衔接的,供应高坚固性服务.UDP(user datagram protocol,用户数据报协议)是无衔接的,供应高效率服务.在实际工程利用中,对坚固性和效率的挑选取决于利用的环境和需求.普通情形下,普通数据的网络传输采取高效率的udp,重要数据的网络传输采取高坚固性的TCP.

在利用开辟历程中,笔者发现基于TCP网络传输的利用程序有时会呈现粘包现象(即发送方发送的若干包数据到接纳方接纳时粘成一包).针对这种情形,我们举行了专题研究与实行.本文重点解析了TCP网络粘包问题,并结合实行后果提出了办理该问题的对策和办法,供有关工程技术人员参考.

1、TCP协议简介

TCP是一个面向衔接的传输层协议,固然TCP不属于iso拟定的协议集,但由于其在商业界和产业界的成功利用,它已成为事实上的网络尺度,遍及利用于各种网络主机间的通信.

作为一个面向衔接的传输层协议,TCP的目标是为用户供应坚固的端到端衔接,保证信息有序无误的传输.它除了供应基本的数据传输功效外,还为保证坚固性采取了数据编号、校验和计算、数据确认等一系列办法.它对传送的每个数据字节都举行编号,并恳求接纳方回传确认信息(ack).发送方假如在规定的时间内没有收到数据确认,就重传该数据.数据编号使接纳方可以处理数据的失序和反复问题.数据误码问题通过在每个传输的数据段中增添校验和予以办理,接纳方在接纳到数据后查抄校验和,若校验和有误,则丢弃该有误码的数据段,并要求发送方重传.流量掌握也是保证坚固性的一个重要办法,若无流控,大概会因接纳缓冲区溢出而丧失大量数据,招致很多重传,造成网络堵塞恶性循环.TCP采取可变窗口举行流量掌握,由接纳方掌握发送方发送的数据量.

TCP为用户供应了高坚固性的网络传输服务,但坚固性保障办法也影响了传输效率.因此,在实际工程利用中,只有关键数据的传输才采取TCP,而普通数据的传输普通采取高效率的udp.

2、粘包问题解析与对策

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

呈现粘包现象的缘由是多方面的,它既大概由发送方造成,也大概由接纳方造成.发送方惹起的粘包是由TCP协议本身造成的,TCP为提高传输效率,发送方常常要汇集到充足多的数据后才发送一包数据.若持续几次发送的数据都很少,普通TCP会按照优化算法把这些数据合成一包后一次发送出去,这样接纳方就收到了粘包数据.接纳方惹起的粘包是由于接纳方用户进程不及时接纳数据,从而招致粘包现象.这是因为接纳方先把收到的数据放在系统接纳缓冲区,用户进程从该缓冲区取数据,若下一包数据到达时前一包数据还没有被用户进程取走,则下一包数据放到系统接纳缓冲区时就接到前一包数据之后,而用户进程按照预先设定的缓冲区大小从系统接纳缓冲区取数据,这样就一次取到了多包数据(图1所示).

图1

图2

图3

粘包情形有两种,一种是粘在一同的包都是完好的数据包(图1、图2所示),另一种情形是粘在一同的包有不完好的包(图3所示),此处假定用户接纳缓冲区长度为m个字节.

不是全部的粘包现象都需求处理,若传输的数据为不带构造的持续流数据(如文件传输),则没必要把粘连的包脱离(简称分包).但在实际工程利用中,传输的数据普通为带构造的数据,这时就需求做分包处理.

在处理定长构造数据的粘包问题时,分包算法对比简单;在处理不定长构造数据的粘包问题时,分包算法就对比复杂.分外是如图3所示的粘包情形,由于一包数据内容被分在了两个持续的接纳包中,处理起来难度较大.实际工程利用中应尽大概避免呈现粘包现象.

为了避免粘包现象,可采纳以下几种办法.一是关于发送方惹起的粘包现象,用户可通过编程设置来避免,TCP供应了强迫数据当即传送的操作指令push,TCP软件收到该操作指令后,就立行将本段数据发送出去,而没必要等候发送缓冲区满;二是关于接纳方惹起的粘包,则可通过优化程序计划、精简接纳进程工作量、提高接纳进程优先级等办法,使其及时接纳数据,从而尽大概避免呈现粘包现象;三是由接纳方掌握,将一包数据按构造字段,人为掌握分多次接纳,然后归并,通过这种手段来避免粘包.

以上提到的三种办法,都有其不足之处.第一种编程设置办法固然可以避免发送方惹起的粘包,但它关闭了优化算法,降低了网络发送效率,影呼利用程序的性能,普通不倡议利用.第二种办法只能削减呈现粘包的大概性,但并不能完好避免粘包,当发送频率较高时,或由于网络突发大概使某个时间段数据包到达接纳方较快,接纳方还是有大概来不及接纳,从而招致粘包.第三种办法固然避免了粘包,但利用程序的效率较低,对及时利用的场所不合适.

一种对比全面的对策是:接纳方成立一预处理线程,对接纳到的数据包举行预处理,将粘连的包脱离.对这种办法我们举行了实行,证明是高效可行的.

3、编程与实现

1.实现框架

实行网络通信程序采取TCP/IP协议的socket api编程实现.socket是面向客户机/服务器模子的.TCP实现框架如图4所示.

图4


  以上是“办理TCP网络传输"粘包"问题[VC/C++编程]”的内容,如果你对以上该文章内容感兴趣,你可以看看七道奇为您推荐以下文章:

  • 办理TCP网络传输"粘包"问题
  • 本文地址: 与您的QQ/BBS好友分享!
    • 好的评价 如果您觉得此文章好,就请您
        0%(0)
    • 差的评价 如果您觉得此文章差,就请您
        0%(0)

    文章评论评论内容只代表网友观点,与本站立场无关!

       评论摘要(共 0 条,得分 0 分,平均 0 分) 查看完整评论
    Copyright © 2020-2022 www.xiamiku.com. All Rights Reserved .