Netty权威指南:Netty总结-编解码与序列化

news2024/9/20 14:55:03

第四章 TCP粘包/拆包问题

4.1 TCP 粘包/拆包

TCP是流协议,也就是没有界限的的一串数据,底层并不知道上层业务数据的具体含义,也就是说一个完整的包可能会被拆分成多个包进行发送,也可能把几个小包封装成一个大的数据包发送。这就是拆包和粘包

4.1.1 TCP粘包拆包问题说明

在这里插入图片描述

存在4种情况

  1. 服务端分两次读取到了两个独立的数据包,分别是D1和D2,没有粘包和拆包;

  2. 服务端一次接收到了两个数据包,D1和D2粘合在一起,被称为TCP粘包:

  3. 服务端分两次读取到了两个数据包,第一次读取到了完整的D1包和D2包的部分内容,第二次读取到了D2包的剩余内容,这被称为TCP拆包;

  4. 服务端分两次读取到了两个数据包,第一次读取到了D1包的部分内容D11,第二次读取到了D1包的剩余内容D12和D2包的整包。

如果此时服务端TCP接收滑窗非常小,而数据包D1和D2比较大,很有可能会发生第5种可能,即服务端分多次才能将D1和D2包接收完全,期间发生多次拆包。

4.1.2 原因

MTU(Maximum Transmission Unit),网络层能够传输的最大数据包大小(以字节为单位) MTU限制了在网络上传输的每个数据包的最大大小。

MMS(Maximum Segment Size),MMS是指TCP协议在一次传输中可以发送的最大数据量(不包括TCP头部的大小)。它是由MTU决定的,具体来说是MTU减去IP和TCP头部的大小。MMS定义了TCP每次发送数据时,数据段的最大大小。它保证了数据段能够顺利通过网络,而不会导致分片。

TCP粘包和拆包发生的原因:

  1. 应用程序write写入的字节大小大于套接口发送缓冲区大小
  2. 进行MSS大小的 TCP分段;
  3. 以太网帧的payload 大于MTU 进行IP 分片

在这里插入图片描述

4.1.3 粘包问题的解决

这个问题只能通过上层应用协议栈设计解决:

  1. 消息定长
  2. 包尾增加回车换行符进行分割,例如FTP协议
  3. 将消息分为消息头和消息体,消息头包含消息总长度(通常思路为消息头的第一个字段使用int32来表示消息总长度)
  4. 更复杂的应用层协议

4.2 TCP粘包导致的功能异常

会导致消息粘包,程序不能正常运作

4.3 利用LineBasedFrameDecoder解决

在Handler之前添加两个解码器,LineBasedFrameDecoder和StringDecoder

原理分析:

LineBasedFrameDecoder的工作原理是它依次遍历ByteBuf中的可读字节,判断看是否有“\”或者“\r\n”,如果有,就以此位置为结束位置,从可读索引到结束位置区间的字节就组成了一行。它是以换行符为结束标志的解码器,支持携带结束符或者不携带结束符两种解码方式,同时支持配置单行的最大长度。如果连续读取到最大长度后仍然没有发现换行符,就会抛出异常,同时忽略掉之前读到的异常码流。

StringDecoder的功能就是将接收到的对象转换成字符串,然后继续调用后面的 Handler。LineBasedFrameDecoder+StringDecoder 组合就是按行切换的文本解码器它被设计用来支持TCP的粘包和拆包。

Netty提供多种解码器

第五章 分隔符和定长解码器的应用

四种区分消息的方式:

  1. 消息定长,累计读取到长度总和为LEN的报文后,就认为读到了一个完整的消息,将计数器重置,读取下一个
  2. 包尾增加回车换行符进行分割,例如FTP协议
  3. 特殊分隔符作为消息的结束标志,比如回车换行符
  4. 将消息分为消息头和消息体,消息头包含消息总长度(通常思路为消息头的第一个字段使用int32来表示消息总长度)

Netty对这四种应用做了统一的抽象,提供了四种编码解码器

5.1 DelimiterBasedFrameDecoder

