本地调用函数有很多问题,如上图,这些编译器都帮你做了,但是在远程调用中,你需要重新操心。 Sun公司是第一个提供商业化RPC库和RPC编译器的公司。这个RPC框架是在NFS协议中使用的。 XDR 是一个标准的数据压缩格式,可以表示基本的数据类型,也可以表示结构体。
错误、重传、丢包、性能等问题我们统称为传输问题,这个就不用Stub担心了,而是由ONE RPC的类库来实现。
在这个类库中,为了解决传输问题,对于每一个客户端,都会创建一个传输管理层,而每一次RPC调用,都会是一个任务,在传输管理层,可以看到熟悉的队列机制、拥塞窗口机制等。 由于在网络中,
在ONE RPC中,服务发现通过portmapper 实现的。
portmapper会启动一个众所周知的端口上,RPC程序由于是用户自己写的,会监听在一个随机的端口上,但是RPC程序启动的时候,会向portmapper注册。客户端要访问RPC服务端这个程序的时候,首先查询portmapper,获取RPC服务端程序的随机端口,然后向这个随机端口建立连接,开始RPC调用,从图中可以看出,mount命令的RPC调用,就是这样实现的。 小结:
远程调用看起来用Socket编程就可以了,其实是很复杂的,要解决协议约定问题,传输问题和服务发现问题早期ONC RPC框架,以及NFS的实现,给出了解决这三个问题的示范性实现,也即协议约定要公用协议描述文件,并通过这个文件生成Stub程序;RPC一般需要一个状态机,需要另外一个进程专门做服务发现。