码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • TCP的粘包问题及解决办法


    TCP的黏包问题及解决办法

    • 什么是粘包?
      • 为什么会出现粘包的问题?
    • UDP为什么没有粘包?
    • 解决办法

    什么是粘包?

    TCP本身面向字节流的协议,它本身就没有“包”的概念,所以说粘包也不能说是它的缺陷,这是必然会出现的情况。

    传输过程中出现的情况:
    在这里插入图片描述
    情况1:
    数据包1和数据包2正常发送过去,没有发送粘包现象。
    情况2:
    数据包1和数据包2组成一个数据包被发送了过去,出现了粘包现象。
    情况3:
    数据包2被分成了两块,一块和数据包1粘在一起发送了过去,另一块和数据包3粘在一起发送了过去。

    举个例子

    比如说我们要发送“abc” ,"edf”

    按照第一种情况:
    正常发送了过去
    接收方知道了对方想发送两个字符,一个是"abc",一个是"def"。

    按照第二种情况:

    发送过去后则就变成
    “abcdef” ,接收端也不知道对方想发送的是什么?
    是“abcdef”呐,还是“a” "bcdef"呐,还是“ab” “cdef” 等等(情况有很多)。

    按照第三种情况
    假如说之后要发送数据包是"hjk"。
    则发送过去就变成了
    “abcde” “fhjk”。
    和上面一样,接收端也不知道发送端发送的具体是什么。

    为什么会出现粘包的问题?

    对于发送端:

    1.因为数据包还包含报头信息,所以为了提高传输效率 ,发送方往往会收集到足够的数据才会把数据一次发送过去。
    2.因为协议的原因,有MSS的限制,数据包过长就会分开传输。

    对于接收端:
    若接收端没有及时从缓冲区取走数据,等到下个数据包到达时,也就会存储到缓冲区,这样和之前的数据包混在一起,也就发生了粘包现象。

    本质原因就是接收端并不知道每个包具体的大小,或者是每个包的边界。

    UDP为什么没有粘包?

    因为UDP不是流式传输,而是面向消息传输的,它每次都只传输一条消息,所以不会出现粘包的情况。

    解决办法

    1.发生定长数据包。
    如果消息的长度都是一样的话,那么接收方只要计算消息的长度,当达到该定长时,就把它划做一个消息。
    2.包尾部加上标记。
    如在包尾加上\r\n,但是这种有一个问题,假如说消息的内容中有\r\n,则此处将会被当作消息的尾部,所以我们要避免这种情况。
    3.在包头中加上包的长度
    当对方收到后,按照包的长度进行读取则就可以了。

  • 相关阅读:
    详解Promise使用
    TechTool Pro for mac中文激活版:硬件监测和系统维护工具
    【leetcode top100】两数相加。无重复字符的最长子串,盛水最多的容器,三数之和
    LeetCode107. 二叉树的层序遍历 II
    【QT开发笔记-基础篇】| 第五章 绘图QPainter | 5.1 效果演示、技术点
    时序预测 | MATLAB实现WOA-CNN-BiLSTM-Attention时间序列预测(SE注意力机制)
    DRV8812RHDR 集成电机驱动器 8.2-45V 28QFN
    如何在Debian 10上安装Docker?
    电脑篇——Windows/Ubuntu系统一些有趣的终端命令
    Linux的简单使用
  • 原文地址:https://blog.csdn.net/aoeaoao/article/details/126914390
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号