Tcp的粘包和半包问题及解决方案
目录
粘包:
半包:
应用进程如何解读字节流?如何解决粘包和半包问题?
①:固定长度
②:分隔符
③:固定长度字段存储内容的长度信息
粘包:
一次接收到多个消息,粘包
应用进程无法从一个粘包中解析出数据
出现粘包的原因:
①:发送方每次写入数据<内核缓冲区大小;导致多个小的数据包一次性放到一个缓冲区中一起发送了,接收端接收到数据就对导致粘包。
②:接收方读取内核缓冲区不够及时。Tcp接收数据的三个队列并不是实时的,有可能会延时,可能会导致读到多个消息,粘包了。
半包:
一个消息分多次接收,半包
应用进程无法从一个半包中解析出数据
出现半包的原因:
①:发送方写入数据>内核缓冲区大小;
②:发送方数据大小大于MTU,必须拆包。
应用进程是无法从一个粘包、半包中解析出数据的,根本原因是:Tcp是面向字节的,消息无边界的。
应用进程如何解读字节流?如何解决粘包和半包问题?
找出消息的边界
①:固定长度
简单、但是浪费空间,不推荐。
(比如规定每10个字节表示一个消息,但是客户端发送的一个消息里只有1个字节那么剩下的字节就是浪费的,需要补空或者补0)
②:分隔符

简单,空间也不浪费,推荐使用
缺点:数据内容本身出现分隔符时,需要转义,所以需要扫描内容
典型的例子就是HTTP报文:
③:固定长度字段存储内容的长度信息

