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

目录

粘包:

半包:

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

①:固定长度

②:分隔符

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


粘包:

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

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

出现粘包的原因:

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

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

半包:

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

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

出现半包的原因:

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

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

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

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

找出消息的边界

①:固定长度

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

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

②:分隔符

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

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

典型的例子就是HTTP报文:

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

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

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

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

相关推荐
雪碧透心凉_30 分钟前
while 循环与循环嵌套
开发语言·python
Molesidy33 分钟前
【GUI】【AWTK】基于开阳平台的GUI界面设计环境搭建
linux·gui·awtk
乐观勇敢坚强的老彭36 分钟前
信奥C++一维数组笔记
开发语言·c++·笔记
码上有光38 分钟前
异常和智能指针
java·大数据·c++·servlet·异常·智能指针
RisunJan44 分钟前
Linux命令-semanage(SELinux 策略管理)
linux·运维·服务器
这就是佬们吗44 分钟前
Python入门⑤-异常处理、文件操作与实战项目
开发语言·数据库·python·算法·pycharm
王维同学1 小时前
[原创][Windows C++]Explorer Shell 扩展、图标覆盖与 COM 服务器定位
c++·windows·注册表
流浪0011 小时前
Linux系统篇 21:文件(五)——动静态库、ELF 底层原理全解
linux·运维·服务器
code_pgf1 小时前
C++ 工程架构设计规范
c++·机器人
asdzx671 小时前
Python PDF 拆分实战指南:单页拆分与按需页码范围拆分
开发语言·python·pdf