gball个人知识库
首页
基础组件
基础知识
算法&设计模式
  • 操作手册
  • 数据库
  • 极客时间
  • 每日随笔
  • 学习
  • 面试
  • 心情杂货
  • 实用技巧
  • 友情链接
  • 画图工具 (opens new window)
关于
  • 网盘 (opens new window)
  • 分类
  • 标签
  • 归档
项目
GitHub (opens new window)

ggball

后端界的小学生
首页
基础组件
基础知识
算法&设计模式
  • 操作手册
  • 数据库
  • 极客时间
  • 每日随笔
  • 学习
  • 面试
  • 心情杂货
  • 实用技巧
  • 友情链接
  • 画图工具 (opens new window)
关于
  • 网盘 (opens new window)
  • 分类
  • 标签
  • 归档
项目
GitHub (opens new window)
  • 面试

  • 数据库

  • linux

  • node

  • tensorFlow

  • 基础组件

  • 基础知识

    • java集合

    • jvm调优

    • java并发编程

    • java网络编程

      • 网络协议扫盲
      • netty

        • io入门了解
        • javaNIO了解
        • TCP粘包,拆包的原因和解决办法
          • 拆包问题说明
          • TCP粘包与拆包的发生的原因
          • 拆包,粘包问题的解决策略
        • reactor模型了解
        • 使用netty作为http文件服务
        • netty利用websocket协议开发服务端
      • dns解析过程
      • websocket网络协议
    • java8新特性

    • javaAgent

    • java高级

  • 算法与设计模式

  • 分布式

  • 疑难杂症

  • go学习之旅

  • 极客时间

  • 知识库
  • 基础知识
  • java网络编程
ggball
2022-01-15

TCP粘包,拆包的原因和解决办法

由于TCP会出现粘包,拆包的情况,为了更好的了解netty是如何解决的,所以有必要了解粘包,拆包的原因!

# 拆包问题说明

image-20220115192707759

假设客户端分别发送了两个数据包D1和D2给服务端,由于服务端一次读取到的字节数是不确定的,故可能存在以下4种情况。

  • 服务端分两次读取到了两个独立的数据包,分别是D1和D2,没有粘包和拆包;
  • 服务端一次接收到了两个数据包,D1和D2粘合在一起,被称为TCP粘包;
  • 服务端分两次读取到了两个数据包,第一次读取到了完整的D1包和D2包的部分内容,第二次读取到了D2包的剩余内容,这被称为TCP拆包;
  • 服务端分两次读取到了两个数据包,第一次读取到了D1包的部分内容D1_1,第二次读取到了D1包的剩余内容D1_2和D2包的整包。如果此时服务端TCP接收滑窗非常小,而数据包D1和D2比较大,很有可能会发生第5种可能,即服务端分多次才能将D1和D2包接收完全,期间发生多次拆包。

在网络分层中,tcp处于传输层,而tcp发送的报文是由IP层传输的,但是IP层只能提供最大努力服务,也就是说TCP下面的网络提供的都是不可靠传输,而tcp(面向连接的传输层协议)是一个可靠的网络传输协议,所以他必须要制定一些规则,来保证数据传输的稳定性。

# TCP粘包与拆包的发生的原因

  • 应用程序写入的字节数大于TCP发送缓存区的大小,会发生拆包
  • 进行MSS(最大报文长度)大小的TCP分段
  • 以太网帧的payload大于MTU进行IP分片(IP层收到数据时,如果数据加上IP头的长度超过MTU,则需要分片。)

# 拆包,粘包问题的解决策略

由于底层的TCP无法理解上层的业务数据,所以在底层是无法保证数据包不被拆分和重组的,这个问题只能通过上层的应用协议栈设计来解决,根据业 界的主流协议的解决方案,可以归纳如下。

  • 消息定长,例如每个报文的大小为固定长度200字节,如果不够,空位补空格;
  • 在包尾增加回车换行符进行分割,例如FTP协议;
  • 将消息分为消息头和消息体,消息头中包含表示消息总长度(或者消息体长度)的字段,通常设计思路为消息头的第一个字段使用int32来表示消息 的总长度;
  • 更复杂的应用层协议。
上次更新: 2025/06/04, 15:06:15
javaNIO了解
reactor模型了解

← javaNIO了解 reactor模型了解→

最近更新
01
AIIDE
03-07
02
githubActionCICD实战
03-07
03
windows安装Deep-Live-Cam教程
08-11
更多文章>
Theme by Vdoing
总访问量 次 | 总访客数 人
| Copyright © 2021-2025 ggball | 赣ICP备2021008769号-1
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式
×

评论

  • 评论 ssss
  • 回复
  • 评论 ssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssss
  • 回复
  • 评论 ssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssss
  • 回复
×