网络编程-SOCKET开发之----2. TCP粘包现象产生分析

本文详细解释了TCP协议中粘包现象的概念及其产生的原因。粘包是指多个数据包被接收方误认为是一个整体的现象,主要原因是接收方无法区分数据包边界。文章还介绍了操作系统如何通过缓存机制导致粘包的发生。

1. 粘包现象及产生原因

1)概念

TCP协议中,发送方发送的若干个包数据到接收方接收时粘成一包。发送方粘包:发送方把若干个要发送的数据包封装成一个包,一次性发送,减少网络IO延迟;接收方粘包:接收方接到的数据是若干个数据包个封装成的,而不是一个一个的数据包接收到。

一般实际开发中所说的粘包问题都是指接收方粘包现象。

2)原因分析

我们知道,我们写的应用程序是无法直接操作硬件,都是通过调用操作系统给应用程序封装的接口间接来操作硬件。

如上图所示,一个C/S系统,当你的程序要给要给远程发送数据时,其实是先把数据从用户态(程序内存)拷贝到内核态(系统内存)。为了提高传输效率,此时系统内存不会立即把数据发往接收端,TCP socket会根据优化算法(Nagle算法),将多个时间间隔较小且数据量较小的数据合并成大的数据块,然后封包,一次性从管道发出去。

对于接收方,操作系统内存会先接收到这个数据块,并缓存在内存中,然后应用程序从操作系统内存中提取数据。然而,由于应用程序不知道这个数据块中每个小数据包之间的界限,不知道一次性取多少数据合适,所以有可能这次只取了半个数据包,下次取了3个数据包,这就产生了粘包问题。

剩余的数据会继续存在缓存中,等待应用程序的下次拷贝。此时,发送方会继续从管道中发送数据过来,接收方收到后会与之前操作系统内存中的数据缓存在一起,等待应用程序提取。

TCP协议是面向流的协议,所以接收端接收到的数据是一个整体(可能由多个包合成),或着说是一个流,每个小数据包之间是无边界的,这也是容易出现粘包问题的原因。因此若要解决此问题,需提供科学的拆包机制,把一个大数据包中的小数据包一个个的解封出来。

转载于:https://www.cnblogs.com/miaoning/p/10632332.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值