再聊t-io网络编程架构的基础知识:半包和粘包

爱写码 等级 45 1 0

半包 顾名思义,就是收到了半个包,这个时候不足以组成一个应用层的包。就像你要对你喜欢的人说“我喜欢你”,但是因为喝水咽着了,第一次只说了“我”字,第二次说了个“喜”字,第三个次了个“欢你”,那么就发生了半包问题,对方只有等待你说完这4个字后才知道你是想说“我喜欢你”!

用http协议为例,展示半包场景 再聊t-io网络编程架构的基础知识:半包和粘包 粘包 粘包与半包相反,就是把多个想说的话,一口气说完了,对方反应不过来,得把你的话拆开一条一条地理解

用http协议为例,展示粘包场景 再聊t-io网络编程架构的基础知识:半包和粘包 说明:http协议是一来一回的,所以正常场景是不会有粘包的,但pipeline模式下是允许一方连续发多个请求的,所以会有粘包产生 为何坑人无数 初涉网络编程的同学,往往认为每次收到的数据刚好是一个完整的数据包

于是当网络不好,或是消息包过大时,半包的情况就发生了,而程序并没有考虑到半包的情况,结果就是解码失败,导致消息丢失

当通信的对方把多条业务数据包放在一个TCP包中发过来时,粘包就产生了,而程序没有考虑到一次TCP收包会收到多个业务包,从而解析到第一个业务包后把后面的业务包丢弃了

百度一下半包粘包,一定会搜到很多记录,这也证明这俩货确实坑人无数,所以看完本节内容,你还会继续犯半包粘包的错吗?

具体请参考:https://www.tiocloud.com/doc/tio/84

收藏
评论区

相关推荐

