内容摘录自极客时间课程《趣谈网络协议》,如有侵权,请及时联系删除。

目录

  • RPC协议综述
    • 远程调用需要解决的5个问题
    • 协议约定问题
      • RPC调用标准
    • 传输问题
      • ONC RPC的类库
    • 服务发现
  • 参考

RPC协议综述

远程调用需要解决的5个问题

  1. 如何规定远程调用的语法?
    包括调用功能、返回值、入参、异常处理等。
  2. 如果传递参数?
    操作符、操作数顺序,超长字符的首尾分界等。
  3. 如何表示数据?
    基本数据类型、变长类型、结构体、类等。不同编程语言对int型的表示不同。
    传输超过一个Byte的数据需要处理大小端问题:Big Endian和Little Endian。

A big-endian system stores the most significant byte of a word at the smallest memory address and the least significant byte at the largest. A little-endian system, in contrast, stores the least-significant byte at the smallest address. Bi-endianness is a feature supported by numerous computer architectures that feature switchable endianness in data fetches and stores or for instruction fetches.
TCP/IP协议按照Big Endian设计,x86机器多按照Little Endian设计(Little Endian也是人书写的习惯)。

  1. 如何知道服务端的功能接口?以及调用的端口?
  2. 发生了错误、重传、丢包、性能等问题怎么办?

协议约定问题

RPC调用标准

来自Bruce Jay Nelson的论文Implementing Remote Procedure Calls

当客户端的应用想发起一个远程调用时,它实际是通过本地调用本地调用方的 Stub。它负责将调用的接口、方法和参数,通过约定的协议规范进行编码,并通过本地的 RPCRuntime 进行传输,将调用网络包发送到服务器。服务器端的 RPCRuntime 收到请求后,交给提供方 Stub 进行解码,然后调用服务端的方法,服务端执行方法,返回结果,提供方 Stub 将返回结果编码后,发送给客户端,客户端的 RPCRuntime 收到结果,发给调用方 Stub 解码得到结果,返回给客户端。这里面分了三个层次,对于用户层和服务端,都像是本地调用一样,专注于业务逻辑的处理就可以了。对于 Stub 层,处理双方约定好的语法、语义、封装、解封装。对于 RPCRuntime,主要处理高性能的传输,以及网络的错误和异常。

NFS协议中使用了RPC框架。

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

几种基本数据类型:

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

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

为了可以成功调用 RPC,在客户端和服务端实现 RPC 的时候,首先要定义一个双方都认可的程序、版本、方法、参数等。

最下层的是 XDR 文件,用于编码和解码参数。这个文件是客户端和服务端共享的,因为只有双方一致才能成功通信。

传输问题

ONC RPC的类库

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

由于在网络传输的时候,经常需要等待,因而同步的方式往往效率比较低,因而也就有 Socket 的异步模型。为了能够异步处理,对于远程调用的处理,往往是通过状态机来实现的。只有当满足某个状态的时候,才进行下一步,如果不满足状态,不是在那里等,而是将资源留出来,用来处理其他的 RPC 调用。
这里处理了连接失败、重试、发送失败、超时、重试等场景。首先,进入起始状态,查看 RPC 的传输层队列中有没有空闲的位置,可以处理新的 RPC 任务。如果没有,说明太忙了,或直接结束或重试。如果申请成功,就可以分配内存,获取服务的端口号,然后连接服务器。连接的过程要有一段时间,因而要等待连接的结果,会有连接失败,或直接结束或重试。如果连接成功,则开始发送 RPC 请求,然后等待获取 RPC 结果,这个过程也需要一定的时间;如果发送出错,可以重新发送;如果连接断了,可以重新连接;如果超时,可以重新传输;如果获取到结果,就可以解码,正常结束。

服务发现

ONC RPC中,服务发现是通过portmapper实现的。
portmapper 会启动在一个众所周知的端口上,RPC 程序由于是用户自己写的,会监听在一个随机端口上,但是 RPC 程序启动的时候,会向 portmapper 注册。客户端要访问 RPC 服务端这个程序的时候,首先查询 portmapper,获取 RPC 服务端程序的随机端口,然后向这个随机端口建立连接,开始 RPC 调用。从图中可以看出,mount 命令的 RPC 调用,就是这样实现的。

参考

趣谈网络协议-RPC协议综述

