通过大量实际的战斗情景,我们怎样才能解决Netty的散装粘土袋问题?

      最后更新:2021-11-15 09:00:26 手机定位技术交流文章

      图怪兽_d3c9b823ca0faaff4827def1bc596a37_83299

      TCP传输协议以数据流传输为基础,对数据流动没有限制。当客户将数据传送到服务处时,整个数据电文可分成小部分分发,或将多份提交书合并成大部分分发,在数据流传输的基础上建立多份传输协议,对数据流动没有限制。当客户将数据传送到服务处时,整个数据电文可分成小部分分发,或将多份提交书合并成大部分分发。

      在这种情况下,图3-1所述情况很可能发生。

      • 服务端读取两个完整的数据包A和B,无拆解/粘合问题。
      • 服务端获得A和B中粘合在一起的数据集,服务端必须解构A和B。
      • 服务器接收整个A和B数据包B-1的一部分,它必须解构整个A,等待阅读整个B数据包。
      • 服务器接收A包A-1的一部分,必须等待收到整个A包。
      • 软件包 A 是巨大的, 服务器必须多次接收它 。

      image-20210816220231161

      图3-1 粘贴和拆解问题

      由于拆解/裂缝问题,收货人难以确定包件的边界在哪里,并可能读取部分数据,造成数据解答问题。

      拆包粘包问题实战

      我要展示一个破包器。

      PackageNettyServer

      SimpleServerHandler

      PackageNettyClient

      SimpleClientHandler

      在审理上述案件期间,棘手和拆解问题不断出现。

      应用层定义通信协议

      我们如何处理包装和粘粘袋的问题?

      想法同样简单:通信当事人商定通信协议,服务端在收到电文后,根据谈判达成的协议解码,以避免粘贴和无包装问题。

      实际上,要深入考虑这一点很简单,因为导致分析袋被移走后收到的电文内容的错误是程序无法识别完整电文造成的,也就是说,从这个角度看,我们只需要在电文的双方之间确立一项识别规则,如何将信息组合到包件之后,以及如何按照一条规则将包件的内容分为许多完整电文。

      消息长度固定

      当接收者累积读出规定的长度报告时,即判断已获得完整电文,当发送者的数据短于固定长度预设信息时,即需要填补空位,当接收者累积读出规定的长度报告时,即认为已获得完整电文,而当发送者的数据短于固定长度时,则需要填补空位。

      如图3-2所示,假设设定信息长度为四,该信息不会达到这一长度,必须用空位填充,使该信息形成一个整体。

      image-20210817141908905

      图3-2

      这一解决办法是直截了当的,但缺点是显而易见的,因为不清楚如何为没有固定长度的新闻设定长度,如果为大会生产字节浪费而设定长度,则影响信息传输的长度太小,因此一般不会发生这种情况。

      特定分隔符

      能否在电文中添加分割, 因为它无法用特定的长度分隔? 然后电文由接收者使用特定的分隔符进行分割, 如图3-3所示 。

      image-20210817142341684

      图3-3

      在使用指定分隔符的情况下,必须注意确保分隔符与电文正文的字符之间没有冲突,否则会发生电文分割错误。

      由分隔符分隔的 信件长度加信件内容

      redis的文本协议根据电文长度加上电文内容加上先前在Redis中审查过的分隔符来定义数据传输。

      如你所见,案文有三个维度。

      • 消息长度
      • 消息分隔符
      • 消息内容

      这种技术在项目中是一种相当受欢迎的约定,首先通过整个电文信头的长度来评估当前电文全文所携带的参数数量。 然后,在电文的正文中,通过电文内容的长度和作为电文内容的组合,它被发条分割开来。 一旦收到该电文,服务器将能够按照规则解释完整的顺序。

      Zookeeper 的信息协议

      Zookeper是一个自定义的信息协议,它采用了黄麻议定书,所希望的协议定义如图3-4所示。

      使用 xid 存储按客户请求开始的序列号,并保持对具体客户请求的响应顺序,按类型分列的业务类型包括节点创建、节点清除和节点数据获取。
      协议的请求主体部分指请求的主体部分,包括请求的所有运作方面,询问机构的内容因请求类型而异。

      img
      图3-4

      图3-5说明了反应协定的定义。

      协议回复中的 xid 与上述请求中的 xid 一致, 仅返回请求中的原始 xid。 Zxid 表示ZooDescriptioner 服务器上的最新服务代号。 当请求执行过程中出现异常时, 错误编号会发出信号 。

      img
      图3-5

      使用Netty的编码。

      为了克服无包装贴纸的问题,Netty的违约为我们提供了一些标准编码器,下面是使用许多解码装置的快速例子。

      固定LengthFrame 代碼器代碼器

      固定长解码装置固定LengthFrameDecoder 工作原理很简单:框架Length,不论接收者收到的数据数量多少,将完全按照框架Length进行解码。

      如果累积读取长度是框架Length的电文, 解码器将假定已获得完整电文; 否则, 如果电文低于框架Length, 解码器将总是等待下一个数据包的到达, 知道声明的长度会返回 。

      3. 第3节提供的代码服务器端加上一个长度为10的跨链框架Decoder。

      基于分隔符的框架 Decoder 解码器

      基于定义的框架代碼器是一个特殊的分隔符解码器,具有以下属性:

      • 拆分者、违法者定义一个特定的分隔符,其参数类型是ByteBuf, 并且ByteBuf传递一系列分隔符,这意味着我们可以同时指定许多分隔符,但最终将分割最短的分隔符。

        就像收信人收到的信息一样..

        hellonworldrn

        此时指定多个分隔符nrn,最后选择最短的分隔符,以解码获取以下数据

        hello | world |

      • 最大Length 指定报告的最大长度受限制,如果给定的分隔符在最大Length之外不被识别,则生成 TooLongFrame Exception。

      • Failfast, 表示与最大Length 一起使用的过错容忍技术。 如果失败是事实, TooLongFrameExpendion 会在最大Length 后立即丢弃, 并且没有解码 。 如果失败 Fast=false, 当整个信件解码时会发布 TooLongFrame Expendion 。

      • 3⁄4 ̄ ̧漯Bn然后以下列方式对数据进行解码。

        hellonworldrn

        在脱衣时解码并获得

        hellon | worldrn

      DecoderNettyServer

      这里有一个例子 如何使用Destriper Based Frame Decoder。

      PrintServerHandler

      定义入境标准,该标准打印收到的数据。

      演示方法

      • 键入命令窗口的 cm 键入 Telnet 本地主机 8080 返回 。
      • 在 Telnet 窗口按Ctrl+]使用组密钥输入 Telnet 接口 。
      • 继续在此接口处按下车辆后退以打开新窗口, 您可以开始输入字符, 命令窗口将会有数据重写 。
      • 开始输入字符 hello&world ,就可以看到演示效果

      长长战地基准框架代码器

      长面积解码器“长边框架解码器 ” 是解决包拆解的最常用解码器,它有效地覆盖了基于长度拆解的大部分情况。 解码器用来解码开开源信息“ RockMQ ” 的中心。

      首先从解码器的基本设置开始

      • Ength Fieldoffest, 长度字段偏差, 这是包含的长度字段数据的起始点
      • FieldLength, 长度字段锁定所持有的字节数
      • 长度调整,在一些较为复杂的协议设计中,长度域不仅包括电文的长度,而且还包括诸如版本号、数据种类、数据状况等额外数据,我们可以在哪一点使用英文调整进行校正,值=软件包的长度――长度域值。
      • 初始位元TToStrip, 在解码后要跳过的初始字节数, 与信件内容字段的开始相对应 。
      • ength FieldEndoffet, 减去长度字段的末尾, 值 = 长度 Fieldoffet+ 长度 FieldLength

      这些因素难以理解,因此我们将在几个例子中加以说明。

      信件长度+信件内容解码

      如图4-6所示,鉴于存在由长度和电文内容组成的数据集,如图4-6所示,长度代表电文长度,以16位数表示,共有两个字节,因此,协议的适当编码参数设定如下。

      • 因为长度字段在文章开头, Ength Fieldoffest=0 。
      • 长度Length=2 协议设计指定固定长度为两个字节。
      • 长度调整=0,外地质量保证信息长度,无需调整
      • 解码为长度+内容,如果初始位元TToStrip=0,则无需跳过任何早期字节。

      image-20210817161855726

      图3-6

      截断解码结果

      图3-8显示了如果我们希望解码结果只包含信息,如何将相应的解码器设置合并,以产生公正的讯息。

      • 因为故事起源于长距场,Ength Fieldoffeset=0
      • ength FieldLength=2,协议设计固定长度
      • 英文调整=0, 长度字段仅包括信件长度, 无需更正 。
      • 位元TToStrip=2 绕过长度字段的字节长度,解码位元Buff 以只包含字体字段。

      image-20210817163346231

      图3-7

      信件存储在长度字段中 。

      如果长度字段包括长度字段的长度和内容字段所占用的字节数,则长度值为 0x00d(2+11=13字节),解码参数合并如下:

      • 因为时长场是故事开始的地方, Ength Fieldoffeset=0。
      • ength FieldLength=2,协议设计固定长度
      • 拆解所需长度为长度调整=-2,长度13字节,需要减少2字节。
      • 启动进程时使用了位元TToStrip=0。 解码仍然是长度+内容。 不需要跳过第一个字节 。

      image-20210817185158510

      图3-8

      根据外观的长度变化,进行解码。

      如图3-9所示,长度字段不再是提交文件的起始点,长度字段值为0x00b,即内容字段的11字节,因此,解码参数的配置如下:

      • Ength Fieldoffest=2 必须跳过他目前消费的两字节, 这是 时钟的起点 。
      • ength FieldLength=2,协议设计固定长度
      • 长度调整=0, 长度字段仅包括信件长度, 无需修改 。
      • 启动进程时使用了位元TToStrip=0。 解码仍然是长度+内容。 不需要跳过第一个字节 。

      image-20210817190301211

      图3-9

      根据长度偏差和长度校正,进行解码。

      如图3-10所示,长度字段有 hdr1 和 hdr2 字段,每个字段各有一个字节,因此长度字段价格低廉,需要修改英文调整。设置如下:

      • 要成为长度的起始位置, ength Fieldoffest=1 必须跳过 hdr1 的一个字节 。
      • ength FieldLength=2,协议设计固定长度
      • 长度(11字节)加上英文调整(1)表示 hdr2+content(12字节)。
      • 开始时的字节ToToStrip=3, 以 3 字节在 hdr1 和长度字段中解码

      image-20210817191318391

      图3-10

      解码器实战

      例如,考虑以下信息信头:客户端通过信息协议发送数据,服务器收到信息时必须解码。

      image-20210817201545060

      定义客户端, 从长度部分开始, 可以用 Netty 自己的长度 FleldPrefer 进行, 计算当前信件的二进制字节长度, 并将其添加到 ByteBuf 的缓冲区头 。

      代码执行后,您将收到两份通知。

      image-20210817202039956

      下面是Server端的代码,增加了长长战地基准框架代码器,其中有两个参数的值如下

      • Ength FieldLength: 2, 这意味着长度需要 2 字节 。

      • 起始位元组ToStrip: 2, 意指解码是通过跳过两字节长度和获取内容完成的。

      总结

      我们所审查的少数几个广泛使用的解码装置有助于我们解决半包装和粘粘袋问题,最终将使接收者能够收到完整和合理的请求,并用ByteBuf包装,以及是否有其他方法将这一信息的内容编码,如顺序顺序,需要单独处理。

      此外,许多中间人自行订立通信协定,这些协定除了解决半包装问题外,还传递了其他重要数据,如动物园管理员黄麻、杜博框架的杜博协定等等。

      版权声明:除具体声明外。 0 许可证协议,博客上的所有文章均以CC BY-NC-SA 4为基础。Mic带你学架构
      如果您认为这篇文章有用, 请给我一些关注和赞赏, 请要求我成为其背后的驱动力。 请加入“ 追寻 Mic ” 公众行列, 获取更多技术用品 。

      本文由 在线网速测试 整理编辑,转载请注明出处,原文链接:https://www.wangsu123.cn/news/13236.html

          热门文章

          文章分类