HTTP 的本质?HTTP 和 RPC 的区别?
身为 Java Web 开发我发现很多人一些 Web 基础问题都答不上来。 上周我面试了一个三年经验的小伙子,一开始我问他 HTTP/1、HTTP/2相关的他到是能答点东西出来。 后来我问他:你怎么理解 HTTP 的,HTTP 的作用是什么? 他支支吾吾答不出来。 经过了一番引导交谈,他回答是用来客户端和服务端之间传输的。 我接着问那你知道什么是
LAE软件开发工具界面介绍
lae工具基本简介 ![](http://static.oschina.net/uploads/space/2016/0727/141728_vOby_2859408.png)  一、 菜单 1、 文件:主要有新建、打开、保存、另存为、退出功能,lae所新建的项目实际上是一个目录和一些模板文件,所编辑的UI文件都将保存到该目录下。 2、 编辑:主要有
TCP协议粘包问题详解
TCP协议粘包问题详解 =========== 前言 -- 在本章节中,我们将探讨TCP协议基于流式传输的最大一个问题,即粘包问题。本章主要介绍TCP粘包的原理与其三种解决粘包的方案。并且还会介绍为什么UDP协议不会产生粘包。 基于TCP协议的socket实现远程命令输入 ---------------------- 我们准备做一个可以在Clie
TCP的粘包问题以及数据的无边界性
服务端: #include <stdio.h> #include <winsock2.h> #pragma comment (lib, "ws2_32.lib")  //加载 ws2_32.dll   #define BUF_SIZE 100   int main(int argc, char *ar
Vertx eventbus模块解析
eventbus 事件總線 ============= #### 協議棧 TCP分包,粘包解決採用方案: 消息定长(定義消息体總长度),消息分为消息头和消息体 dataType bytes description int 4 包体总大小 code: << buffer.setInt(0, buffer.length() - 4) >> by
Voovan开发指南 (一) Socket服务端开发
Voovan 框架介绍 > Voovan开源项目启动于2015年,始于自己在使用 Netty 和 Mina 时有较多难以理解的部分,同时在使用过程中遇到对粘包等问题的困扰,后来经过不断的对源码的学习以及对 java 异步通信的深入理解发现 自 java 1.7以后 JDK 提供了更优秀的异步通信模型 AIO,随后决定自己参照 AIO 模型重新造一个轮子。并
Voovan开发指南 (二) Socket客户端开发
Voovan 框架介绍 > Voovan开源项目启动于2015年,始于自己在使用 Netty 和 Mina 时有较多难以理解的部分,同时在使用过程中遇到对粘包等问题的困扰,后来经过不断的对源码的学习以及对 java 异步通信的深入理解发现 自 java 1.7以后 JDK 提供了更优秀的异步通信模型 AIO,随后决定自己参照 AIO 模型重新造一个轮子。并
Dubbo处理TCP拆包粘包问题
#Dubbo处理TCP拆包粘包问题 在TCP网络传输工程中,由于TCP包的缓存大小限制,每次请求数据有可能不在一个TCP包里面,或者也可能多个请求的数据在一个TCP包里面。那么如果合理的decode接受的TCP数据很重要,需要考虑TCP拆包和粘包的问题。我们知道在Netty提供了各种Decoder来解决此类问题,比如`LineBasedFrameDecod
Linux(CentOS7)下如何配置多个Tomcat容器
### 一、Linux版本 ![](https://oscimg.oschina.net/oscnet/f131d8b59bce1fbb0f65f763fe1083d63dc.png) ### 二、上传并解压apache-tomcat-7.0.90压缩包,然后复制粘贴出来多个tomcat > 解压缩 tar -xzvf apache-tomc
Netty中粘包和拆包的解决方案
粘包和拆包是TCP网络编程中不可避免的,无论是服务端还是客户端,当我们读取或者发送消息的时候,都需要考虑TCP底层的粘包/拆包机制。 ### TCP粘包和拆包 TCP是个“流”协议,所谓流,就是没有界限的一串数据。TCP底层并不了解上层业务数据的具体含义,它会根据TCP缓冲区的实际情况进行包的划分,所以在业务上认为,一个完整的包可能会被TCP拆分成多个包
Netty之粘包问题解决
最近接到一项新的任务,其中涉及到用netty解决粘包问题,该问题解决得很顺利。下面是一些心得体会。 我们知道,netty当中有boss线程和worker线程,通常是1对多的关系,可以理解为boss接到客户的请求之后,分配给其中一个worker去处理,如果客户过多,可能会出现一个worker服务多个客户的情况。这是背景。 按照我的理解,粘包问题解决的关键在
Netty使用解码器Decoder解决TCP粘包和拆包问题
解码器Decoder和ChannelHandler的关系 ---------------------------- netty的解码器通常是继承自ByteToMessageDecoder,而它又是继承自ChannelInboundHandlerAdapter,其实也是一种ChannelHandler和我们自定义的ChannelHandler一样都是来处理进
Netty解决TCP粘包和拆包问题的四种方案
 在RPC框架中,TCP粘包和拆包问题是必须解决一个问题,因为RPC框架中,各个微服务相互之间都是维系了一个TCP长连接,比如dubbo就是一个全双工的长连接。由于微服务往对方发送信息的时候,所有的请求都是使用的同一个连接,这样就会产生粘包和拆包的问题。本文首先会对TCP粘包和拆包问题进行描述,然后介绍其常用的解决方案,最后会对Netty提供的几种解决方案进
tcp粘包与udp丢包的原因
tcp粘包与udp丢包的原因 ============== 一,什么是tcp粘包与udp丢包 ---------------- TCP是面向流的, 流要说明就像河水一样, 只要有水, 就会一直流向低处, 不会间断. TCP为了提高传输效率, 发送数据的时候, 并不是直接发送数据到网路, 而是先暂存到系统缓冲, 超过时间或者缓冲满了, 才把缓冲区的内容发送
再聊t-io网络编程架构的基础知识:半包和粘包
半包顾名思义,就是收到了半个包,这个时候不足以组成一个应用层的包。就像你要对你喜欢的人说“我喜欢你”,但是因为喝水咽着了,第一次只说了“我”字,第二次说了个“喜”字,第三个次了个“欢你”,那么就发生了半包问题,对方只有等待你说完这4个字后才知道你是想说“我喜欢你”!用http协议为例,展示半包场景粘包粘包与半包相反,就是把多个想说的话,一口气说完了,对方反应