文档章节

RPC粘包拆包

爱宝贝丶
 爱宝贝丶
发布于 2018/12/29 09:46
字数 1195
阅读 103
收藏 0

1. 概念

  • RPC(Remote Procedure Call)泛指客户端与服务器端之间,通过网络进行数据交互的过程时,不需要了解网络底层实现的技术。我们接触的http、WebService、dubbo-rpc、rmi都可以称为是RPC的一种实现技术。
  • RPC的通性:
    • 寻址:客户端是如何知晓服务端具体(ip+端口)地址的;
    • 通讯方式:基于TCP/UDP或是更上层的协议,进行数据通信;
    • 数据序列化:请求响应的过程中,数据使用的序列化方式(xml,json,dubbo);
  • RPC框架:对上述RPC核心步骤进行了封装,不需要开发人员自己去定义协议、实现序列化等细节工作,这样的组件称为RPC框架。出于稳定性和数据可靠性的考虑,RPC框架通常选用TCP长连接作为传输协议。
  • TCP连接的三次握手:首先客户端会向服务器发送一次请求,以确认其能否收到请求,服务器收到请求之后会给客户端一次响应,此时客户端就知道其能够与服务器正常建立连接了,客户端就会向服务器再次发送请求建立连接,这就是TCP的三次握手的机制。
  • TCP连接的四次挥手:客户端在发送完数据之后会发送一次请求给服务端,告知其客户端将会结束数据请求,服务器接收到请求之后会返回一个同意的响应,客户端收到后就不会再发送数据了,但是服务器可能还有数据未发送完,此时处于一种半关闭的状态,等待服务器将数据发送完毕之后,服务器就会发送请求给客户端,告知其服务器可以结束请求了,此时客户端收到请求之后将会发送一次请求给服务器,以告知服务器关闭连接。

2. Socket编程

  • Internet中应用最广泛的网络应用编程接口,实现与3中底层协议接口:

    • 数据报类型套接字SOCK_DGRAM(面向UDP接口)
    • 流式套接字SOCK_STREAM(面向TCP接口)
    • 原始套接字SOCK_RAW(面向网络层协议接口IP、ICMP等)
  • 主要socket API及其调用过程

创建套接字-->端点绑定-->发送数据-->接收数据-->释放套接字

3. 长连接

  • 短连接:请求/响应之后,关闭已经建立的TCP连接,下次请求再建立一次连接;
  • 长连接:请求/响应之后,不关闭TCP连接,多次请求,复用同一个连接;
  • 为了避免频繁创建连接/释放连接带来的性能损耗,自定义的RPC框架,通常采用长连接的形式。

4. 粘包拆包

  • 粘包:多次请求,通过同一连接进行发送。服务端收到的数据包含了多次请求;
  • 拆包:一次发送的数据大于TCP发送缓冲区(16KB),分成多次进行传输、或者客户端发送的数据不完整。服务端单次收到的数据可能不完整。
  • 拆包的主要原因是RPC调用的时候,客户端向服务器发送多次请求时是使用的同一个连接,因而这些请求的数据是绑定在一起的,而由于TCP发送数据是有一个缓冲区的,这个缓冲区的大小为16KB,因而这些请求的数据发送到服务端之后,服务端每次接收的都可能是不完整的,因而服务端需要对发送过来的数据进行合并,一般客户端在发送数据时会定义一个分隔符,服务端在将数据合并之后再通过这个分隔符将数据进行拆分即可得到每个客户端发送的数据。

5. 实现Netty服务端

  • Netty提供异步的、事件驱动的网络应用程序框架和工具,用以快速开发高性能、高可靠性的网络服务器和客户端程序;在保证易于开发的同事还保证了其应用的性能,稳定性和伸缩性。

6. 定义解码(拆分)规则

  • 数据的编解码规则是RPC协议的一部分,不同的协议,拆分方式不同。比如:Dubbo、gRpc、Motan-RPC、SOFA-RPC各有不同;

© 著作权归作者所有

上一篇: 分布式事务
下一篇: https加密
爱宝贝丶

爱宝贝丶

粉丝 340
博文 136
码字总数 456051
作品 0
武汉
程序员
私信 提问
Netty精粹之TCP粘包拆包问题

粘包拆包问题是处于网络比较底层的问题,在数据链路层、网络层以及传输层都有可能发生。我们日常的网络应用开发大都在传输层进行,由于UDP有消息保护边界,不会发生这个问题,因此这篇文章只...

Float_Luuu
2016/02/27
17.9K
0
Netty解决粘包和拆包问题的四种方案

在RPC框架中,粘包和拆包问题是必须解决一个问题,因为RPC框架中,各个微服务相互之间都是维系了一个TCP长连接,比如dubbo就是一个全双工的长连接。由于微服务往对方发送信息的时候,所有的请...

爱宝贝丶
03/18
4.7K
15
【Netty】Netty实例开源项目

版权声明:本文为谙忆原创文章,转载请附上本文链接,谢谢。 https://blog.csdn.net/qq_26525215/article/details/81989644 Netty netty-not-sticky-pack-demo 项目地址 Netty 本篇博客讲解:...

谙忆
2018/08/23
0
0
Netty 粘包/拆包应用案例及解决方案分析

熟悉TCP变成的可以知道,无论是客户端还是服务端,但我们读取或者发送消息的时候,都需要考虑TCP底层粘包/拆包机制,下面我们先看一下TCP 粘包/拆包和基础知识,然后模拟一个没有考虑TCP粘包...

Java/Python
2018/08/21
0
0
DotNetty 版 开源 mqtt 客户端 (MqttFx)

一、DotNetty背景介绍 某天发现 dotnet 是个好东西,就找了个项目来练练手。于是有了本文的 Mqtt 客户端 (github: MqttFx ) DotNetty是微软的Azure团队,使用C#实现的Netty的版本发布。不但使...

linfx
2018/10/08
0
0

没有更多内容

加载失败,请刷新页面

加载更多

会用python把linux命令写一遍的人,进大厂有多容易?

看过这篇《2000字谏言,给那些想学Python的人,建议收藏后细看!》的读者应该都对一个命令有点印象吧?没错,就是 linux 中经常会用到的 ls 命令。 文章中我就提到如何提升自己的 python 能力...

上海小胖
16分钟前
4
0
HashMap的特性

一、hashmap数据结构:哈希表结构:数组+链表 hashmap调用默认构造方法会产生一个默认底层是长度为16的Entry数组,首先调用key的hasCode()方法来得到一个整数, int hash = hash(key.hashCode...

GGbird
17分钟前
15
0
第五章 spring-connet之Imports注解来龙去脉

前言 imports是一个在spring体系里非常重要的注解,基本每个Enable开头的注解必然有一个import注解。接下来我们深入研究下import的作用。看小节的同学建议先取看PostProcessorRegistrationDe...

鸟菜啊
20分钟前
3
0
CentOS部署Harbor镜像仓库

关于Harbor Harbor是用于存储和分发Docker镜像的镜像仓库服务,相比Docker Registry,Harbor在安全、标识、管理等方面做了增强,更适合企业使用; 官方网站:https://goharbor.io/ 官方开源:...

程序员欣宸
25分钟前
4
0
JavaScript调试必会的8个console方法

每个JavaScript开发者都用过console.log()来调试程序,但实际上Console对象还提供了很多其他方法可以提高调试效率。本文将介绍8个有趣的Console方法,即使JavaScript老手也不一定知道! 1、c...

汇智网教程
47分钟前
7
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部