在Linux系统中,RPC是Remote Procedure Call的缩写,中文叫作远程过程调用。它的本质是想让开发者在编写网络程序时,不用自己处理socket连接、数据打包、网络传输这些繁琐细节,而是像调用本地函数那样去调用另一台机器上运行的函数。内核与用户态工具共同提供了这套机制,使得跨主机的方法执行对代码编写者来说是透明的。

RPC的基本工作原理
RPC的核心思路是“桩”和“骨架”的分工。客户端有一段叫stub(桩)的代码,它看起来像个普通函数,实际上会把参数收集起来,转换成可以在网络上传输的格式,再发给服务端。服务端也有一段叫skeleton(骨架)的代码,负责接收请求、还原参数、真正调用本地实现的函数,并把结果原路返回。整个过程对上层业务逻辑隐藏了网络细节。
在Linux传统的Sun RPC实现里,数据格式统一使用XDR(External Data Representation)做序列化,保证不同字节序、不同架构的机器之间能正确读懂对方的数据。服务位置则依赖rpcbind(早期叫portmap)这个守护进程,服务端把自己监听的端口和程序号注册上去,客户端先查rpcbind拿到端口,再发起真正调用。
用rpcgen快速体验Linux RPC
Linux自带rpcgen工具,可以根据一个接口定义文件(.x文件)自动生成客户端桩、服务端骨架以及XDR编码代码。下面给出一个最简单的示例,定义一个加法服务,让远端帮我们算两个数之和。
/* calc.x 定义RPC接口 */
program CALC_PROG {
version CALC_VER {
int ADD(int, int) = 1;
} = 1;
} = 0x20000001;
/* 执行 rpcgen calc.x 会生成 calc_clnt.c calc_svc.c calc_xdr.c 等文件 */
服务端只需要实现ADD函数逻辑,例如把两个参数相加返回。下面是一段简化版的服务端实现代码,展示了如何注册服务并进入等待。
#include <rpc/rpc.h>
#include "calc.h"
int *add_1_svc(int *a, int *b, struct svc_req *req) {
static int result;
result = *a + *b;
return &result;
}
int main() {
register int prog = 0x20000001;
register int vers = 1;
if (svc_create(calc_prog_1, prog, vers, "tcp") == 0) {
/* 创建TCP服务失败处理 */
return 1;
}
svc_run();
return 0;
}
客户端则可以像调用本地函数一样写代码,rpcgen生成的桩函数名通常是add_1,内部自动完成连接与序列化。
#include <rpc/rpc.h>
#include "calc.h"
int main() {
CLIENT *cl = clnt_create("192.168.0.1", 0x20000001, 1, "tcp");
int a = 3, b = 4;
int *res = add_1(&a, &b, cl);
if (res) {
/* 输出结果应为7 */
}
clnt_destroy(cl);
return 0;
}
RPC在Linux系统中的典型应用
很多基础服务都构建在RPC之上。最常见的就是NFS(网络文件系统),客户端挂载远端目录时,文件的读写请求就是通过RPC发给服务端的nfsd进程。还有NIS(网络信息服务),用于统一管理局域网内的用户账号与主机名,同样依赖RPC做查询通信。
使用RPC的好处是开发分布式功能时网络细节被极大简化,但缺点也很明显:传统RPC协议较重,调试不如HTTP接口直观,且在云原生环境里常被更轻量的gRPC、Thrift取代。不过理解它仍有助于维护老系统,也能帮助弄清为什么某些Linux服务必须开启rpcbind才能正常工作。
常见误区与排查思路
不少初学者会把<input>这类HTML标签和RPC混为一谈,其实二者毫无关系,前者是网页表单元素,后者是系统级通信机制。另外有人以为RPC一定基于TCP,实际上Sun RPC同时支持UDP与TCP,UDP常用于简单查询,TCP用于大数据量或可靠传输。
当Linux上NFS挂载失败时,第一步往往不是查网络,而是用rpcinfo命令看对端rpcbind是否在线、程序是否注册。例如执行rpcinfo -p 192.168.0.1能列出对方暴露的所有RPC服务与端口,若列表为空,基本可断定rpcbind未启动或防火墙拦截。
| 对比项 | 传统Sun RPC | 现代gRPC |
|---|---|---|
| 序列化 | XDR | Protocol Buffers |
| 传输 | TCP/UDP | HTTP/2 |
| 代码生成 | rpcgen | protoc插件 |
| 跨语言 | 较弱 | 强 |
通过上述对比可以看出,RPC并非某一种固定技术,而是一类设计思想。在Linux里提到RPC,多数情况是指系统自带的Sun RPC体系,它虽显老旧,却是理解许多网络服务运作方式的钥匙。
rpcLinuxremote_procedure_call修改时间:2026-08-08 18:57:33