前言

TCP是个流协议,所谓流,就是没有界限的一串数据。大家可以想想河里的流水,是连成一片的,其间并没有分界线。TCP底层并不了解上层业务数据的具体含义,它会根据TCP缓冲区的实际情况进行包的划分,所以在业务上认为,一个完整的包可能会被TCP拆分成多个包进行发送,也有可能把多个小的包封装成一个大的数据包发送,这就是所谓的TCP粘包和拆包问题。

案例:

某时刻发送端缓冲区过小,导致ABC数据包发生拆包成AB、C,拆分出来的C与数据包DEF粘包发送给接收端。

拆包场景:

(1)要发送的数据大于缓冲区剩余大小;

(2)待发送的数据大于MSS,TCP会在传输前将其拆分;

粘包场景:

(1)要发送小于缓冲区剩余大小;

(2)接受数据端的应用层没来得及读取缓冲区的数据;

应用层协议存在粘包拆包情况,netty如何利用Frameecoder来解决的?

在Netty的codec模块中,对通用传输协议提供了支持,并且在FrameDecoder中对于粘包拆包给出了通用的解决方案,应用层协议解析类可以通过继承它而无须担心粘包、拆包等问题。

可以看到http协议解析类HttpMessageDecoder固定、长度解析类FixedLengthFrameDecoder、换行协议解析类LineBaseFrameDecoder等等都是基于FrameDecoder拓展实现,而FrameDecoder继承自SimpleChannelUpstreamHandler,是不是有点熟悉呢?没错,这个在解读netty3.9的数据处理流程(一)的处理执行者,没看过的同学可以点进去看看。

拨开浓雾:

对于脉络我们已经梳理清晰,拆包粘包是前文数据处理流程的某一个环节,那到底FrameDecoder为什么那么神奇,能通用地处理粘包呢?可以想象,仓库包裹打包出库场景,打包人员在工作台打包货物,直到缺少货物再让拣选员拣选过来接着打包,缺货的时候是不是还有商品在工作台上,是不是有点懂了FrameDecoder在做什么事呢?可以理解就是一个打包工作台,还没法打包就等待但是注意货物还在台上,可以打包就一直打包下去即可。

那我们来看看FrameDecoder庐山真面目。

可以看到cumulation不为空的情况下,就调用appendToCumulation将接受到的数据塞到cumulation中,cumulation就是刚刚货物打包场景中的工作台,否则就调用callDecode循环地去解析应用数据包,并且调用updateCumulation订正cumulation的数据。

当cumulation可读时,记录下旧的读指针用于对比,并调用实际的协议执行者解析出应用层数据包。

1、如果数据包为空并且读指针未挪动,说明应用层数据包不全,跳出等待数据;

2、如果数据包为空但是读指针挪动,抛弃部分数据可能正在读,继续调用解析;

3、如果存在数据包并且读指针未移动,则抛出异常;

4、如果数据包不为空并且读指针挪动,很明显继续调用解析;

喜欢的读者可以关注路上小栈,及时获取最新的技术文章,专注源码分析、技术业务思考等。

