RPC的执行过程。参考
调用过程
一次远程调用的过程:
- 服务器启动
客户端程序向所在主机上的端口映射器注册自身,然后客户启动。
调用clnt_create
,该函数与服务器上的端口映射器联系,以找到服务器临时端口。
如果指定tcp,那么
clnt_create`,还建立了TCP链接。 - 客户端调用函数
客户端调用客户程序存根的本地过程,其实就是个函数。
存根的目的在把需要传递给远程过程的参数打包,可能的花把他们转化为某种标准格式。(这中间,参数被转化为char
)
吧客户端提供的参数打包成一个网络消息的过程成为集结。 - 客户存根把打包的程序发送给远端系统
这中间需要陷入本地内核系统调用,因为使用的是socket
接口,可能是tcp
,可能是udp
,所以使用write
或者是sendto
。 - 在第一步启动的客户存根过程一直在等待客户的请求
客户存根将传入的消息解散出来。并且根据这些参数选择适合的函数,并且将部分需要传入函数的参数转换为合适的类型。 然后调用选择的函数。 - 当服务器过程完成以后,他想服务器存根发送返回值
在RPC中其实就是两个函数的嵌套。 - 客户存根对返回值进行转换,然后把他们集结到一个或多个网络消息中,发送给客户端
- 客户端从本地内核中读出这些消息。
- 对返回值进行转换后,客户程序存根返回到客户调用的函数。
客户端绑定
运行RPC服务器的任何主机都必须在在运行端口映射器。
赋给端口映射器的是TCP的111和UDP的111。他们是SUN RPC的唯一因特网固定端口。
RPC服务器总是先帮顶一个临时端口,在想本地端口映射器注册自己的临时端口号。
客户端程序总是先联系服务器主机上的端口映射器,询问服务器的临时端口号,然后在跟临时端口上的服务器进行通信。
链接过程
因此上面的执行过程再加上协议,和端口映射以后,在链接建立之时的行为如下:
- 端口映射器需要先于服务端程序启动。
- 客户端程序启动
也就是客户端存根中的那个main函数启动,调用库函数svc_create
,确定本机所支持的网络协议,并未没个协议创建一个传输点,通常也就是套接字,给tcp
,udp
各绑定一个临时端口。
之后,该函数向端口映射器联系,并向他注册这两个临时的端口号以及调用程序的RPC程序号和版本号,也就是在double_v.x
中的那个8位的数字。 - 客户端调用
clnt_create
函数,该函数的参数报错,服务器主机名或是ip,程序号,版本号以及指定的协议的字符串。
客户端向服务器主机发送一个rpc请求,通常使用的是udp,询问关于指定程序,版本和协议的信息,如果成功,服务端答复端口号。
认证
如果服务器处于公网,并且可以被其他主机访问的话,那么需要认证。
不过书上说貌似这些认证都没啥用,有用的几个认证又没写。
这本书想干啥?
超时和重传
涉及到了TCP和UDP那么就要存在超时重传
客户端和服务端异常的情况
涉及到网络部分就会有这几个,如果客户端提前结束怎么办,服务端提前结束怎么办,服务器结束又重启了,怎么办。
网友评论