Tcp的粘包和半包问题及解决方案

目录

粘包:

半包:

应用进程如何解读字节流?如何解决粘包和半包问题?

①:固定长度

②:分隔符

③:固定长度字段存储内容的长度信息


粘包:

一次接收到多个消息,粘包

应用进程无法从一个粘包中解析出数据

出现粘包的原因:

①:发送方每次写入数据<内核缓冲区大小;导致多个小的数据包一次性放到一个缓冲区中一起发送了,接收端接收到数据就对导致粘包。

②:接收方读取内核缓冲区不够及时。Tcp接收数据的三个队列并不是实时的,有可能会延时,可能会导致读到多个消息,粘包了。

半包:

一个消息分多次接收,半包

应用进程无法从一个半包中解析出数据

出现半包的原因:

①:发送方写入数据>内核缓冲区大小;

②:发送方数据大小大于MTU,必须拆包。

应用进程是无法从一个粘包、半包中解析出数据的,根本原因是:Tcp是面向字节的,消息无边界的。

应用进程如何解读字节流?如何解决粘包和半包问题?

找出消息的边界

①:固定长度

简单、但是浪费空间,不推荐。

(比如规定每10个字节表示一个消息,但是客户端发送的一个消息里只有1个字节那么剩下的字节就是浪费的,需要补空或者补0)

②:分隔符

简单,空间也不浪费,推荐使用

缺点:数据内容本身出现分隔符时,需要转义,所以需要扫描内容

典型的例子就是HTTP报文:

③:固定长度字段存储内容的长度信息

接收端先解析固定字段,获取长度,然后根据长度读取数据内容。

可以精确定位数据内容,内容不需要转义,推荐

缺点:数据内容长度有限制,需要提前知道可能的最长的消息的字节数

相关推荐
zh_xuan几秒前
go语言常用语法
开发语言·golang
爱装代码的小瓶子8 分钟前
【C++与Linux进阶】详解信号的捕获:内核态和用户态的转换
linux·开发语言·c++
adore.9688 分钟前
3.09 复试学习
c++·学习·算法
java1234_小锋13 分钟前
Java高频面试题:Mysql里where1=1会不会影响性能?
java·开发语言
小白学大数据21 分钟前
对比分析:Python爬虫模拟登录的3种主流实现方式
开发语言·爬虫·python·数据分析
guygg8825 分钟前
使用Zernike多项式进行光学镜面像差拟合的MATLAB实现
开发语言·matlab
krack716x30 分钟前
第1天:面向对象与基础语法
java·开发语言
FriendshipT36 分钟前
YOLOs-CPP:一个免费开源的YOLO全系列C++推理库(以YOLO26为例)
c++·人工智能·yolo·目标检测·分类·开源
不想看见40437 分钟前
Shuffle an Array随机与取样--力扣101算法题解笔记
开发语言·c++·算法
bu_shuo39 分钟前
Microsoft Visual C++的相关文件.sln
开发语言·c++·vc2010