3

RPC协议综述_枫叶飘飘的技术博客_51CTO博客

 11 months ago
source link: https://blog.51cto.com/key3feng/7872144
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

RPC协议综述

精选 原创

key_3_feng 2023-10-15 13:54:42 博主文章分类:网络协议 ©著作权

文章标签 网络协议 文章分类 运维 yyds干货盘点 阅读数211

RPC 框架标准模式。

RPC协议综述_网络协议

当客户端的应用想发起一个远程调用时,它实际是通过本地调用本地调用方的 Stub。它负责将调用的接口、方法和参数,通过约定的协议规范进行编码,并通过本地的 RPCRuntime 进行传输,将调用网络包发送到服务器。

服务器端的 RPCRuntime 收到请求后,交给提供方 Stub 进行解码,然后调用服务端的方法,服务端执行方法,返回结果,提供方 Stub 将返回结果编码后,发送给客户端,客户端的 RPCRuntime 收到结果,发给调用方 Stub 解码得到结果,返回给客户端。

这里面分了三个层次,对于用户层和服务端,都像是本地调用一样,专注于业务逻辑的处理就可以了。对于 Stub 层,处理双方约定好的语法、语义、封装、解封装。对于 RPCRuntime,主要处理高性能的传输,以及网络的错误和异常。

NFS(Network File System)就是网络文件系统。要使 NFS 成功运行,要启动两个服务端,一个是 mountd,用来挂载文件路径;一个是 nfsd,用来读写文件。NFS 可以在本地 mount 一个远程的目录到本地的一个目录,从而本地的用户在这个目录里面写入、读出任何文件的时候,其实操作的是远程另一台机器上的文件。

操作远程和远程调用的思路是一样的,就像操作本地一样。所以 NFS 协议就是基于 RPC 实现的。当然无论是什么 RPC,底层都是 Socket 编程。

RPC协议综述_网络协议_02

XDR(External Data Representation,外部数据表示法)是一个标准的数据压缩格式,可以表示基本的数据类型,也可以表示结构体。

RPC协议综述_网络协议_03

在 RPC 的调用过程中,所有的数据类型都要封装成类似的格式。而且 RPC 的调用和结果返回,也有严格的格式。

  • XID 唯一标识一对请求和回复。请求为 0,回复为 1。
  • RPC 有版本号,两端要匹配 RPC 协议的版本号。如果不匹配,就会返回 Deny,原因就是 RPC_MISMATCH。
  • 程序有编号。如果服务端找不到这个程序,就会返回 PROG_UNAVAIL。
  • 程序有版本号。如果程序的版本号不匹配,就会返回 PROG_MISMATCH。
  • 一个程序可以有多个方法,方法也有编号,如果找不到方法,就会返回 PROC_UNAVAIL。
  • 调用需要认证鉴权,如果不通过,则 Deny。
  • 最后是参数列表,如果参数无法解析,则返回 GABAGE_ARGS。

但是错误、重传、丢包、性能等问题还没有解决,这些问题我们统称为传输问题。这个就不用 Stub 操心了,而是由 ONC RPC 的类库来实现。这是大牛们实现的,我们只要调用就可以了。

RPC协议综述_网络协议_04

在这个类库中,为了解决传输问题,对于每一个客户端,都会创建一个传输管理层,而每一次 RPC 调用,都会是一个任务,在传输管理层,你可以看到熟悉的队列机制、拥塞窗口机制等。

由于在网络传输的时候,经常需要等待,因而同步的方式往往效率比较低,因而也就有 Socket 的异步模型。为了能够异步处理,对于远程调用的处理,往往是通过状态机来实现的。只有当满足某个状态的时候,才进行下一步,如果不满足状态,不是在那里等,而是将资源留出来,用来处理其他的 RPC 调用。

RPC协议综述_网络协议_05
  • 1
  • 收藏
  • 评论
  • 分享
  • 举报

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK