首页 理论教育 软工专业导论远程调用和传输协议

软工专业导论远程调用和传输协议

时间:2023-10-23 理论教育 版权反馈
【摘要】:这种程序的调用形态,称为远程调用。但是在远程调用中,不是给函数的地址(指针),因为两个机器的地址空间是完全不一样的。客户端在做远程调用时,必须附上这个ID。当客户端需要进行远程调用时,它就查一下这个表,找出相应的Call ID,再把它传给服务端,服务端也通过查表,来确定客户端需要调用的函数,然后执行相应函数的代码。这种传输使用的协议称为传输协议。

软工专业导论远程调用和传输协议

远程调用是在网络和分布式的计算环境下,可以用一台计算机调用网上另一台计算机的功能。这不同于在同一台计算机上的子程序调用。或者说,一台计算机作为服务器(称为服务器端),向调用它的计算机(称为客户端)提供服务,从而可以建立客户—服务(Client-Server)的调用形态。这种程序的调用形态,称为远程调用(RPC,Remote Procedure Call)。

调用本地机器上的一个函数时,调用者只需要把参数(或变量)直接(通过内存地址)传递给被调用的函数。而在远程调用时,被调用的函数体是在远程的机器上的,也就是说,被调用的函数是在另一个远程的任务中执行的。这就带来了几个新问题。

(1)Call ID 映射。怎么告诉远程机器要调用哪个函数?在本地调用中,函数是直接通过内存地址(指针)来指定的。但是在远程调用中,不是给函数的地址(指针),因为两个机器的地址空间是完全不一样的。所以,在RPC中,所有的函数都必须有自己的一个ID(标识号)。这个ID 在所有任务进程中都是唯一确定的。客户端在做远程调用时,必须附上这个ID。然后还需要在客户端和服务端分别维护一个“函数和调用ID”的对应表。两者的表不一定完全相同,但同一个函数对应的调用ID(Call ID)必须相同。当客户端需要进行远程调用时,它就查一下这个表,找出相应的Call ID,再把它传给服务端,服务端也通过查表,来确定客户端需要调用的函数,然后执行相应函数的代码。

(2)序列化和反序列化。客户端怎么把参数值传给远程的函数呢?在本地调用中,只需要把参数压到栈里(单独开辟的一块内存),然后让函数自己去栈里读取参数就行。但是在远程过程调用时,客户端与服务端是不同的进程,不能通过内存来传递参数。这时候就需要客户端把参数先转成一个字节流(或字符串)传给服务端后,服务端再把字节流转成自己能读取的格式。这个过程称为序列化和反序列化。同理,从服务端返回的值也需要序列化反序列化的过程。(www.xing528.com)

(3)网络传输。远程调用是在网络上进行的,客户端和服务端是通过网络连接的。所有的数据都需要通过网络传输。网络需要把Call ID 和序列化后的参数字节流传给服务端,然后再把序列化后的调用结果传回客户端。这种传输使用的协议称为传输协议。大部分RPC框架使用TCP协议,也可以用UDP协议(参见5.4.3 节),甚至是HTTP协议(参见6.4.2节)。

RPC的优势在于,调用者感觉像是调用本地程序一样使用远程服务器的功能,即对于客户端,服务器端的服务是透明的。不需要关心远程服务器端时如何实现的服务。因此能够实现分布式网络环境下的服务共享和复用。

当然,不同的编程语言、不同的应用方式,开发者会制定不同的远程调用策略或通信协议,并形成自己的专利,或通过产业联盟建立开放调用协议与模型。

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