从底层的角度来看,Windows 中的命名管道和远程过程调用 (RPC) 有啥区别?

Posted

技术标签:

【中文标题】从底层的角度来看,Windows 中的命名管道和远程过程调用 (RPC) 有啥区别?【英文标题】:From a low-level perspective, what is the difference between named pipes and remote procedure calls (RPC) in Windows?从底层的角度来看,Windows 中的命名管道和远程过程调用 (RPC) 有什么区别? 【发布时间】:2017-11-14 22:39:06 【问题描述】:

我试图了解 Microsoft 实现 named pipes 与 RPC 的低级架构。我知道两者都可以用于本地网络上的应用程序之间的客户端/服务器通信。但是我为什么要选择一个而不是另一个呢?

PS。 RPC 是建立在命名管道之上的更高级别的实现,反之亦然?我也在尝试看看哪一个的开销更少。

【问题讨论】:

当然 RPC 是建立在命名管道或其他(通常的 [a]lpc 端口)传输之上的更高级别的实现。 @RbMm:感谢您的澄清。我也很好奇,对于命名管道他们使用什么样的传输系统?它只是普通的 TCP/IP 吗?任何内置加密? 寻找Protocol Sequence Constants - 大多数情况下使用ncalrpc 协议(本地过程调用,[a]lpc)。如果选择 ncacn_np,则使用命名管道。也看RpcStringBindingCompose 对于命名管道他们使用什么样的传输系统 - 系统中存在特殊的驱动程序 - npfs.sys - 他实现了命名管道,它是在它设备上打开的文件。所有这些都与 TCP/IP 完全无关 命名管道由命名管道文件系统驱动程序“\FileSystem\Npfs”使用文件系统设备“\Device\NamedPipe”实现。它为所有命名管道(例如“\Device\NamedPipe\InitShutdown”)实现了一个根目录“\Device\NamedPipe\”。匿名管道是相对于该目录的句柄打开的(它曾经为“匿名”管道使用随机名称)。在 Windows API 中,该设备是“\\.\PIPE”,它在 NT 中实现为从“\GLOBAL??\PIPE”到“\Device\NamedPipe”的对象符号链接。 【参考方案1】:

命名管道是一种通信通道,但它们不指定要发送的数据(在很多方面,它们很像 IP 之上的 TCP 或 UDP)。

另一方面,RPC 接口指定成功通信所需的数据以及通信将产生的数据。

请注意,RPC 能够使用大量通信通道,命名管道只是可能的选项之一。

【讨论】:

谢谢。但是从某种意义上说,如果命名管道是比 RPC 更低级别的实现,那么它们也必须基于某些东西(用于远程服务器连接)。内部不是 TCP 或 UDP 吗? 不,命名管道协议可以位于 IP 之上(这可能是任何最新版本的 Windows 的选择),但它不需要 TCP 或 UDP。 NP 还可以使用其他(主要是本地)协议,例如 IPX 进行传输帧。

以上是关于从底层的角度来看,Windows 中的命名管道和远程过程调用 (RPC) 有啥区别?的主要内容,如果未能解决你的问题,请参考以下文章

windows命名管道

Windows进程间通信—命名管道

C - 在顶层和底层进程之间进行通信

进程间通信——管道

Windows中的命名管道

ArrayList 从源码角度剖析底层原理