Netty如何解决粘包拆包?(二)相关推荐

  1. 什么是粘包和拆包,Netty如何解决粘包拆包?

    Netty粘包拆包 TCP 粘包拆包是指发送方发送的若干包数据到接收方接收时粘成一包或某个数据包被拆开接收. 如下图所示,client 发送了两个数据包 D1 和 D2,但是 server 端可能会收 ...

  2. kafka是如何解决粘包拆包的

    本文来说下kafka是如何解决粘包拆包的 文章目录 概述 kakfa是如何解决粘包拆包问题的呢 本文小结 概述 前面笔者写了一篇文章一文讲清粘包拆包 全面的讲解了TCP粘包拆包相关的问题.下面进行一个 ...

  3. Netty学习总结(5)——Netty之TCP粘包/拆包问题的解决之道

    无论是服务端还是客户端,读取或者发送消息的时候,都需要考虑TCP底层的粘包/拆包机制. TCP粘包/拆包 TCP是个"流"协议. 流:没有界限的一串数据.如同河里的流水,它们是连成 ...

  4. http协议解决粘包拆包半包 的编码解码过程、 以及netty 使用http协议的原理

    本文主要介绍netty对http协议解析原理,着重讲解keep-alive,gzip,truncked等机制,详细描述了netty如何实现对http解析的高性能. 1 http协议 1.1 描述 标示 ...

  5. Netty中的粘包拆包

    文章目录 一.问题描述: 1. 什么是粘包.拆包 2. 粘包拆包演示 二.解决思路: 三.解决方案: 一.问题描述: 1. 什么是粘包.拆包 粘包和拆包是TCP网络编程中不可避免的,无论是服务端还是客 ...

  6. Netty如何解决粘包半包问题

    何为粘包 / 半包? 比如,我们发送两条消息:ABC 和 DEF,那么对方收到的就一定是 ABC 和 DEF 吗? 不一定,对方可能一次就把两条消息接收完了,即 ABCDEF:也可能分成了好多次,比如 ...

  7. Netty工作笔记0083---通过自定义协议解决粘包拆包问题1

    技术交流QQ群[JAVA,C++,Python,.NET,BigData,AI]:170933152 咱们写一个案例,来解决拆包,粘包的问题 自己定义一个协议,先去,这里只有协议内容和长度 然后用以前 ...

  8. Netty 之 TCP粘包拆包场景

    转自:http://blog.csdn.net/z69183787/article/details/52595980 TCP编程底层都有粘包和拆包机制,因为我们在C/S这种传输模型下,以TCP协议传输 ...

  9. Netty工作笔记0084---通过自定义协议解决粘包拆包问题2

    技术交流QQ群[JAVA,C++,Python,.NET,BigData,AI]:170933152 继续写服务器回复给客户端的内容 这里写入回复消息代码 加入编码器,编码后发给客户端 客户端加入解码 ...

最新文章

  1. centos vim配置高亮语法和格式化粘贴
  2. Windows CE 6.0 安装顺序
  3. Redis分布式锁实现
  4. 星空主题设计理念_南京婚礼丨一起去看不同经纬度城市的星空吧
  5. hbase集群安装和shell操作
  6. 转 UIAlertView 不显示、屏幕变灰
  7. 服务器在行例维护中,8月14日服务器例行维护公告
  8. C#中计算流指定位置和长度的MD5值
  9. 如何配置openjdk的 java home
  10. perl 哈希(hash) 学习笔记
  11. 超能搜索系统输入关键字_电商后台设计——搜索
  12. 管壳式热交换器传热计算
  13. xmind2020激活教程_思维导图软件XMind 2020 v10.2.1中文版的官网下载、安装与序列号注册文件激活教程-推荐实用小软件 -亦是美网络...
  14. ubuntu搜狗输入法下载
  15. 【python】模拟斗牛纸牌游戏「牛牛」
  16. 你的大四,推荐做的几件事 [英语专业女生的自白]
  17. Linux下 timerfd创建定时器并使用 epoll 监听
  18. [动态系统的建模与分析]15_伯德图,bode图,为什么是20logM?分贝又是什么?
  19. 钣金展开更自由了? SOLIDWORKS 2022 新功能
  20. 如何多人共同编辑_微信编辑器可以多人协作排版吗?

热门文章

  1. ABP官方文档翻译 1.5 多租户
  2. [恢]hdu 2186
  3. Java实现阶乘的和
  4. 7系统内部系统组件禁止休眠_海康监控系统平台设计思路(二)
  5. linux 程序调试日志,Linux程序调试
  6. 正在迷茫的你,为什么不考虑这份工作呢?
  7. 自学前端,需要学习哪些知识点?学多久可以入职前端工程师?
  8. 应该怎么样学习前端呢?
  9. 无法获取计算机名,Spring Cloud常见问题之:无法注册主机名
  10. wireshark 开始抓包