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里面的序列化反序列化以及拆包粘包的更多相关文章

  1. Netty 拆包粘包和服务启动流程分析

    Netty 拆包粘包和服务启动流程分析 通过本章学习,笔者希望你能掌握EventLoopGroup的工作流程,ServerBootstrap的启动流程,ChannelPipeline是如何操作管理Ch ...

  2. 【转】Netty 拆包粘包和服务启动流程分析

    原文:https://www.cnblogs.com/itdragon/archive/2018/01/29/8365694.html Netty 拆包粘包和服务启动流程分析 通过本章学习,笔者希望你 ...

  3. tomcat Http11NioProtocol如何解析http请求及如何解决TCP拆包粘包

    前言 tomcat是常用的Web 应用服务器,目前国内有很多文章讲解了tomcat架构,请求流程等,但是没有如何解析http请求及如何解决TCP粘包拆包,所以这篇文章的目的就是介绍这块内容,一下内容完 ...

  4. 使用Netty如何解决拆包粘包的问题

    首先,我们通过一个DEMO来模拟TCP的拆包粘包的情况:客户端连续向服务端发送100个相同消息.服务端的代码如下: AtomicLong count = new AtomicLong(0); NioE ...

  5. netty拆包粘包

    客户端 tcp udp socket网络编程接口 http/webservice mqtt/xmpp 自定义RPC (dubbo) 应用层 服务端 ServerSocket ss = new serv ...

  6. TCP拆包粘包之分隔符解码器

    TCP以流的方式进行数据传输,上层的应用协议为了对消息进行区分,往往采用如下4种方式. (1)消息长度固定,累计读取到长度总和为定长LEN的报文后,就认为读取到了一个完整的消息:将计数器置位,重新开始 ...

  7. Netty_TCP拆包粘包解决方案

    一.问题 熟悉tcp编程的可能都知道,无论是服务器端还是客户端,当我们读取或者发送数据的时候,都需要考虑TCP底层的粘包/拆包机制. TCP是一个“流”协议,所谓流就是没有界限的遗传数据,大家可以想象 ...

  8. 架构师养成记--20.netty的tcp拆包粘包问题

    问题描述 比如要发ABC DEFG HIJK 这一串数据,其中ABC是一个包,DEFG是一个包,HIJK是一个包.由于TCP是基于流发送的,所以有可能出现ABCD EFGH 这种情况,那么ABC和D就 ...

  9. 网络编程 -- RPC实现原理 -- Netty -- 迭代版本V4 -- 粘包拆包

    网络编程 -- RPC实现原理 -- 目录 啦啦啦 V2——Netty -- new LengthFieldPrepender(2) : 设置数据包 2 字节的特征码 new LengthFieldB ...

随机推荐

  1. 转载:EJB到底是什么

    这篇博客用通俗易懂的语言对EJB进行了介绍,写得很好,笔者在这里转载一下. 链接:https://www.cnblogs.com/strugglion/p/6027318.html

  2. ABAP术语-Accounting Document

    Accounting Document 原文:http://www.cnblogs.com/qiangsheng/archive/2007/12/12/991731.html Accounting d ...

  3. alias,unalias命令

    alias unalias 命令 =================================================[root@sambo ~]# aliasalias cp='cp ...

  4. 迷你MyBank

    该迷你MyBank,存贮是用对象数组来存贮的,所以比较简单,容易理解,适合新手.. 一.创建chengyuan类,在其中声明所需的成员变量: public class chengyuan { //该类 ...

  5. Post 和 Get的区别?

    Post方法: 1. POST 请求的数据不会被缓存 2. Post请求的内容放置在HTML header中,用户是看不到这个过程的.所以是比较安全的 3. Post请求的数据大小没有限制 Get方法 ...

  6. 强化记忆之php

    php 输出的区分 新手摸索道路,有说不对的地方,还请多多包涵. echo 能够输出一个以上的字符串,也能输出html标签 print  一次只能接受一个字符串(区分与echo),也能输出html标签 ...

  7. hadoop生态搭建(3节点)-07.hive配置

    # http://archive.apache.org/dist/hive/hive-2.1.1/ # ================================================ ...

  8. ZooKeeper异常:Error connecting service It is probably not running

    ZooKeeper安装后使用以下命令可以启动成功 bin/zkServer.sh start 但是使用下面命令查看启动状态,则报错误: bin/zkServer.sh status Error con ...

  9. Drupal 网站漏洞修复以及网站安全防护加固方法

    drupal是目前网站系统使用较多一个开源PHP管理系统,架构使用的是php环境+mysql数据库的环境配置,drupal的代码开发较为严谨,安全性较高,但是再安全的网站系统,也会出现网站漏洞,dru ...

  10. 最小生成树算法 1.Prim算法

    最小生成树(MST):一个有N个点的图,边一定是大于等于N-1条边的.在这些边中选择N-1条出来,连接所有N个点.这N-1条边的边权之和是所有方案中最小的. Prim算法的时间复杂度时O(n^2)的, ...