realtek audio console无法连接rpc服务_网络协议 19 - RPC协议综述

这几年微服务很火,想必各位博友或多或少的都接触过。微服务概念中,
各服务间的相互调用是不可或缺的一环。你知道微服务之间是通过什么方式相互调用的吗?

    你可能说,这还不简单,用 socket 呗。服务之间分调用方和被调用方,我们就建立一个 TCP 或者 UDP 连接进行通信就好了。

    说着说着,你可能就会发现,这事儿没那么简单。

    我们就拿最简单的场景:

客户端调用一个加法函数,将两个整数加起来,返回它们的和。

    如果放在本地调用,那是简单的不能再简单,但是一旦变成了远程调用,门槛一下子就上去了。

    首先,你要会 socket 编程,至少要先了解咱们这个系列的所有协议 ,然后再看 N 本砖头厚的 socket 程序设计的书,学会咱们了解过的几种 socket 程序设计的模型。

    这就使得本来大学毕业就能干的一项工作,变成了一件五年工作经验都不一定干好的工作,而且,搞定了 socket 程序设计,才是万里长征的第一步,后面还有很多问题呢。

存在问题

问题一:如何规定远程调用的语法?
    客户端如何告诉服务端,我是一个加法,而另一个是减法。是用字符串 “add” 传给你,还是传给你一个整数,比如 1 表示加法,2 表示减法?

    服务端又该如果告诉客户端,我这个是加法,目前只能加整数,不能加小数和字符串。而另一个加法 “add1”,它能实现小数和整数的混合加法,那返回值是什么?正确的时候返回什么,错误的时候又返回什么?

问题二:如何传递参数?
    是先传两个整数,后传一个操作数 “add”,还是先传操作符,再传两个整数?

    另外,如果我们是用 UDP 传输,把参数放在一个报文里还好,但如果是 TCP,是一个流,在这个流里面如何区分前后两次调用?

问题三:如何表示数据?
    在我们的加法例子中,传递的就是一个固定长度的 int 值,这种情况还好,如果是变长的类型,是一个结构体,甚至是一个类,应该怎么办呢?即使是 int,在不同的平台上长度也不同,该怎么办呢?

问题四:如何知道一个服务端都实现了哪些远程调用?从哪个端口可以访问这个远程调用?
    假设服务端实现了多个远程调用,每个实现可能都不在一个进程中,监听的端口也不一样,而且由于服务端都是自己实现的,不可能使用一个大家都公认的端口,而且有可能多个进程部署在一台机器上,大家需要抢占端口,为了防止冲突,往往使用随机端口,那客户端如何找到这些监听的端口呢?

问题五:发生了错误、重传、丢包、性能等问题怎么办?
    本地调用没有这个问题,但是一旦到网络上,这些问题都需要处理,因为网络是不可靠的,虽然在同一个连接中,我们还可以通过 TCP 协议保证丢包、重传的问题,但是如果服务器崩溃了又重启,当前连接断开了,TCP 就保证不了了,需要应用自己进行重新调用,重新传输会不会同样的操作做两遍,远程调用性能会不会受影响呢?

解决问题

    看到这么多问题,是不是很头疼?还记得咱们了解 http 的时候,认识的协议三要素吗?

7b304eaa309819bb533ad1979d6bdb80.png

    本地调用函数里很多问题,比如词法分析、语法分析、语义分析等待,这些问题编译器基本上都帮我们解决了,但是在远程调用中,这些问题我们都要自己考虑。

协议约定问题

    很多公司对于这个问题,是弄一个核心通信组,里面都是 socket 编程的大牛,实现一个统一的库,让其他业务组的人来调用,业务的人不需要知道中间传输的细节。

    通信双方的语法、语义、格式、端口、错误处理等,都需要调用方和被调用方开会商量,双方达成一致。一旦有一方改变,要及时通知对方,否则就会出现问题。

    但是,不是每个公司都能通过这种大牛团队解决问题的,而是使用已经实现好的框架。

    有一个大牛(Bruce Jay Nelson)通过一篇论文,定义了 RPC 的调用标准。后面所有 RPC 框架都是按照这个标准模式来的。

e1d8b77ed85b13b33d7bc6ac871f1ce6.png