《趣谈网络协议》学习笔记 DAY08相关推荐

  1. [趣谈网络协议学习] 03 DHCP与PXE:IP是怎么来的, 又是怎么没的?

    如何配置 IP 地址? 在linux中可以使用ifconfig, 也可以使用ip addr. 设置好了以后, 用这两个命令, 将网卡 up 一·下, 就可以开始工作了. 使用 net-tools: s ...

  2. [趣谈网络协议学习] 08 世界这么大,我想出网关:欧洲十国游与玄奘西行

    MAC头与IP头 MAC头 目标 MAC 地址 源 MAC 地址 协议类型:说明里面是 IP 协议 IP头 详情可参见 IP数据报格式详解 版本号:占用4位二进制数,表示该IP数据报使用的IP协议版本 ...

  3. 《趣谈网络协议》学习笔记 DAY03

    内容摘录自极客时间课程<趣谈网络协议>,如有侵权,请及时联系删除. 目录 软件定义网络SDN OpenFlow和OpenvSwitch实现SDN OpenFlow协议 OpenvSwitc ...

  4. 《趣谈网络协议》学习笔记DAY15

    内容摘录自极客时间课程<趣谈网络协议>,如有侵权,请及时联系删除. 目录 零星知识点 如何打通公有云和私有云 QUIC的特性 http中的keepalive 参考 零星知识点 如何打通公有 ...

  5. 《趣谈网络协议》学习笔记 DAY04

    内容摘录自极客时间课程<趣谈网络协议>,如有侵权,请及时联系删除. 云中的网络安全 共有云上的虚机,为了达到安全的目的,建议只开放需要的端口,并将其他端口关闭,然后配置安全措施对开放的端口 ...

  6. 《趣谈网络协议》学习笔记DAY10

    内容摘录自极客时间课程<趣谈网络协议>,如有侵权,请及时联系删除. 目录 基于JSON的RESTful接口协议 服务端无状态化 服务发现 小结 参考 基于JSON的RESTful接口协议 ...

  7. 《趣谈网络协议》学习笔记 DAY06

    内容摘录自极客时间课程<趣谈网络协议>,如有侵权,请及时联系删除. 目录 云中网络的隔离 GRE(Generic Routing Encapsulation) GRE的不足 VXLAN(V ...

  8. 《趣谈网络协议》学习笔记 DAY02

    内容摘录自极客时间课程<趣谈网络协议>,如有侵权,请及时联系删除. 目录 云计算中的网络 虚拟网卡 虚拟网卡连接到云中 共享与互通 隔离 参考 云计算中的网络 虚拟网卡 Linux上通过T ...

  9. 《趣谈网络协议》学习笔记 DAY05

    内容摘录自极客时间课程<趣谈网络协议>,如有侵权,请及时联系删除. 目录 云中的网络QoS 控制QoS的方式 无类别排队规则(Classless Queuing Disciplines) ...

最新文章

  1. c语言 文件 long double 读取,读取*.wav音频文件
  2. 程序员面试题精选100题(13)-第一个只出现一次的字符[算法]
  3. SQLserver多条件查询
  4. 人口预测和阻尼-增长模型_使用分类模型预测利率-第3部分
  5. 北大“四大疯人院”之说
  6. H.264将普及 视频编码讲坛之H.264前世今生
  7. python爬虫中文乱码_Python爬虫处理抓取数据中文乱码问题
  8. Rust 1.34.1 稳定版发布,Bug 修复
  9. dorado 刷新_dorado BDF常见问题
  10. CentOS系统安装FTP服务器
  11. wait方法为什么要放在循环里
  12. 一文带你浏览Graph Transformers
  13. 三类IP地址ABC类的划分
  14. php 定时微博代码,8款主流定时微博工具
  15. I.MX6UL主板TF卡启动Linux的实现(一)-TF卡的简要介绍及供电的实现
  16. Android 异步加载图片,使用LruCache和SD卡或手机缓存,效果非常的流畅
  17. 键盘按键开关种类简介
  18. 十行 Python 代码就提取了韦小宝的身份证信息!
  19. excel批量将数字转为文本格式
  20. 上海交通大学转专业到计算机,2018级自主转专业终审公示

热门文章

  1. python ocr识别身份证_不告诉你我用了它配合Python简简单单开发OCR识别,带你识别手写体、印刷体、身份证等N种,附代码!...
  2. 网聊记录-看看他的口才
  3. 2019一级消防工程师视频课件下载【全三科】
  4. 数据挖掘实验(二):主成分分析PCA R语言
  5. 室内设计软件:3D Interior Design 2022
  6. opencv计算机视觉_opencv是计算机视觉的至尊工具
  7. dell服务器sas2.5英寸1t硬盘10k,0XTH17 ST900MP0026 900GB 15K SAS 2.5寸DELL服务器硬盘
  8. PDF转换成ODT格式常用方法介绍
  9. SpringMVC教程(一)
  10. Apache Solr7.4 入门教程