NETTY-Netty的粘包和半包
写在前面
最近接触了几个开源的框架,看看代码,发现都用到了netty,于是,打算比较彻底的了解一下。
基本概念
TCP 传输中,客户端发送数据,实际是把数据写入到了 TCP 的缓存中,粘包和半包也就会在此时产生。
客户端给服务端发送了两条消息ABC和DEF,服务端这边的接收会有多少种情况呢?有可能是一次性收到了所有的消息ABCDEF,有可能是收到了三条消息AB、CD、EF。
粘包
- 发送方每次写入数据 < 套接字缓冲区大小
- 接收方读取套接字缓冲区数据不够及时
上面所说的一次性收到了所有的消息ABCDEF,类似于粘包。如果客户端发送的包的大小比 TCP 的缓存容量小,并且 TCP 缓存可以存放多个包,那么客户端和服务端的一次通信就可能传递了多个包,这时候服务端从 TCP 缓存就可能一下读取了多个包,这种现象就叫粘包。
半包
- 发送方写入数据>套接字缓冲区大小
- 发送的数据大于协议的MTU(Maximum Transmission Unit,最大传输单元),必须拆包
上面说的后面那种收到了三条消息AB、CD、EF,类似于半包。如果客户端发送的包的大小比 TCP 的缓存容量大,那么这个数据包就会被分成多个包,通过 Socket 多次发送到服务端,服务端第一次从接受缓存里面获取的数据,实际是整个包的一部分,这时候就产生了半包(半包不是说只收到了全包的一半,是说收到了全包的一部分)。
根本原因
为什么会出现粘包和半包呢?因为TCP是流式协议,消息无边界。
那么UDP呢?UDP像是邮寄包裹一样,虽然一次可以邮寄多个,但是每一个包裹都有一定的界限,一个一个签收,所以没有粘包和半包的问题。
如何解决
虽然TCP是流失协议,让消息没有了边界,但是每一个消息都是有界限的。所以那就让消息有一个明确的界限。这样消息的划分就很清楚了。
如何找出消息的边界呢?
Netty如何支持呢
大家可以直接下载源码,进行查看。
NETTY-Netty的粘包和半包相关推荐
- TCP 粘包、半包 Netty 全搞定
什么是粘包和半包? 粘包的主要原因: • 发送方每次写入数据 < 套接字缓冲区大小 • 接收方读取套接字缓冲区数据不够及时 半包的主要原因: • 发送方写入数据 > 套接字缓冲区大小 • ...
- Netty——ByteBuffer(ByteBuffer消息粘包、半包示例)
目录 一. ByteBuffer消息粘包.消息半包的概述 二.示例需求 三.示例代码 一. ByteBuffer消息粘包.消息半包的概述 NIO是面向缓冲区进行通信的,不是面向流的.既然是缓冲区,那它 ...
- Java NIO 框架 Netty 之美:粘包与半包问题
Netty 是一个可以快速开发网络应用程序的 NIO 框架,它大大简化了 TCP 或者 UDP 服务器的网络编程.Netty 的简易和快速开发并不意味着由它开发的程序将失去可维护性或者存在性能问题,它 ...
- 透过现象看本质,我找到了Netty粘包与半包的这几种解决方案
1.粘包与半包 啥也不说了,直接上代码是不是有点不太友好,我所谓了,都快过年了,还要啥自行车 我上来就是一段代码猛如虎 1.1 服务器代码 public class StudyServer {stat ...
- 透过现象看本质,我找到了Netty粘包与半包的这几种解决方案。
1.粘包与半包 啥也不说了,直接上代码是不是有点不太友好,我所谓了,都快过年了,还要啥自行车 我上来就是一段代码猛如虎 1.1 服务器代码 public class StudyServer {stat ...
- netty半包粘包 处理_Java NIO 框架 Netty 之美:粘包与半包问题
一.前言 Netty 是一个可以快速开发网络应用程序的 NIO 框架,它大大简化了 TCP 或者 UDP 服务器的网络编程.Netty 的简易和快速开发并不意味着由它开发的程序将失去可维护性或者存在性 ...
- Netty - 粘包和半包(上)
在网络传输中,粘包和半包应该是最常出现的问题,作为 Java 中最常使用的 NIO 网络框架 Netty,它又是如何解决的呢?今天就让我们来看看. 定义 TCP 传输中,客户端发送数据,实际是把数据写 ...
- netty中的粘包和半包
在网络传输中,粘包和半包应该是最常出现的问题,作为 Java 中最常使用的 NIO 网络框架 Netty,它又是如何解决的呢?今天就让我们来看看. 一.定义 TCP 传输中,客户端发送数据,实际是把数 ...
- Netty粘包与半包问题解析与处理
Netty专题 Netty01-NIO详解 Netty02-入门 Netty粘包与半包问题解析与处理 Netty04-优化与源码 三. Netty 进阶 1. 粘包与半包 1.1 粘包现象 服务端代码 ...
- Netty进阶:粘包与半包-解决方案
短链接 客户端每次向服务器发送数据后,就与服务器断开连接,此时的消息边界为连接建立到连接断开.这时便无需使用滑动窗口等技术来缓冲数据,则不会发生粘包现象.但如果一次性发送数据过多,接收方无法一次性容纳 ...
最新文章
- 【翻译】Ext JS 6 Beta发布
- ITTC数据挖掘平台介绍(四) 框架改进和新功能
- [置顶] Jquery为单选框checkbox绑定单击事件
- 关于图连通性的几道题(水)
- 大型网站架构系列:负载均衡详解(3)
- debian apt-get php,Debian系统apt-get命令整理
- 在docker上和ubuntu上运行InfoGAN
- xUtils3 联网模块
- ypid编码是什么_国家药品供应保障综合管理信息平台YPID编码规则与应用
- rss订阅_RSS订阅
- 争冠,在路上?还是渐行渐远?
- python网格交易法详解_期货交易技巧:等分网格交易法详解
- uniapp swiper组件被内容撑开
- MacBook Pro安装系统指定版本的系统
- 手机端酒店机票预订页面HTMLcss3+html5模板
- Vue+Vant制作单选全选全不选以及删除按钮van-checkbox
- 瓷砖铺贴方法_5种常见的瓷砖铺贴以及施工方法介绍
- Ubuntu18.04录屏并生成gif图片
- 计算机发展的几个重要事件,15件在计算机发展史中具有里程碑意义的事件
- 6 实现多主机间 Docker 容器通信
热门文章
- win7网络id和计算机名有灰色,小编为你演示win7系统网络id按钮是灰色点击不了的具体技巧...
- 大学规划书500字计算机,大学学习计划书500字.doc
- vscode 怎么换字体(标准的那种)
- 二叉树遍历算法详解(递归法+非递归法)
- 【XMind】用A4纸打印超长思维导图的方法!(超简单,不用转换!)
- SQLite DBRecovery 恢复引擎实现微信等苹果手机一些聊天工具删除记录的快速恢复
- Spring配置文件报错问题
- win10 热点开启后 ip4无网络访问权限
- Qt之opengl画钻石
- android+华为pad+自动对焦,华为手机的专业模式你会用吗?打开这6个参数,1秒变单反...