简短回答:
RPC是协议。套接字提供访问传输实现该协议的方式。
RPC是操作系统提供的服务和协议,允许远程应用程序触发代码运行。它有一个定义良好的协议,可通过网络访问其他设备的过程或对象。可以在基本上任何网络传输(例如TCP、UDP、带字符串的cups)上实现RPC。
套接字只是一种编程抽象,以便应用程序可以通过特定的网络传输与另一个设备发送和接收数据。您可以使用套接字在传输(例如TCP)上实现协议(例如RPC)。
这是特定于操作系统的。因此,首先要阅读一本好的操作系统书籍,例如操作系统: 三个简单部分(可免费下载)。
网络套接字 是进行一些进程间通信的一种方式(特别是在不同的机器之间)。还应了解Berkeley套接字 API,例如Linux上的socket(7)。
远程过程调用是一种编程技术(常常使用Linux上的socket(2)系统调用)。每个RPC请求都期望恰好一个回复,并由软件发起。
套接字通常也用于异步消息(例如,X11协议堆栈,WebSocket,SMTP)。消息传递是一种编程范例(比RPC更通用),它们常常在不期望任何回复的情况下发送。例如,X11服务器会为每个按键事件发送一个键盘事件消息,等等。
(因此,在某些方面,你正在比较苹果和橙子)
如果你在使用Linux系统,我建议你阅读《高级Linux编程》(可免费下载),并了解更多有关系统调用(syscalls)(2)的知识(特别是poll(2)以进行多路复用)。
提示:读Galvin的《操作系统概念》时可能会感到困惑
这就是你的问题所在。
远程过程调用(RPC)是一种高级模型,用于网络通信。目前存在着众多RPC协议。在RPC模型中,底层实现为每个远程过程创建一个存根(stub)。当应用程序调用“远程过程”时,存根会打包参数,将其发送到网络上,调用远程版本的过程,获取返回值并将其发送回调用方,存根解包返回值,应用程序接收返回值。
RPC模型在20世纪80年代末变得流行。其思想是函数在哪里执行(在您的进程中、在另一个进程中还是在另一台计算机上)应该是透明的。这个概念在20世纪90年代初扩展为分布式对象(例如DCOM、CORBA)。
不幸的是,在现实世界中,由于延迟和错误处理,应用程序确实需要知道过程是否在远程执行。
在RPC实现中,某个地方会调用网络接口。
套接字就是这样一种网络接口。它们不是唯一的编程接口,但在Unix系统上是最常见的。
因此,RPC可能使用套接字实现。