NetworkManager 利用了 D-BUS 和硬件抽象层 (HAL) 技术的优势。D-BUS 用来在内部进行 NetworkManager 守护程序、NetworkManager 组成部分和 HAL 之间的通信,提供理解现有硬件和新硬件的能力。在外部,D-BUS 用来广播各状态变化的信息。
D-BUS 用 C 编写成的进程间通信 (IPC) 系统,它使应用程序间的彼此通信成为可能。它由 Havoc Pennington、Alex Larsson、和 Anders Carlsson 在 2002 年首创,当时作为 freedesktop.org 的一个组成部分,围绕一个桌面的讯息交换平台进行标准化。
D-BUS 为两种特定的情况而设计 — 同一桌面会话中桌面应用程序间的通信和桌面会话与操作系统间的通信。
D-BUS 有非常清楚的体系结构。它包括三层:
低层次库用来进行应用程序彼此间的连接及讯息交换。它仅支持一对一的连接。
多个应用程序可以连接的可执行程序。该守护程序可以将讯息从一个应用程序发送到零个或多个应用程序。
包装程序库也称为绑定,用来包装标准的低层次库 D-BUS,为开发人员提供更好的环境。包装程序库包括 libdbus-qt 和 libdbus-glib。
因为 D-BUS 是一个讯息总线系统,它不发送字节流,而是发送讯息。讯息拥有一个带有类型标识的报头和包括数据在内的信体。它们是二进制格式。有不同的内置讯息类型,例如错误讯息和事件通知。有关讯息类型的信息储存在讯息报头中。报头也包括有关路径和讯息界面的信息。
总线守护程序的运作如同一个讯息服务器,通常有多个实例。第一个实例是全局性的,基本类似于典型的守护程序(如 httpd 或 sendmail)。本实例有很多安全性限制,用于系统范围内的通信。一个用户登录会话创建一个实例。这些实例用于用户会话中应用程序间的通信。
在建立连接和开始通信之前,应用程序必须鉴定。为此,要使用基于 SASL 的简单纯文本协议。若向正确的应用程序递送正确的讯息,则要使用特殊格式的地址及讯息总线名。这就意味着每个连接至少有一个名称。当连接关闭,其拥有的所有名称都将被删除。
核心低层 D-BUS API 用 C 编写而成,并非用来开发应用程序框架。D-BUS 为此提供各种语言绑定。此外,可以选择:
GLib
Qt
Python
.NET
Java
Perl
C++
Ruby