当前位置: 首页 > news >正文

(计算机网络)TCP 粘包与拆包

什么是粘包和拆包?

  • 粘包:指多条应用层消息在接收方一次性读到,数据“粘”在一起,无法区分消息边界。

    • 例子:客户端连续发送 [Hello][World],接收方一次 recv() 得到 [HelloWorld]

  • 拆包:指一条应用层消息被 TCP 拆成多段传输,接收方需要多次 recv() 才能拼凑完整。

    • 例子:客户端发送 [HelloWorld],接收方第一次 recv() 得到 [Hello],第二次得到 [World]

一、为什么会出现粘包和拆包?

TCP 是面向字节流的协议,它只保证数据有序、不丢、不重复,但不会保留应用层消息的边界。

因此:

  • 应用层发送的多条消息,可能被 TCP 合并在一起(粘包)。

  • 一条消息可能被拆成多个数据包传输(拆包)。


二、粘包与拆包的场景

1. 粘包现象

客户端连续发送两条消息:

[Hello]
[World]

服务端可能一次 recv() 收到:

[HelloWorld]

👉 多条消息粘在一起。

2. 拆包现象

客户端发送一条很大的消息:

[HelloWorldHelloWorld... 很长的数据]

服务端可能第一次收到:

[HelloW]

第二次收到:

[orldHello...]

👉 一条消息被拆开。


三、产生原因

  1. TCP 无消息边界:只是一条连续的字节流。

  2. Nagle 算法:小包会合并传输。

  3. 接收端读取不及时:缓冲区积累数据,导致粘在一起。

  4. 消息过大:超过 MTU 或 TCP 缓冲区,只能拆分。


四、解决方案

1. 定长消息

  • 每条消息固定大小,例如 1024 字节,不够补齐。

  • 缺点:浪费空间。

2. 分隔符

  • 在消息末尾加特殊字符(如 \n\r\n)。

  • 类似 HTTP 协议用 \r\n\r\n 分隔头和体。

http://www.dtcms.com/a/366630.html

相关文章:

  • 【Day 44】Shell-Git版本控制器
  • 【LeetCode数据结构】随机链表的复制
  • 01 神经网络简介
  • 2025国赛C题题目及最新思路公布!
  • 代码随想录二刷之“贪心算法”~GO
  • 【笔记】Software Engineering at Google
  • 25年Docker镜像无法下载的四种对策
  • 国产GEO工具哪家强?巨推集团、SEO研究协会网、业界科技三强对比
  • 如何监控员工的电脑?7款实用的员工电脑管理软件,探索高效管理捷径!
  • Spring Cloud Eureka 核心原理
  • Spring简单的读取和存储对象
  • Axure RP 9 Mac 交互原型设计
  • Ubuntu 25.04搭建hadoop3.4.1集群详细教程
  • SpringBoot 网络流量抓包与分析系统
  • DevOps平台选型指南:破解研发效率瓶颈,适配金融/政务/国产化场景的5大关键指标
  • 【数据可视化-108】2025年6月新能源汽车零售销量TOP10车企分析大屏(PyEcharts炫酷黑色主题可视化)
  • C#强制类型转换(显示转换)和安全类型转换
  • 激光频率梳 3D 轮廓测量 - 莫尔条纹光的工作原理及优缺点
  • 2025变现打法:AI+IP实现高效变现|创客匠人
  • Mysql杂志(九)
  • Agent Prompt工程:如何让智能体更“听话”?(实践指南)
  • 深度学习玩游戏, 模型玩游戏,大模型+游戏 llm+game, 机器学习玩游戏,人工智能游戏陪伴,模型陪玩游戏
  • 机器学习基础-day02-K近邻算法
  • 大数据框架Doris全面解析
  • 学习机器学习能看哪些书籍
  • 计算机毕业设计:基于Python的影评情感分析可视化推荐系统
  • 【嵌入式DIY实例-ESP32篇】-倾斜弹跳球游戏
  • 【CouponHub项目开发】使用RocketMQ5.x实现延时修改优惠券状态,并通过使用模板方法模式重构消息队列发送功能
  • Unity中,软遮罩SoftMaskForUGUI可移动遮罩形状实现方法
  • 阻抗、瞬时阻抗、特性阻抗的区别