您当前的位置:首页 > 电脑百科 > 网络技术 > 网络技术

TCP 粘包、半包 Netty 全搞定

时间:2020-10-14 11:32:26  来源:  作者:

什么是粘包和半包?

粘包的主要原因:

• 发送方每次写入数据 < 套接字缓冲区大小

• 接收方读取套接字缓冲区数据不够及时

半包的主要原因:

• 发送方写入数据 > 套接字缓冲区大小

• 发送的数据大于协议的 MTU(Maximum Transmission Unit,最大传输单元),必须拆包

TCP 粘包、半包 Netty 全搞定

 


TCP 粘包、半包 Netty 全搞定

 

为什么 TCP 应用中会出现粘包和半包现象?

根本原因:

TCP 是流式协议,消息无边界。

提醒:UDP 像邮寄的包裹,虽然一次运输多个,但每个包裹都有“界限”,一个一个签收,

所以无粘包、半包问题。

 

解决粘包和半包问题的几种常用方法

 

解决问题的根本手段:找出消息的边界

Netty 对三种常用封帧方式的支持

 

TCP 粘包、半包 Netty 全搞定

 

实战中使用 protobuf 协议系列化:

protobuf是google序列化的工具,主要是把数据序列化成二进制的数据来传输用的。它主要优点如下:

1.性能好,效率高;

2.跨语言(JAVA自带的序列化,不能跨语言)

其实,在netty中使用Protobuf需要注意的是:

protobufDecoder仅仅负责编码,并不支持读半包,所以在之前,一定要有读半包的处理器。

有三种方式可以选择

TCP 粘包、半包 Netty 全搞定

 

使用netty提供ProtobufVarint32FrameDecoder

继承netty提供的通用半包处理器 LengthFieldBasedFrameDecoder

继承ByteToMessageDecoder类,自己处理半包

 

TCP 粘包、半包 Netty 全搞定

 


TCP 粘包、半包 Netty 全搞定

 

解读 Netty 处理粘包、半包的源码

 

• 一次解码器:ByteToMessageDecoder

• io.netty.buffer.ByteBuf (原始数据流)-> io.netty.buffer.ByteBuf (用户数据)

TCP 粘包、半包 Netty 全搞定

 

• 二次解码器:MessageToMessageDecoder<I>

• io.netty.buffer.ByteBuf (用户数据)-> Java Object

TCP 粘包、半包 Netty 全搞定

 

选择编解码方式的要点

 

• 空间:编码后占用空间

需要比较不同的数据大小情况

https://www.howtoautomate.in.th/protobuf-101/2017-05-06-10_30_22-serialization-performance-comparisonxmlbinaryjsonp/

TCP 粘包、半包 Netty 全搞定

 

• 时间:编解码速度

需要比较不同的数据大小情况

https://www.howtoautomate.in.th/protobuf-101/2017-05-06-10_30_34-serialization-performance-comparisonxmlbinaryjsonp/

 

大多数都会选择 Google Protobuf

 Google Protobuf【 简介与使用】

• Protobuf 是一个灵活的、高效的用于序列化数据的协议。

• 相比较 XML 和 JSON 格式,Protobuf 更小、更快、更便捷。

• Protobuf 是跨语言的,并且自带了一个编译器(protoc),只需要用它进行编译,可

以自动生成 Java、Python、C++ 等代码,不需要再写其他代码。

 

[ 写法比较简单 网上很多例子 可以参考 ]



