RPC里面的序列化反序列化以及拆包粘包
1.序列化
(1)什么是序列化?
Java的序列化是把对象转换成有序字节流的过程。以便进行网络传输或者保存到本地。
(2)为什么要序列化?
当两个进程进行远程通信时,如果需要发送各种各样的数据,文本、音频、文件、对象等,
在发送这些数据之前,都要把这些数据变成二进制流,才能在网络上进行传输,序列化就
是把这些数据变成有序字节流的过程。
2.序列化工具
(1)Java原生序列化
缺点:
无法跨语言
序列化之后结果太大
序列化效率差
(2)Hessian
(3)thrift
(4)JBoss Marshalling
(5)kryo
(6)MessagePack、kryo、hession和Json
编码和解码
3.TCP的拆包和粘包
先看两个应用场景:
(1)客户端和服务端建立一个连接,客户端发送一条消息,各户端关闭与服务端的连接
(2)客户端和服务端建立一个连接,客户端发一条消息,客户端再次发送消息,客户端关闭与服务端的连接
I. 正常包:对于第一种情况,服务端在不停接收客户端传过来的数据,当客户端断开连接后,服务端知道数据接收完了,开始处理。
II.粘包:对于第二种情况,服务端就读到了一个数据包,如果还是用同一个逻辑处理就有问题了,因为服务端会把两条消息按照一条消息来处理。它不知道第一条
消息在哪结束,第二条消息从哪开始,即两条消息被放到了同一个数据包,这种情况就叫做粘包
III.拆包:服务器收到了两个数据包,第一个数据包只包含了第一条消息的一部分,第二个数据包含了第一条消息的一部分和第二条消息全部,
即同一条消息被拆到两个数据包发送了,这种情况就叫做拆包
产生拆包和粘包的原因:
3个前置知识点:
I. tcp是以流动的方式传输数据,传输的最小单位是报文段(Segment)。
II. tcp Header中有个Option标识位,常见的标识叫mss(Max Segment Size),意思是连接层每次传输数据的最大限制(MTU),一般是1500bit,超过这个
数字要分成多个报文段去传输,mss则是最大限制减去Header的长度,就是只是数据包的大小,大约是1460bit,也就是180字节(B)
III. tcp为提高性能,会把要发送的数据先放到网络缓冲区(大小可在程序里设定),等缓冲区满了之后,再将缓冲区中的数据发送到接收方,同理接收方也有缓冲区这样的机制来接收数据。
拆包:应用程序写入缓冲区的消息,大于缓冲区的大小,一次写不完,即一条消息要分到多个数据包来写,就发生的拆包;
或者:进行mss(最大报文长度分段),当tcp报文长度 - Header > mss时,也会发生拆包。
粘包:应用程序一次写入缓冲区的消息小于缓冲区的大小,缓冲区等下一个或多个消息写入,写满之后,发到服务端,即一个数据包里有多条消息,就发生的拆包
或者:接收方未及时读取缓冲区的内容,导到缓冲区有多条消息,就导致粘包
一个缓冲区可以有多个segment,如果segment和缓冲区大小相等,segment里面报文长度也刚好是一条消息,这时候不会发生拆包或粘包。
如何解决拆包的粘包呢?
方法I: 使用带消息头的协议,消息头存储消息开始标识和消息长度,服务端获取到消息头时,解析出消息长度,然后后后读取该消息内容,如:0000000036{"type":"message","content":"hello"}
方法II: 设置定长消息,服务端每次读取即定长度为一条消息。报文大小固定长度,不够空格补全,发送和接收方遵循相同的约定,这样即使粘包了通过接收方编程实现获取定长报文也能区分。https://blog.csdn.net/zbw18297786698/article/details/53678323
方法III: 设置消息边界,服务端按消息边界从网络流中读取内容。比如:{"type":"message","content":"hello"}\n
RPC里面的序列化反序列化以及拆包粘包的更多相关文章
- Netty 拆包粘包和服务启动流程分析
Netty 拆包粘包和服务启动流程分析 通过本章学习,笔者希望你能掌握EventLoopGroup的工作流程,ServerBootstrap的启动流程,ChannelPipeline是如何操作管理Ch ...
- 【转】Netty 拆包粘包和服务启动流程分析
原文:https://www.cnblogs.com/itdragon/archive/2018/01/29/8365694.html Netty 拆包粘包和服务启动流程分析 通过本章学习,笔者希望你 ...
- tomcat Http11NioProtocol如何解析http请求及如何解决TCP拆包粘包
前言 tomcat是常用的Web 应用服务器,目前国内有很多文章讲解了tomcat架构,请求流程等,但是没有如何解析http请求及如何解决TCP粘包拆包,所以这篇文章的目的就是介绍这块内容,一下内容完 ...
- 使用Netty如何解决拆包粘包的问题
首先,我们通过一个DEMO来模拟TCP的拆包粘包的情况:客户端连续向服务端发送100个相同消息.服务端的代码如下: AtomicLong count = new AtomicLong(0); NioE ...
- netty拆包粘包
客户端 tcp udp socket网络编程接口 http/webservice mqtt/xmpp 自定义RPC (dubbo) 应用层 服务端 ServerSocket ss = new serv ...
- TCP拆包粘包之分隔符解码器
TCP以流的方式进行数据传输,上层的应用协议为了对消息进行区分,往往采用如下4种方式. (1)消息长度固定,累计读取到长度总和为定长LEN的报文后,就认为读取到了一个完整的消息:将计数器置位,重新开始 ...
- Netty_TCP拆包粘包解决方案
一.问题 熟悉tcp编程的可能都知道,无论是服务器端还是客户端,当我们读取或者发送数据的时候,都需要考虑TCP底层的粘包/拆包机制. TCP是一个“流”协议,所谓流就是没有界限的遗传数据,大家可以想象 ...
- 架构师养成记--20.netty的tcp拆包粘包问题
问题描述 比如要发ABC DEFG HIJK 这一串数据,其中ABC是一个包,DEFG是一个包,HIJK是一个包.由于TCP是基于流发送的,所以有可能出现ABCD EFGH 这种情况,那么ABC和D就 ...
- 网络编程 -- RPC实现原理 -- Netty -- 迭代版本V4 -- 粘包拆包
网络编程 -- RPC实现原理 -- 目录 啦啦啦 V2——Netty -- new LengthFieldPrepender(2) : 设置数据包 2 字节的特征码 new LengthFieldB ...
随机推荐
- POJ 1066--Treasure Hunt(判断线段相交)
Treasure Hunt Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 7857 Accepted: 3247 Des ...
- ABAP术语-Lock Mode
Lock Mode 原文:http://www.cnblogs.com/qiangsheng/archive/2008/02/29/1085732.html Status that determine ...
- Mac系统升级后在终端输入git命令时遇到的问题
Mac系统升级git会找不到并且报错:xcrun: error: invalid active developer path (/Library/Developer/CommandLineTools) ...
- 介绍几个PHP 自带的加密解密函数
PHP 自带的加密解密函数 目前经常使用的加密函数有:md5(), sha1(), crypt(), base64_encode(), urlencode() . 其中 md5(), sha1(), ...
- python-三级菜单的优化实现
三级菜单需求: 1.可依次选择进入各子菜单 2.可从任意一层往回退到上一层 3.可从任意一层退出程序 所需新知识点:列表.字典 先通过字典建立数据结构 #创建字典 city_dic = { " ...
- Leecode刷题之旅-C语言/python-101对称二叉树
/* * @lc app=leetcode.cn id=101 lang=c * * [101] 对称二叉树 * * https://leetcode-cn.com/problems/symmetri ...
- codeforces 845A Chess Tourney
参考:https://blog.csdn.net/zhongyuchen/article/details/77478039 #include <iostream> #include < ...
- python2.7练习小例子(二十三)
23):题目:求1+2!+3!+...+20!的和. 程序分析:此程序只是把累加变成了累乘. #!/usr/bin/python # -*- coding: UTF-8 -*- n = ...
- C#窗口抖动
用过QQ的窗口抖动功能吧.是不是觉得很神奇?很有意思?其实,仔细想想,使用的原理还是挺简单的:让窗口的位置不断快速地发生变化. 说出了原理,是不是一下恍然大悟?顿时理解了.我以前也想过如何实现这个功能 ...
- CTS测试笔记
电脑安装12.4乌班图系统 更新源 (1) 打开ubuntu software center (2) 电脑左上角选择edit→software sources…→点击download from,选择o ...