自动完成以分隔符做结束的消息的解码

5.1.1 服务端开发

创建一个DelimiterBasedFrameDecoder对象,加入到ChannelPipeline,有两个参数一个是单挑消息的最大长度,一个是分隔符缓冲对象

然后将StringDecoder加入Pipeline,将ByteBuf解码成字符串对象,再由ServerHandler处理业务

5.1.2 客户端开发

与服务端添加方法类似

5.2 FixedLengthFrameDecoder

固定长度解码器,能够按照指定长度对消息自动解码

5.2.1 服务端开发

在服务端的ChannelPipeline中新增FixedLengthFrameDecoder,长度设置为20,在依次添加字符串解码器和ServerHandler

利用 FixedLengthFrameDecoder 解码器,无论一次接收到多少数据报,它都会按照构造函数中设置的固定长度进行解码,如果是半包消息,FixedLengthFrameDecoder 会缓存半包消息并等待下个包到达后进行拼包,直到读取到一个完整的包。

第六章 编解码技术

进行远程传输时,将被传输的Java对象编码成字节数组或者ByteBuffer对象,远程服务读取到ByteBuffer对象或字节数组时,需要解码为发送时的Java对象。称为编解码技术

6.1 Java序列化的缺点

评判一个编解码框架的优劣时,往往会考虑以下几个因素。

  • 是否支持跨语言,支持的语言种类是否丰富:
  • 编码后的码流大小:
  • 编解码的性能;
  • 类库是否小巧,API使用是否方便;
  • 使用者需要手工开发的工作量和难度。

几乎所有的Java RPC框架,都没有使用Java序列化作为编解码框架,有以下缺点

  • 无法跨语言

  • 序列化后的码流太大

  • 序列化性能太低

6.2 主流的编解码框架

Netty中应用的一些编解码框架

6.2.1 Google的Protobuf

数据结构以.proto 文件进行描述,通过代码生成工具可以生成对应数据结构的POJO对象和Protobuf相关的方法和属性

特点:

  • 结构化数据存储格式
  • 高效的编解码性能
  • 语言无关、平台无关、扩展性好
  • 官方支持Java、C++和python

优点:

  • 文本化的数据结构描述语言,可以实现语言和平台无关,特别适合异构系统间的集成;
  • 通过标识字段的顺序,可以实现协议的前向兼容:
  • 自动代码生成,不需要手工编写同样数据结构的C++和Java版本:
  • 方便后续的管理和维护。相比于代码,结构化的文档更容易管理和维护。

6.2.2 Facebook的Thrift

支持数据序列化和多种类型的RPC服务,适用于静态的数据交换,需要先确定好数据结构,数据结构发生变化时,必须重新编辑IDL文件。支持二进制压缩编解码,所以性能表现也很优异

由五部分组成,

  1. 语言系统以及IDL编译器:负责由用户给定的IDL文件生成相应语言的接口代码;

  2. TProtocol:RPC的协议层,可以选择多种不同的对象序列化方式,如JSON和Binary;

  3. TTransport:RPC的传输层,同样可以选择不同的传输层实现,如socket、NIO、MemoryBuffer等:

  4. TProcessor:作为协议层和用户提供的服务实现之间的纽带,负责调用服务实现的接口;

  5. TServer:聚合TProtocol、TTransport和 TProcessor 等对象

编解码框架,与之对应的就是TProtocol。由于Thri的RPC服务调用和编解码框架绑定在一起,所以,通常我们使用Thrit的时候会采取RPC框架的方式。但是,它的TProtocol编解码框架还是可以以类库的方式独立使用的。

6.2.3 JBoss Marshalling

是一个Java对象的序列化API包,修正了JDK自带的序列化包的一些问题

优点:

  • 可插拔的类解析器,提供更加便捷的类加载定制策略通 过口即可实现定制;
  • 可插拔的对象替换技术,不需要通过继承的方式;
  • 可插拔的预定义类缓存表,可以减小序列化的字节数组长度,提升常用类型的对象序列化性能;
  • 无须实现 java.io.Serializable接口,即可实现 Java序列化;
  • 通过缓存技术提升对象的序列化性能。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2124370.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