整个过程如下:

  1. 客户端的应用想发起一个远程调用时,它实际上是通过本地调用方的 Stub。它负责将调用的接口、方法和参数,通过约定的协议规范进行编码,并通过本地 RPCRuntime 进行传输,将调用网络包发送到服务器;
  2. 服务端的 RPCRuntime 收到请求后,交给提供方 Stub 进行编码,然后调用服务端的方法,获取结果,并将结果编码后,发送给客户端;
  3. 客户端的 RPCRuntime 收到结果,发给调用方 Stub 解码得到结果,返回给客户端。

    上面过程中分了三个层次:客户端、Stub 层、服务端。

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

    最早的 RPC 的一种实现方式称为 Sun RPCONC RPC。Sun 公司是第一个提供商业化 RPC 库和 RPC 编译器的公司。这个 RPC 框架是在 NFS 协议中使用的。

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

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

aeb00b64df574bc13352b7ead6dcaf23.png

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

    这里有几种基本的数据类型。

3cbd2dc25fd9e67a15fd87ecf36ae0dc.png

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

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

e5aeab69ff197652a00bed34af33de63.png

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

660c055911f24e8721465baf001bdfb2.png

    对于上面的加法而言,双方约定为一个协议定义文件,同理,如果是 NFS、mount 和读写,也会有类似的定义。

    有了协议定义文件,ONC RPC 会提供一个工具,根据这个文件生成客户端和服务器端的 Stub 程序。

c2944d2dad100ccdb31f848da1f8beb0.png

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

    在客户端,会调用 clnt_create 创建一个连接,然后调用 add_1,这是一个 Stub 函数,感觉是在调用本地函数一样。其实是这个函数发起了一个 RPC 调用,通过调用 clnt_call 来调用 ONC RPC 的类库,来真正发送请求。调用的过程较为复杂,后续再进行专门的说明。

    当然,服务端也有一个 Stub 程序,监听客户端的请求,当调用到达的时候,判断如果是 add,则调用真正的服务端逻辑,也就是将两个数加起来。

    服务端将结果返回服务端的 Stub,Stub 程序发送结果给客户端 Stub,客户端 Stub 收到结果后就返回给客户端的应用程序,从而完成这个调用过。

    有了这个 RPC 框架,前面五个问题中的 “如何规定远程调用的语法?”、“如何传递参数?” 以及 “如何表示数据?” 基本解决了,这三个问题我们统称为协议约定问题

传输问题

    前三个问题解决了,但是错误、重传、丢包以及性能问题还没有解决,这些问题我们统称为传输问题。这个 Stub 层就无能为力了,而是由 ONC RPC 的类库来实现。

ed21e385a23299bc2ac8446bf1884260.png

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

    由于在网络传输的时候,经常需要等待,而同步的方式往往效率比较低,因而也就有 socket 的异步模型。

    为了能够异步处理,对于远程调用的处理,往往是通过状态机来实现的。只有当满足某个状态的时候,才进行下一步,如果不满足状态,不是在那里等待,而是将资源留出来,用来处理其他的 RPC 调用。

aadbd54b880d5c46fdd34d9f8390b922.png

    如上图,从图也可以看出,这个状态转换图还是很复杂的。

    首先,进入起始状态,查看 RPC 的传输层队列中有没有空闲的位置,可以处理新的 RPC 任务,如果没有,说明太忙了,直接结束或重试。如果申请成功,就可以分配内存,获取服务端的端口号,然后连接服务器。

    连接的过程要有一段时间,因而要等待连接结果,如果连接失败,直接结束或重试。如果连接成功,则开始发送 RPC 请,然后等待获取 RPC 结果。同样的,这个过程也需要时间,如果发送出错,就重新发送,如果连接断开,要重新连接,如果超时,要重新传输。如果获取到结果,就可以解码,正常结束。

    这里处理了连接失败、重试、发送失败、超时、重试等场景,因而实现一个 RPC 框架,其实很有难度。

服务发现问题

    传输问题解决了,我们还遗留了一个 “如何找到 RPC 服务端的那个随机端口”,这个问题我们称为服务发现问题,在 ONC RPC 中,服务发现是通过 portmapper 实现的。

    portmapper 会启动在一个众所周知的端口上,RPC 程序由于是用户自己写的,会监听在一个随机端口上,但是 RPC 程序启动的时候,会向 portmapper 注册。

    客户端要访问 RPC 服务端这个程序的时候,首先查询 portmapper,获取 RPC 服务端程序的随机端口,然后向这个随机端口建立连接,开始 RPC 调用。

从下图中可以看出,mount 命令的 RPC 调用就是这样实现的。

73818f4f0029e8845dc987a7cd5730ca.png

