解决 TCP 网络传输“粘包”问题
2012-07-18 10:18:56 我来说两句
收藏 我要投稿
解决 TCP 网络传输“粘包”问题
当前在网络传输应用中,广泛采用的是 TCP/IP 通信协议及其标准的 socket 应用
开发编程接口(API)。TCP/IP 传输层有两个并列的协议:TCP 和 UDP。其中
TCP(transport control protocol,传输控制协议)是面向连接的,提供高可靠
性服务。UDP(user datagram protocol,用户数据报协议)是无连接的,提供
高效率服务。在实际工程应用中,对可靠性和效率的选择取决于应用的环境和需求。
一般情况下,普通数据的网络传输采用高效率的 udp,重要数据的网络传输采用高
可靠性的 TCP。www.2cto.com
在应用开发过程中,笔者发现基于 TCP 网络传输的应用程序有时会出现粘包
现象(即发送方发送的若干包数据到接收方接收时粘成一包)。针对这种情况,我
们进行了专题研究与实验。本文重点分析了 TCP 网络粘包问题,并结合实验结果
提出了解决该问题的对策和方法,供有关工程技术人员参考。
一、TCP 协议简介
TCP 是一个面向连接的传输层协议,虽然 TCP 不属于 iso 制定的协议集,但
由于其在商业界和工业界的成功应用,它已成为事实上的网络标准,广泛应用于各
种网络主机间的通信。
作为一个面向连接的传输层协议,TCP 的目标是为用户提供可靠的端到端连接,
保证信息有序无误的传输。它除了提供基本的数据传输功能外,还为保证可靠性采
用了数据编号、校验和计算、数据确认等一系列措施。它对传送的每个数据字节都
进行编号,并请求接收方回传确认信息(ack)。发送方如果在规定的时间内没有
收到数据确认,就重传该数据。数据编号使接收方能够处理数据的失序和重复问题。
数据误码问题通过在每个传输的数据段中增加校验和予以解决,接收方在接收到数
据后检查校验和,若校验和有误,则丢弃该有误码的数据段,并要求发送方重传。
流量控制也是保证可靠性的一个重要措施,若无流控,可能会因接收缓冲区溢出而
丢失大量数据,导致许多重传,造成网络拥塞恶性循环。TCP 采用可变窗口进行流
量控制,由接收方控制发送方发送的数据量。www.2cto.com
TCP 为用户提供了高可靠性的网络传输服务,但可靠性保障措施也影响了传输
效率。因此,在实际工程应用中,只有关键数据的传输才采用 TCP,而普通数据的
传输一般采用高效率的 udp。
二、粘包问题分析与对策
TCP 粘包是指发送方发送的若干包数据到接收方接收时粘成一包,从接收缓冲
区看,后一包数据的头紧接着前一包数据的尾。
出现粘包现象的原因是多方面的,它既可能由发送方造成,也可能由接收方造
成。发送方引起的粘包是由 TCP 协议本身造成的,TCP 为提高传输效率,发送方
往往要收集到足够多的数据后才发送一包数据。若连续几次发送的数据都很少,通
常 TCP 会根据优化算法把这些数据合成一包后一次发送出去,这样接收方就收到