百度经纬度互转高德经纬度_在线经纬度转换工具

简介说明 在线经纬度转换工具主要功能:百度经纬度转高德经纬度,高德经纬度转百度经纬度,坐标拾取,经纬度反查高德坐标拾取器,坐标拾取,经纬度反查百度坐标拾取器,坐标拾取,经纬度反查地图数据批量收集 操作界面 使用入口> 百度经纬度互转高德经纬度_在线经纬度转换工具

web基础之SSRF

1、内网访问 题目提示:访问位于127.0.0.1的flag.php;直接利用ssrf漏洞访问?url127.0.0.1/flag.php 2、伪协议读取文件 (1)题目提示:尝试去读取一下Web目录下的flag.php吧 (2)什么是伪协议&a…

光伏发电并网系统的能量管理

光伏发电是发展前景良好的清洁型能源。近年来,光伏发电站陆续投入运营,受到光照和温度等因素的影响,电力输出功率存在间歇波动性和随机性,因此,为了维持电网稳定性采用储能装置十分必要。 1储能技术在光伏并网发电系统…

IPD推行成功的核心要素(二十一)PLM助力产品研发全生命周期与创新协同一体化推动研发IPD数字化转型

制造业是实体经济的基础,也是未来经济高质量发展的关键。AI、大数据等新技术的发展,为研发管理创新带来了新的机遇。比如:通过总结过往研发场景进行知识封装,使其形成自适应、甚至可以进行自我调节和优化的能力,最终重…

MySQL · 性能优化 · 提高查询效率的实用指南(上)

前言 在过去的几年里,MySQL作为一款开源数据库,因其稳定性和性能得到了广泛的应用。始终保持着强劲的增长趋势,越来越多的企业和开发者将其作为首选数据库,甚至有部分企业从Oracle迁移至MySQL。然而,随着使用的普及&a…

体型控制器:S6K1,相关磷酸化抗体介绍

前 言 S6K1是一种丝氨酸/苏氨酸蛋白激酶,因能介导核糖体蛋白S6磷酸化而得名。众所周知,胞内蛋白磷酸化在多种生理及病理过程中发挥重要作用,并与癌症的发生发展关系密切。除此之外,S6K1还有控制体型的功能,下文我们将…

activiti学习第一步

此处无简介&#xff08;有需要可以官网查询&#xff09;直接上使用 引入pom <activiti.version>7.1.0.M2</activiti.version><dependency> <groupId>org.activiti</groupId> <artifactId>activiti-spring-boot-starter</artifa…

学生用的蓝牙耳机推荐有哪些?实测四款实力出众机型!

在当今数字化学习环境中&#xff0c;学生对蓝牙耳机的需求日益增长&#xff0c;无论是在线课程的学习、图书馆的集中阅读还是日常通勤中的音频资料复习&#xff0c;一款性能优异、舒适度高且价格合理的蓝牙耳机对学生来说至关重要&#xff0c;面对市场上琳琅满目的产品选择&…

Baumer工业相机堡盟工业相机如何通过NEOAPI SDK获取相机当前数据吞吐量(Python)

Baumer工业相机堡盟工业相机如何通过NEOAPI SDK里函数来获取相机当前数据吞吐量&#xff08;Python&#xff09; Baumer工业相机Baumer工业相机的数据吞吐量的技术背景CameraExplorer如何查看相机吞吐量信息在NEOAPI SDK里通过函数获取相机接口吞吐量 Baumer工业相机通过NEOAPI…

【方法】如何禁止PDF转换成其他格式文件?

在工作中&#xff0c;PDF文件因其易于阅读和不易修改的特性&#xff0c;成为了广泛使用的文件格式。然而&#xff0c;出于安全性或版权保护的考虑&#xff0c;有时候我们不希望他人将PDF文件转换为其他格式。下面一起来看看禁止PDF转换格式的方法&#xff01; 我们只需要通过P…

java 上传代码到线上流程

