Netty自定义协议要素

Netty,自定义,协议 · 浏览次数 : 44

小编点评

**魔数:用于判断数据包是否有效数据包协议版本号** * **protobuf:**消息正文使用 protobuf 数据类型序列化,可以扩展。 * **json:**消息正文使用 JSON 数据类型序列化,可以扩展。 * **hessian:**消息正文使用 Hessian 数据类型序列化,可以扩展。 **帧解析器参数:** | 参数 | 值 | 说明 | |---|---|---| | maxFrameLength | 14 | 最大帧长度 | | lengthFieldOffset | 0 |长度偏移 | | lengthFieldLength | 2 | 字节长度偏移 | | lengthAdjustment | 0 | 字节调整 | | initialBytesToStrip | 0 | 头部字节数 | **特殊情况:** * **半包:**当发生半包时,帧解析器发现没有获取到完整的帧,就不会把收到的数据向下一个 handler传递。 * **粘包:**当出现粘包或半包问题时,就会导致自定义解析器出错,这将导致数据包解析失败。

正文

  • 魔数:用来判断是否是无效数据包
  • 协议版本号:可以支持协议的升级
  • 序列化算法:消息正文使用哪种序列化方式,可以扩展。例如:protobuf,json,hessian等
  • 指令类型:跟业务相关,例如:登录,注册等
  • 请求序号:为了双工通信,提供异步能力
  • 正文长度
  • 消息正文

防止粘包和半包

设计协议时,虽然我们可以定义如何解析每一个完整的数据包,但是无法保证每次收到的数据包都是完整的。如果出现粘包或半包的问题,就会导致自定义的解析器出错,这就需要Netty提供的如下帧解析器来处理。

// 帧解析器,参数分别表示帧大小,帧内容长度字段的起始偏移,帧内容长度字段本身的长度,内容相比长度字段的偏移量,解析后需要从首部剔除的字节数
// 当发生半包时,帧解析器发现没有获取到完整的帧,就不会把收到的数据向下一个handler传递,知道收到完整的帧才会传递,这就保证了帧的完整性。
public LengthFieldBasedFrameDecoder(
            int maxFrameLength,
            int lengthFieldOffset, int lengthFieldLength,
            int lengthAdjustment, int initialBytesToStrip)
  lengthFieldOffset   = 0
  lengthFieldLength   = 2
  lengthAdjustment    = 0
  initialBytesToStrip = 0 (= do not strip header)
 
  BEFORE DECODE (14 bytes)         AFTER DECODE (14 bytes)
  +--------+----------------+      +--------+----------------+
  | Length | Actual Content |----->| Length | Actual Content |
  | 0x000C | "HELLO, WORLD" |      | 0x000C | "HELLO, WORLD" |
  +--------+----------------+      +--------+----------------+
  
  lengthFieldOffset   = 1 (= the length of HDR1)
  lengthFieldLength   = 2
  lengthAdjustment    = 1 (= the length of HDR2)
  initialBytesToStrip = 3 (= the length of HDR1 + LEN)
 
  BEFORE DECODE (16 bytes)                       AFTER DECODE (13 bytes)
  +------+--------+------+----------------+      +------+----------------+
  | HDR1 | Length | HDR2 | Actual Content |----->| HDR2 | Actual Content |
  | 0xCA | 0x000C | 0xFE | "HELLO, WORLD" |      | 0xFE | "HELLO, WORLD" |
  +------+--------+------+----------------+      +------+----------------+

与Netty自定义协议要素相似的内容:

Netty自定义协议要素

魔数:用来判断是否是无效数据包 协议版本号:可以支持协议的升级 序列化算法:消息正文使用哪种序列化方式,可以扩展。例如:protobuf,json,hessian等 指令类型:跟业务相关,例如:登录,注册等 请求序号:为了双工通信,提供异步能力 正文长度 消息正文 防止粘包和半包 设计协议时,虽然我

【踩坑】.NET 8.0 自定义IExceptionHandler不生效

中间件实现异常处理 在ASP.NET Core里,我们可以使用中间件(Middleware)实现全局的异常处理。 如内置的异常处理中间件 UseExceptionHandler app.UseExceptionHandler(appError => { appError.Run(async cont

Java NIO 图解 Netty 服务端启动的过程

本文在了解netty核心组件的前提下,进一步了解组件如何在整个服务器启动过程如何被创建,如何组件之间配合来使用。首先也是先了解下大概服务端的启动过程,并且在了解过程中我们带着自己的问题去在学习过程中探寻答案

一分钟学会、三分钟上手、五分钟应用,快速上手责任链框架详解 | 京东云技术团队

责任链模式是开发过程中常用的一种设计模式,在SpringMVC、Netty等许多框架中均有实现。我们日常的开发中如果要使用责任链模式,通常需要自己来实现,但自己临时实现的责任链既不通用,也很容易产生框架与业务代码耦合不清的问题,增加Code Review 的成本。

美团面试:说说Netty的零拷贝技术?

零拷贝技术(Zero-Copy)是一个大家耳熟能详的技术名词了,它主要用于提升 IO(Input & Output)的传输性能。 那么问题来了,为什么零拷贝技术能提升 IO 性能? 1.零拷贝技术和性能 在传统的 IO 操作中,当我们需要读取并传输数据时,我们需要在用户态(用户空间)和内核态(内核空

面试官:说说Netty对象池的实现原理?

Netty 作为一个高性能的网络通讯框架,它内置了很多恰夺天工的设计,目的都是为了将网络通讯的性能做到极致,其中「对象池技术」也是实现这一目标的重要技术。 1.什么是对象池技术? 对象池技术是一种重用对象以减少对象创建和销毁带来的开销的方法。在对象池中,只有第一次访问时会创建对象,并将其维护在内存中

拼多多面试:Netty如何解决粘包问题?

粘包和拆包问题也叫做粘包和半包问题,它是指在数据传输时,接收方未能正常读取到一条完整数据的情况(只读取了部分数据,或多读取到了另一条数据的情况)就叫做粘包或拆包问题。 从严格意义上来说,粘包问题和拆包问题属于两个不同的问题,接下来我们分别来看。 1.粘包问题 粘包问题是指在网络通信中,发送方连续发送

滴滴面试:谈谈你对Netty线程模型的理解?

Netty 线程模型是指 Netty 框架为了提供高性能、高并发的网络通信,而设计的管理和利用线程的策略和机制。 Netty 线程模型被称为 Reactor(响应式)模型/模式,它是基于 NIO 多路复用模型的一种升级,它的核心思想是将 IO 事件和业务处理进行分离,使用一个或多个线程来执行任务的一

面试官:说说Netty的核心组件?

Netty 核心组件是指 Netty 在执行过程中所涉及到的重要概念,这些核心组件共同组成了 Netty 框架,使 Netty 框架能够正常的运行。 Netty 核心组件包含以下内容: 启动器 Bootstrap/ServerBootstrap 事件循环器 EventLoopGroup/EventL

Springboot集成Netty实现TCP通讯

Netty