Socket和RPC有什么区别?

34
3个回答

31

简短回答:

RPC是协议。套接字提供访问传输实现该协议的方式。

RPC是操作系统提供的服务和协议,允许远程应用程序触发代码运行。它有一个定义良好的协议,可通过网络访问其他设备的过程或对象。可以在基本上任何网络传输(例如TCP、UDP、带字符串的cups)上实现RPC。

套接字只是一种编程抽象,以便应用程序可以通过特定的网络传输与另一个设备发送和接收数据。您可以使用套接字在传输(例如TCP)上实现协议(例如RPC)。


你可以在传输层(例如TCP)上使用套接字实现协议(例如RPC)。那么所有具有客户端-服务器范例的协议都需要使用套接字进行传输吗?还是还有其他方式?也许我没有完全理解。如果您有关于所有这些网络结构的简短资源要分享,那就更好了。 - Rahul
2
“socket”不是传输方式,而是一种编程API,它方便了对传输方式的访问。只要双方使用该传输方式(用于RPC),您可以在任何其他传输方式和编程API之上实现RPC。使用带有绳子或鸟类信鸽也可以,但您需要教会信鸽打字。这可能需要一段时间。 - selbie
谷歌 OSI 网络模型。TCP 完全适合“第四层”,而 IP 适合“第三层”。RPC 介于第 5 层和第 7 层之间。 - selbie

15

这是特定于操作系统的。因此,首先要阅读一本好的操作系统书籍,例如操作系统: 三个简单部分(可免费下载)。

网络套接字 是进行一些进程间通信的一种方式(特别是在不同的机器之间)。还应了解Berkeley套接字 API,例如Linux上的socket(7)

远程过程调用是一种编程技术(常常使用Linux上的socket(2)系统调用)。每个RPC请求都期望恰好一个回复,并由软件发起。

套接字通常也用于异步消息(例如,X11协议堆栈WebSocketSMTP)。消息传递是一种编程范例(比RPC更通用),它们常常在不期望任何回复的情况下发送。例如,X11服务器会为每个按键事件发送一个键盘事件消息,等等。

(因此,在某些方面,你正在比较苹果和橙子)

如果你在使用Linux系统,我建议你阅读《高级Linux编程》(可免费下载),并了解更多有关系统调用(syscalls)(2)的知识(特别是poll(2)以进行多路复用)。


1
高级Linux编程的链接可能已经失效了。我想确认一下这是否是你所提到的那本书 @Basile Starynkevitch?https://richard.esplins.org/static/downloads/linux_book.pdf - avimehenwal

5

提示:读Galvin的《操作系统概念》时可能会感到困惑

这就是你的问题所在。

远程过程调用(RPC)是一种高级模型,用于网络通信。目前存在着众多RPC协议。在RPC模型中,底层实现为每个远程过程创建一个存根(stub)。当应用程序调用“远程过程”时,存根会打包参数,将其发送到网络上,调用远程版本的过程,获取返回值并将其发送回调用方,存根解包返回值,应用程序接收返回值。

RPC模型在20世纪80年代末变得流行。其思想是函数在哪里执行(在您的进程中、在另一个进程中还是在另一台计算机上)应该是透明的。这个概念在20世纪90年代初扩展为分布式对象(例如DCOM、CORBA)。

不幸的是,在现实世界中,由于延迟和错误处理,应用程序确实需要知道过程是否在远程执行。

在RPC实现中,某个地方会调用网络接口。

套接字就是这样一种网络接口。它们不是唯一的编程接口,但在Unix系统上是最常见的。

因此,RPC可能使用套接字实现。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接