1. idea 的 maven 插件环境选择 test 或者 prod test 对应物理机&#xff0c;prod对应线上生产环境 2. 选择完成要重新刷新 maven 3. 第一部 首先 clean 第二部进行 package jar 包路径一般在 WeiCar-Server\ruoyi-admin\target 下 去宝塔更新 Jar 包重启项目即可

C++入门 二(函数重载,引用,超详细!!!)

文章目录 函数重载函数重载的概念 引用引用的概念引用特性 函数重载 函数重载的概念 函数重载:是函数的一种特殊情况&#xff0c;C允许在同一作用域中声明几个功能类似的同名函数&#xff0c;这些同名函数的形参列表(参数个数 或 类型 或 类型顺序)不同&#xff0c;常用来处理…

uni-app和Node.js使用uni-push2.0实现通知栏消息推送功能

前言 uniapp 提供了 unipush 统一推送服务,但是每次要推送消息的时候都要登陆 Dcloud 开发者后台&#xff0c;有点不方便&#xff0c;运营需要在我们的后台系统就可以完成操作。 效果演示 消息下发流程 名词解释 名词解释通知消息指定通知标题和内容后&#xff0c;由个推 SD…

【文档资料】《你缺失的那门计算机课》

# 站长的话 站长认为此书写的非常好&#xff0c;能够很好的GET到当下普通人所遇到的难点&#xff0c;正如此书的序章所写&#xff1a;“据我们观察&#xff0c;许多同学对「电脑」并不熟悉&#xff0c;甚至可以说是陌生&#xff1a;他们可能在网上被下载到各种「P2P 高速下载器…

【大模型结构】输出参数配置

文章目录 大模型生成策略Top_kTop_pTemperature联合使用的顺序参考资料 大家在体验大语言模型或者多模态大模型的开源应用时&#xff0c;经常会看到类似下面这个页面&#xff0c;用来控制大模型输出的一些参数设置&#xff1a; 或者在代码中也经常需要设置以下几个参数&#xf…

git-describe获取不到新创建的标签

一、问题描述 1、新建的分支 2、git-describe 失败 二、查询资料 &#xff08;1&#xff09;git-describe - 根据可用的ref给对象一个人类可读的名称 &#xff08;2&#xff09;该命令查找可从提交访问的最新标记。如果标记指向提交&#xff0c;则仅显示标记。否则&#xf…

权威认证 | HelpLook荣获ISO 27001认证,信息安全能力获国际认可

“信息&#xff0c;如同其他核心业务资产&#xff0c;同样具有极高的价值。” 有很多用户关心&#xff0c;在HelpLook上传的数据安全有保障吗&#xff1f;其实&#xff0c;HelpLook早已通过了国际权威的ISO 27001信息安全管理体系认证。这一认证不仅标志着HelpLook的信息安全管…

服务业如何运用控制图来监控服务质量?

控制图&#xff0c;最初起源于制造业&#xff0c;用于监控生产过程中的质量波动&#xff0c;确保产品符合预定标准。然而&#xff0c;其原理同样适用于服务业&#xff0c;成为衡量和监控服务质量的得力助手。通过收集关键服务指标的数据&#xff08;如客户满意度、服务响应时间…

不信这个书单治不了你的大模型焦虑症!学习大模型最值得推荐的几本书

前言 要说现在最热门的技术&#xff0c;可谓非大模型莫属&#xff01; 不少小伙伴都想要学习大模型技术&#xff0c;转战AI领域&#xff0c;以适应未来的大趋势&#xff0c;寻求更有前景的发展~~ 然而&#xff0c;在学习大模型技术这条道路上&#xff0c;却不知道如何进行系…

Vue3 TS 验证子组件中的表单,多级表单验证

Vue3 TS 验证子组件中的表单&#xff0c;多级表单验证 1. 使用情形2. 子组件script中定义并expose3. 父组件使用 1. 使用情形 在某些交互场景下&#xff0c;我们同一个页面会嵌套多个表单&#xff0c;例如表单2为表单1的子组件里的表单&#xff0c;但是我们需要在提交场景下同…