Tags:粘包   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,如有任何标注错误或版权侵犯请与我们联系(Email:2595517585@qq.com),我们将及时更正、删除,谢谢。
▌相关推荐
一、开篇经过上次文章的铺垫,相信大家对 java 的 NIO 有了一些感性的认识,也初步了解了它的 API 了,可以开始去阅读 Kafka Producer 端的发送消息的部分了。突然想感叹一下,阅读...【详细内容】
2021-08-11  Tags: 粘包  点击:(65)  评论:(0)  加入收藏
TCP/IP 协议簇建立了互联网中通信协议的概念模型,该协议簇中的两个主要协议就是 TCP 和 IP 协议。TCP/ IP 协议簇中的 TCP 协议能够保证数据段(Segment)的可靠性和顺序,有了可靠的传输层协议之后,应用层协议就可以直接使用...【详细内容】
2020-10-21  Tags: 粘包  点击:(71)  评论:(0)  加入收藏
什么是粘包和半包?粘包的主要原因:&bull; 发送方每次写入数据 < 套接字缓冲区大小&bull; 接收方读取套接字缓冲区数据不够及时半包的主要原因:&bull; 发送方写入数据 > 套接字...【详细内容】
2020-10-14  Tags: 粘包  点击:(98)  评论:(0)  加入收藏
一、什么是TCP的拆包和粘包?粘包:比如客户端发送了第一个数据包内容为abc,然后又发送了第二个数据包为bcd,服务端接收到了数据,内容是abcbcd,对于接收数据的服务端来说,是无法区分...【详细内容】
2020-09-01  Tags: 粘包  点击:(80)  评论:(0)  加入收藏
UDP(user datagram protocol,用户数据报协议)是无连接的,面向消息的,提供高效率服务。不会使用块的合并优化算,, 由于UDP支持的是一对多的模式,所以接收端的skbuff(套接字缓冲区)采...【详细内容】
2020-05-29  Tags: 粘包  点击:(53)  评论:(0)  加入收藏
基本概念 TCP本质上是数据流,从原理上看,没有包的概念,TCP包对应用程序员可以是透明的。 粘包实际上是把底层包的实现和上层流的概念混在一起。 粘包问题本质上是如何确定数据...【详细内容】
2020-05-25  Tags: 粘包  点击:(97)  评论:(0)  加入收藏
在网络传输中,粘包和半包应该是最常出现的问题,作为 Java 中最常使用的 NIO 网络框架 Netty,它又是如何解决的呢?今天就让我们来看看。定义TCP 传输中,客户端发送数据,实际是把数...【详细内容】
2019-10-23  Tags: 粘包  点击:(125)  评论:(0)  加入收藏
TCP是个“流”协议,所谓流,就是没有界限的一串数据。可以想想河里的流水,是连成一片的,其间并没有分界线。TCP底层并不了解上层业务数据的具体含义,它会根据TCP缓冲区的实际情况...【详细内容】
2019-08-28  Tags: 粘包  点击:(213)  评论:(0)  加入收藏
▌简易百科推荐
写一个shell获取本机ip地址、网关地址以及dns信息。经常会遇到取本机ip、网关、dns地址,windows一个命令ipconfig /all全部获取到,但linux系统却并非如此。linux系统都自带ifc...【详细内容】
2021-12-27  K佬食古    Tags:shell   点击:(1)  评论:(0)  加入收藏
步骤1、配置 /etc/sysconfig/network-scripts/ifcfg-eth0 里的文件。it动力的CentOS下的ifcfg-eth0的配置详情:[root@localhost ~]# vim /etc/sysconfig/network-scripts/ifc...【详细内容】
2021-12-24  忆梦如风    Tags:网卡   点击:(9)  评论:(0)  加入收藏
1、查找当前目录下所有以.tar结尾的文件然后移动到指定目录find . -name “*.tar” -execmv {}./backup/ ;注解:find &ndash;name 主要用于查找某个文件名字,-exec 、xargs可...【详细内容】
2021-12-17  郭主任    Tags:运维   点击:(18)  评论:(0)  加入收藏
对于经常上网的朋友来说,除了手机购物上网,pc端玩网页游戏还是很多小伙伴首选的,但是有时候明明宽带链接上了,打开浏览器却出现上不了网的现象,下面小编要来跟大家说说电脑有网络...【详细内容】
2021-12-16  小白系统    Tags:网页无法打开   点击:(28)  评论:(0)  加入收藏
在访问像github、gitlab这样的外国网站时,很有可能会出现页面加载不出来或找不到页面的错误。这时候有的朋友就会以为是网络的问题,于是把Wifi断掉连上自己手机的热点,结果却还...【详细内容】
2021-12-15  启施技术IT狼叔    Tags:外网   点击:(14)  评论:(0)  加入收藏
网络地址来源:获取公网IP地址 https://ipip.yy.com/get_ip_info.phphttp://pv.sohu.com/cityjson?ie=utf-8http://www.ip168.com/json.do?view=myipaddress...【详细内容】
2021-12-15  韦廷华12    Tags:外网ip   点击:(14)  评论:(0)  加入收藏
准备好软件IPOP、用ENSP模拟一下华为交换机 启动交换机 <Huawei>sysEnter system view, return user view with Ctrl+Z.[Huawei]sysname FTPClient[FTPClient]interface vla...【详细内容】
2021-12-15  思源Edward    Tags:交换机   点击:(22)  评论:(0)  加入收藏
我们经常用到netstat命令查看主机连接状况,包括连接ip、端口、状态等,今天就练习下shell分析netsat结果。描述假设netstat命令运行的结果我们存储在nowcoder.txt里,格式如下:Pro...【详细内容】
2021-12-14  K佬食古    Tags:netstat   点击:(19)  评论:(0)  加入收藏
什么是滑动窗口?窗口是操作系统开辟的一块缓存空间,发送方在收到接收方ACK应答之前,必须在缓冲区保留已发送的数据,如果按期收到确认应答,数据就可以从缓冲区移除。什么是滑动窗...【详细内容】
2021-12-14  DifferentJava    Tags:TCP   点击:(28)  评论:(0)  加入收藏
概述日常管理华为路由设备过程中,难为会忘记设备登录密码,那么该如何重置设备登录密码吗?本期文章将全面向各位小伙伴总结分享。重置华为设备登录密码思路先行 采用console登录...【详细内容】
2021-12-10  onme0    Tags:   点击:(26)  评论:(0)  加入收藏
最新更新
栏目热门
栏目头条