请注意,关于 RPC 协议,没有任何东西偏离标准 TCP。
SunRPC 或 DCE RPC 工作在 UDP 之上(至少 SunRPC 可以使用 UDP)或 TCP 之上。
通常,为了让 RPC 客户端联系/调用 RPCserver,它首先联系某种查找服务器(在 SunRPC 的情况下称为 portmapper 或 rpcbind),该服务器回复实际位置(IP 地址和端口号)服务器正在运行。
所以从网络的角度来看:
- RPC 服务器侦听随机端口号,每次(重新)启动服务器程序时,该端口号可能会发生变化。
- 启动时,RPC 服务器连接到端口映射器,该端口映射器在一个众所周知的端口上运行,并使用它正在侦听的 IP 地址和端口号注册自己。
通常,portmapper 服务与 RPC 服务器程序在同一台机器上运行。
当客户端想要连接或调用 RPC 服务时,它会执行以下操作:
- 在众所周知的/标准目标端口上连接到端口映射器,并询问它要连接的特定服务在哪里。
- portmapper 回复客户端请求的服务的 IP 地址和端口号。
- 客户端断开与端口映射器的连接
- 客户端使用 pormapper 提供的 IP 地址和端口号与服务建立新连接。
- 客户端通过这个新连接调用 RPC 服务,客户端可以将其用于多个 RPC 调用。
- 这些 RPC 调用只是在 TCP 连接之上交换的应用程序消息。
(在使用 UDP 而不是 TCP 的情况下,它的工作原理大致相同,但自然不会通过网络执行连接设置/拆除)
这给防火墙带来了一个问题,因为服务器侦听随机选择的端口号,因此无法在管理上允许访问特定的端口号。相反,想要支持这种设置的防火墙需要打开 portmapper 端口,捕获到 portmapper 的知名端口的 RPC 消息,检查与 portmapper 交换的消息内容以从端口中提取 IP 地址和端口号。 RPC 消息(端口映射器本身实现为 RPC 服务器),以便在 RPC 服务器和客户端之间动态打开端口。