美文网首页
Netty的拆包粘包

Netty的拆包粘包

作者: 摸摸脸上的胡渣 | 来源:发表于2020-02-05 17:20 被阅读0次

包是什么

包的定义:客户端和服务端在发送数据的过程中,每次会以一个数据包的形式进行数据传输,比如登录会发送一个包含账号密码和登录行为标识的包,下线会发送一个包含下线行为标志的包,所以包是以业务维度界定的。

拆包和粘包是什么

粘包的定义:将两个包粘在一起。
拆包的定义:粘包发生后,为了正确的界定包的边界来进行相应的业务逻辑处理,需要对粘在一起的包进行拆解。

所以拆包粘包的定义就是,客户端和服务端会接收到不完整包信息,需要对其进行拆分。

为什么会发生拆包和粘包

Netty在传输层使用的协议是TCP,为了高效的发送数据,每次会以缓冲池为单位进行数据的发送,而我们的数据包,是以业务维度界定,TCP无法理解。
当缓冲池剩余大小 < 单个包大小,客户端会发生拆包,服务端会发生对应的粘包。
当MSS(最大报文长度) < 单个包大小,客户端会发生拆包,服务端会发生对应的粘包。
当缓冲池剩余大小 > 单个包大小,客户端会发生粘包,服务端会发生对应的拆包。

如何解决拆包粘包

  1. 固定长度的拆包器 FixedLengthFrameDecoder
    如果你的应用层协议非常简单,每个数据包的长度都是固定的,比如 100,那么只需要把这个拆包器加到 pipeline 中,Netty 会把一个个长度为 100 的数据包 (ByteBuf) 传递到下一个 channelHandler。

  2. 行拆包器 LineBasedFrameDecoder
    从字面意思来看,发送端发送数据包的时候,每个数据包之间以换行符作为分隔,接收端通过 LineBasedFrameDecoder 将粘过的 ByteBuf 拆分成一个个完整的应用层数据包。

  3. 分隔符拆包器 DelimiterBasedFrameDecoder
    DelimiterBasedFrameDecoder 是行拆包器的通用版本,只不过我们可以自定义分隔符。

  4. 基于长度域拆包器 LengthFieldBasedFrameDecoder
    最后一种拆包器是最通用的一种拆包器,只要你的自定义协议中包含长度域字段,均可以使用这个拆包器来实现应用层拆包。

相关文章

  • Netty系列(3)TCP的粘包拆包问题及方案

    1.概述 1.1 粘包拆包问题描述 1.2 粘包拆包产生的原因 1.3 粘包拆包问题的解决思路 2.Netty中粘...

  • Netty 权威指南笔记(三):TCP 粘包和拆包

    Netty 权威指南笔记(三):TCP 粘包和拆包 什么是 TCP 粘包和拆包? TCP 是一个“流”协议,所谓“...

  • Netty 粘包拆包

    粘包示例 服务端 客户端 自定义协议处理粘包问题

  • Netty-TCP拆包/粘包

    Netty-TCP拆包/粘包 TCP拆包/粘包 TCP 是一个面向字节流的协议,它是性质是流式的,所以它并没有分段...

  • Netty的拆包粘包

    包是什么 包的定义:客户端和服务端在发送数据的过程中,每次会以一个数据包的形式进行数据传输,比如登录会发送一个包含...

  • Netty粘拆包

    本文的示例代码参考NettySticky 目录 准备 NettyStartupProtocolClientServ...

  • Netty粘包与拆包以及解决方式

    本文内容都是学习Netty权威指南一书所写, 主要是为了加深对Netty内容的理解。 Netty 粘包与拆包 TC...

  • netty------拆包粘包

    在上篇博客中介绍了netty的helloworld,本篇来介绍netty的拆包粘包问题。 TCP是一个 流 的协议...

  • Netty TCP 粘包 & 拆包

    粘包/拆包 TCP 的一个数据包可能包含一个、多个或者不足一个应用层数据包,程序需要按照一整个应用包进行处理,这就...

  • netty粘包和拆包

    粘包和拆包是TCP网络编程中不可避免的,无论是服务端还是客户端,当我们读取或者发送消息的时候,都需要考虑TCP底层...

网友评论

      本文标题:Netty的拆包粘包

      本文链接:https://www.haomeiwen.com/subject/snssxhtx.html