小结

  • 远程调用看起来用 socket 编程就可以了,其实是很复杂的,要解决协议约定问题、传输问题和服务发现问题;
  • ONC RPC 框架以及 NFS 的实现,给出了解决上述三大问题的示范性实现,也就是公用协议描述文件,并通过这个文件生成 Stub 程序。RPC 的传输一般需要一个状态机,需要另外一个进程专门做服务发现。

欢迎添加个人微信号:Like若所思。

欢迎关注我的公众号,不仅为你推荐最新的博文,还有更多惊喜和资源在等着你!一起学习共同进步!

3a3864d99fcd3f503a9ba9150e86111b.png
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: b'realtek audio console无法连接rpc服务'这句话的意思是指realtek音频控制台无法连接远程(或本地)的rpc服务。可能是由于网络连接问题、rpc服务故障或realtek音频控制台软件本身出现了故障。需要进一步排查具体原因并解决问题。 ### 回答2: Realtek Audio Console是一款非常实用的音频管理软件,可以帮助我们调整音频设置,优化音质效果。但是,如果出现"无法连接RPC服务"的提示,就会导致无法正常使用该软件。 首先,我们需要了解RPC是一种远程过程调用协议,是客户端/服务器模式下的一种通信机制。其目的是让不同的进程间可以相互调用。在使用Realtek Audio Console时,该软件要求连接RPC服务,因此出现无法连接RPC服务的提示就意味着该服务无法正常运行。 为了解决这个问题,有以下几个解决方案: 1.升级Realtek Audio Console: 可以尝试升级最新版本的软件来解决该问题。如果现在使用的版本已经过时,则可能存在与RPC服务不兼容的问题,因此需要升级至最新版本。 2.重启RPC服务: RPC服务可能因为某些原因出现了异常,所以需要重启该服务。在Windows操作系统下,可以通过以下步骤执行: 具体步骤: 依次单击“开始”菜单 --> 运行 --> 输入“services.msc” --> 找到“RPC服务” --> 右键单击-->单击“重启”即可。 3.检查RPC服务是否开启: 若RPC服务未开启,则该服务无法正常运行。在Windows操作系统下,可以通过以下步骤查看RPC服务是否开启: 具体步骤: 依次单击“开始”菜单 --> 运行 --> 输入“services.msc” --> 找到“RPC服务” --> 查看“服务状态”,如果服务未运行,可以右键单击,选择“启用”来开启该服务。 4.卸载并重新安装Realtek Audio Console: 如果以上三个解决方案都无法解决问题,则可能是Realtek Audio Console软件出现了异常。可以尝试卸载软件并重新安装。 总之,无法连接RPC服务可能会对Realtek Audio Console软件的使用造成一定的影响,但是只要按照上述方案逐一尝试,相信可以找到解决问题的最佳方法,让Realtek Audio Console软件恢复正常运行。 ### 回答3: 对于Realtek Audio Console无法连接RPC服务的问题,可能有多种原因导致,下面我们将逐一分析并提供解决方案: 1. RPC服务未启动/已停止:RPC服务(远程过程调用服务)是一种微软用于系统间通信的技术,如果该服务未启动,则会导致Realtek Audio Console无法连接。我们可以通过以下步骤检查 RPC 服务是否已启动: 打开“服务”管理页面:在Windows操作系统中,快捷键“Win + R”打开运行框,在输入栏中输入 “services.msc” 按下ENTER键即可。 找到RPC服务:在“服务”列表里(默认按照字母顺序排序),寻找“远程过程调用(RPC)”服务,查看是否是“已启动”状态。如果不是,则右键点击,选择“属性”打开属性窗口。在“常规”选项卡中,选择“启动类型”为“自动”,点击“应用”按钮,再点击“启动”按钮即可启动服务。 2. Realtek Audio Console软件问题:如果RPC服务已经启动而Realtek Audio Console仍然无法连接,那么问题可能出在软件本身。我们可以尝试卸载并重新安装Realtek Audio Console,如果是新安装的话,可以尝试卸载后重新安装。 3. 驱动问题:有时,Realtek Audio Console无法连接RPC服务也可能是由于音频驱动程序不兼容或者已经损坏,导致程序无法正确运行。我们可以尝试卸载与音频相关的驱动程序,然后从Realtek官网重新下载并安装最新版本驱动程序。 总之,如果出现Realtek Audio Console无法连接RPC服务的问题,建议逐一排查上述可能原因并依次解决。如果以上方法无效,那么可能需要考虑是否存在其他系统问题或硬件故障。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值