一文搞清楚netty通信原理及数据包传输机制

@TOPC

技术栈:Java 17 / Kotlin 2.1.10 / Netty 4.1.110.Final / Spring Boot 3.2.10

目录


1. 项目背景

ey-netty 是一个基于 Netty 4.x 的轻量级长连接通信框架,封装了 TCP 长连接场景下常见的通信需求。
核心能力一览

能力 说明
长连接管理 连接建立后持续保持,支持双向通信
自定义二进制协议 基于 LengthFieldBasedFrameDecoder 的私有帧格式,含魔数校验
协议自动探测 服务端自动识别二进制/文本协议,动态切换 Pipeline Handler
粘包/拆包 通过帧头 length 字段精确拆包,最大帧 8MB
心跳保活 双向心跳机制,客户端写空闲发送 PING,服务端回复 PONG
自动重连 等差延迟重试 + 周期性重试,支持自定义参数
同步/异步发送 支持 requestId 匹配的同步请求-响应模式,以及 fire-and-forget 异步模式
消息推送 服务端支持全量广播、精确推送
生命周期自愈 服务端内置心跳自检,连续异常自动重启

2. 整体架构

在这里插入图片描述
架构由 netty-server(服务端)netty-client(客户端) 组成,双方通过 TCP 长连接 进行通信,使用自定义二进制协议作为应用层协议。

  • 服务端:基于 ServerBootstrap + NioEventLoopGroup 监听端口,接受客户端连接并管理 Channel 连接池。
  • 客户端:基于 Bootstrap 发起连接,支持断线自动重连、同步/异步消息发送。

3. 自定义二进制协议

3.1 协议设计目标

TCP 是流式协议,数据以字节流形式传输,不保证消息边界。ey-netty 定义了一套私有二进制帧格式来解决这个问题,核心设计要点:

  1. 通过魔数标识帧的开头,便于协议探测和完整性校验。
  2. 通过 length 字段声明帧体长度,实现精确拆包。
  3. 通过 requestId 匹配请求与响应,支持同步等待。
  4. 通过 type 字段区分消息类别(心跳、文本、业务消息)。

3.2 完整帧结构

在这里插入图片描述
客户端→服务端完整帧结构

偏移 字段 大小 说明
0 magic_preamble 4 bytes 魔数 0x54656D70(“Temp” 的 ASCII),用于协议探测
4 length 4 bytes
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

沙漠绿州

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值