接收端先解析固定字段,获取长度,然后根据长度读取数据内容。
可以精确定位数据内容,内容不需要转义,推荐
缺点:数据内容长度有限制,需要提前知道可能的最长的消息的字节数
相关文章:
Tcp的粘包和半包问题及解决方案
目录 粘包: 半包: 应用进程如何解读字节流?如何解决粘包和半包问题? ①:固定长度 ②:分隔符 ③:固定长度字段存储内容的长度信息 粘包: 一次接收到多个消息,粘包 应…...
路由的hash和history模式的区别
目录 ✅ 路由模式概述 一. 路由的hash和history模式的区别 1. hash模式 2. history模式 3. 两种模式对比 二. 如何获取页面的hash变化 ✅ 路由模式概述 单页应用是在移动互联时代诞生的,它的目标是不刷新整体页面,通过地址栏中的变化来决定内容区…...
CS5366+VL171母座正反插HDMI(CS5466也可搭配)国产芯片TYPEC方案设计 ASL电路原理图 集睿致远+威锋设计
VL171是威锋芯片,可搭配ASL集睿致远CS5366设计TypeC母座正反插转HDMI高清投屏方案,CS5366是2lane 芯片,支持4K60HZ,是CS5266的升级版,CS5366设计拓展坞方案可以替代CS5266携带快充100W的PD和US,多口HUB也不在话下,而画面的刷新率和…...
mxgraph的核心元素详谈
前言: MxGraph是一个流行的开源图形库,它提供了一stop solution for creating graphical representations of data。下面是MxGraph的核心源码讲解: 正文: Graph Structure(图结构): MxGraph将一个图表示为一个层次结构,由节点和边组成。节点表示图中的顶点,而边表示它…...
再探C++——默认成员函数
目录 一、构造函数 二、析构函数 三、赋值运算符 四、拷贝构造 如果一个类中没有成员,我们称为空类。空类,也存在6个默认的类成员函数。 默认成员函数:用户不显示地写,编译器会默认生成的函数叫做默认成员函数。 6个默认成员…...
推荐两款github敏感信息搜集工具(gsil、gshark)
推荐两款github敏感信息搜集工具(gsil、gshark) - 云社区 - 腾讯云 (tencent.com) github敏感信息泄露是很多企业时常忽视的一个问题,国外有一份研究报告显示,在超过24,000份的GitHub公开数据中,发现有数千个文件中可能…...
如何不拷贝资源的使用fork
我们知道fork出的子进程会把父线程的资源拷贝一遍,其中包括文件描述符表,如果是一些独占的设备,那么经常会出问题。 比如你在父进程ose了设备,但子进程的文件描述符表里依然记录是open的,这样当你再次在父进程open时&a…...
使用事件侦听器和 MATLAB GUI 查看 Simulink 信号研究
💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…...
使用协程让物体颜色慢慢消失
以下是使用协程让物体颜色慢慢消失的完整代码,每行都有注释说明: using UnityEngine; using System.Collections;public class ExampleClass : MonoBehaviour {public SpriteRenderer sprite; // 物体的SpriteRenderer组件public float fadeSpeed 0.1f…...
服务器流量
1.服务器流量分为入流量和出流量 入流量(Inbound Traffic)是指流向服务器的数据流量,也就是客户端发送到服务器的数据。这些数据可能包括请求信息、文件上传等。 出流量(Outbound Traffic)是指从服务器流向客户端的数…...
加拿大量子研究新动作!D-Wave与滑铁卢大学合作研究量子相干性
(图片来源:网络) D-Wave是量子计算系统、软件和服务的领导者,也是量子计算机的第一家供应商。近期,D-Wave宣布与滑铁卢大学量子计算研究所(IQC)达成两项新合作。他们为量子计算系统建立了关键…...
网络安全进阶学习第十一课——MySQL手工注入(2)
文章目录 一、UA注入1、原理2、靶场演示:1)一旦页面出现如下现状,就可以使用UA注入2)BP抓包3)修改User-Agent 二、referer注入1、原理2、靶场演示:1)使用BP抓包2)修改Referer 三、DN…...
数据库和ORM如何优雅的添加字段?
RT,业务需要为某个实体添加字段,如何在生成了Mybatis XML(包含了手写的部分联合查询)的情况下优雅的添加字段呢? 作者:方小葱 链接:https://www.zhihu.com/question/284511416/answer/43812337…...
QT ubuntu下开发视频播放 FFmpeg
ubuntu 安装FFmpeg T113VideoDemo.pro #------------------------------------------------- # # Project created by QtCreator 2023-07-28T11:45:22 # #-------------------------------------------------QT core guigreaterThan(QT_MAJOR_VERSION, 4): QT widget…...
8.3一日总结
1.远程仓库的使用 a.克隆远程仓库 1>.在桌面克隆远程仓库 git clone 仓库名 2>.修改仓库内容 3>添加目录 git add. 4>提交: git commit -m 完成登录功能 5>推送提交远程仓库 : git push origin master -u 6>更改推送:git push(简写形式) 需要先添加,再提交,最…...
load、unload和pagehide、pageshow
一、load、unload和pagehide、pageshow的主要应用 1)load 和 unload 事件监听web页面的进入和离开,一般用于页面的首次加载、刷新和关闭等操作的监听; 2)pageshow 和 pagehide 事件多用于监听浏览器的前进和后退等。 二、pagesh…...
【面试问题12】
1.吞吐量和并发区别? 并发请求树/单位时间一般是s 吞吐量 并发/平均响应时间 常用的吞吐量指标有qps,tps 2.mysql数据是怎么存储的? 存储在data目录下,数据库作为文件夹,文件夹里面有.ibd文件,一个表一个ib…...
高性能网络框架笔记
目录 TCP粘包、分包惊群断开连接,TCP怎么检测的?大量的close wait,如何解 ?双方同时调用close水平触发和边沿触发的区别 TCP粘包、分包 解决:1.应用层协议头前面pktlen;2.为每一个包加上分隔符;(\r\n&…...
leetcode 738. 单调递增的数字
2023.8.4 这题用暴力法会超时,我就没试了,采用了个挺巧的方法,为了方便需要先将整数n转换为字符串的形式,然后从后向前遍历,当两个数字非递增时,将前一个数字--,后一个数字的位置记录在index中&…...
FPGA项目设计:数字时钟
项目要求: 设计一个数字时钟,数码管前两位显示小时,数码管中间两位显示分钟,数码管后面两位显示秒。 项目设计: 系统框架图: 计数模块时序图: 代码实现: 计数模块: /…...
【大模型RAG】拍照搜题技术架构速览:三层管道、两级检索、兜底大模型
摘要 拍照搜题系统采用“三层管道(多模态 OCR → 语义检索 → 答案渲染)、两级检索(倒排 BM25 向量 HNSW)并以大语言模型兜底”的整体框架: 多模态 OCR 层 将题目图片经过超分、去噪、倾斜校正后,分别用…...
线程与协程
1. 线程与协程 1.1. “函数调用级别”的切换、上下文切换 1. 函数调用级别的切换 “函数调用级别的切换”是指:像函数调用/返回一样轻量地完成任务切换。 举例说明: 当你在程序中写一个函数调用: funcA() 然后 funcA 执行完后返回&…...
Opencv中的addweighted函数
一.addweighted函数作用 addweighted()是OpenCV库中用于图像处理的函数,主要功能是将两个输入图像(尺寸和类型相同)按照指定的权重进行加权叠加(图像融合),并添加一个标量值&#x…...
vue3 定时器-定义全局方法 vue+ts
1.创建ts文件 路径:src/utils/timer.ts 完整代码: import { onUnmounted } from vuetype TimerCallback (...args: any[]) > voidexport function useGlobalTimer() {const timers: Map<number, NodeJS.Timeout> new Map()// 创建定时器con…...
ardupilot 开发环境eclipse 中import 缺少C++
目录 文章目录 目录摘要1.修复过程摘要 本节主要解决ardupilot 开发环境eclipse 中import 缺少C++,无法导入ardupilot代码,会引起查看不方便的问题。如下图所示 1.修复过程 0.安装ubuntu 软件中自带的eclipse 1.打开eclipse—Help—install new software 2.在 Work with中…...
用docker来安装部署freeswitch记录
今天刚才测试一个callcenter的项目,所以尝试安装freeswitch 1、使用轩辕镜像 - 中国开发者首选的专业 Docker 镜像加速服务平台 编辑下面/etc/docker/daemon.json文件为 {"registry-mirrors": ["https://docker.xuanyuan.me"] }同时可以进入轩…...
MySQL JOIN 表过多的优化思路
当 MySQL 查询涉及大量表 JOIN 时,性能会显著下降。以下是优化思路和简易实现方法: 一、核心优化思路 减少 JOIN 数量 数据冗余:添加必要的冗余字段(如订单表直接存储用户名)合并表:将频繁关联的小表合并成…...
Python 高级应用10:在python 大型项目中 FastAPI 和 Django 的相互配合
无论是python,或者java 的大型项目中,都会涉及到 自身平台微服务之间的相互调用,以及和第三发平台的 接口对接,那在python 中是怎么实现的呢? 在 Python Web 开发中,FastAPI 和 Django 是两个重要但定位不…...
深入解析光敏传感技术:嵌入式仿真平台如何重塑电子工程教学
一、光敏传感技术的物理本质与系统级实现挑战 光敏电阻作为经典的光电传感器件,其工作原理根植于半导体材料的光电导效应。当入射光子能量超过材料带隙宽度时,价带电子受激发跃迁至导带,形成电子-空穴对,导致材料电导率显著提升。…...
【Redis】Redis从入门到实战:全面指南
Redis从入门到实战:全面指南 一、Redis简介 Redis(Remote Dictionary Server)是一个开源的、基于内存的键值存储系统,它可以用作数据库、缓存和消息代理。由Salvatore Sanfilippo于2009年开发,因其高性能、丰富的数据结构和广泛的语言支持而广受欢迎。 Redis核心特点:…...
