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

目录

粘包:

半包:

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

①:固定长度

②:分隔符

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


粘包:

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

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

出现粘包的原因:

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

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

半包:

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

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

出现半包的原因:

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

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

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

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

找出消息的边界

①:固定长度

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

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

②:分隔符

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

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

典型的例子就是HTTP报文:

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

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

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

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

相关推荐
吃好睡好便好5 小时前
用while循环语句求和
开发语言·学习·算法·matlab·信息可视化
TechWayfarer5 小时前
查询IP所在地的3种方案:从API到离线库,风控场景怎么选?
开发语言·网络·python·网络协议·tcp/ip
摇滚侠5 小时前
Java 零基础全套教程,集合框架,笔记 153-163
java·开发语言·笔记
程序员榴莲5 小时前
Python 单例模式
开发语言·python·单例模式
hj2862516 小时前
Linux 磁盘管理 + 文件系统 + LVM 笔记整理
linux·运维
L、2186 小时前
CANN算子开发调试实战:从“Segmentation Fault“到定位根因的完整流程
java·开发语言
狗凯之家源码网6 小时前
基于PHP的多语言跨境电商B2B2C商城系统技术解析
开发语言·php
.YYY7 小时前
Linux--如何安装rockyLinux9虚拟机
linux
比特森林探险记7 小时前
go 语言中的context 解读和用法
开发语言·后端·golang
古城小栈7 小时前
Rust 调用 C 语言库 实战指南(企业级)
c语言·开发语言·rust