首页 > 其他分享 >NetworkManager接收和处理客户端请求通信机制

NetworkManager接收和处理客户端请求通信机制

时间:2024-09-11 13:35:58浏览次数:1  
标签:freedesktop nmcli 系统总线 Bus org NetworkManager 接收 客户端

NetworkManager 守护进程通过监听 D-Bus 通信来接收和处理来自客户端(如 nmcli 或其他应用程序)的请求。这是 Linux 中进程间通信(IPC)的一种常见方式。D-Bus 是一个消息总线系统,允许应用程序在不直接通信的情况下,通过消息总线交换数据。NetworkManager 使用 D-Bus 作为其主要的通信机制,下面是具体的细节:

1. D-Bus 简介

D-Bus 分为两种类型:

  • 系统总线(System Bus):用于系统范围内的服务和守护进程之间的通信,通常由 dbus-daemon 负责管理。
  • 会话总线(Session Bus):用于用户会话中的进程间通信。

NetworkManager 使用 系统总线,因为它是一个系统服务,负责管理整个系统的网络连接。所有与 NetworkManager 交互的请求都会通过系统总线发送和接收。

2. NetworkManager 注册 D-Bus 服务

当 NetworkManager 守护进程启动时,它会在 D-Bus 系统总线上注册自己,声明它提供了某些服务和接口,供其他进程调用。NetworkManager 注册的 D-Bus 服务名称通常是:

org.freedesktop.NetworkManager

D-Bus 系统总线会将这个服务名称与 NetworkManager 守护进程关联起来。这样,任何通过 D-Bus 发送给 org.freedesktop.NetworkManager 的消息都会由 NetworkManager 处理。

3. nmcli 与 NetworkManager 的通信流程

nmcli 执行 nmcli connection up 命令时,它会通过 D-Bus 系统总线与 NetworkManager 守护进程通信。这个通信的过程如下:

3.1 nmcli 发送 D-Bus 请求

nmcli 会构建一个 D-Bus 消息,将其封装为请求并发送到 D-Bus 系统总线。具体来说,nmcli 通过调用 NetworkManager 的 D-Bus 接口发送一个方法调用请求,比如:

org.freedesktop.NetworkManager.ActivateConnection

这个方法要求 NetworkManager 激活指定的网络连接。消息的格式可能包括以下信息:

  • 目标对象/org/freedesktop/NetworkManager
  • 接口名称org.freedesktop.NetworkManager
  • 方法名称ActivateConnection
  • 参数:连接的 UUID、设备名称、具体的连接配置等。

3.2 D-Bus 系统总线转发消息

D-Bus 系统总线(由 dbus-daemon 进程管理)会负责将 nmcli 发送的消息转发给 NetworkManager。总线会检查消息的目标服务名称(org.freedesktop.NetworkManager),并将消息路由给 NetworkManager 守护进程。

4. NetworkManager 处理 D-Bus 请求

NetworkManager 守护进程持续监听 D-Bus 系统总线。当接收到来自 nmcli 的消息时,具体的处理过程如下:

4.1 消息解析

NetworkManager 会解析收到的 D-Bus 消息,并识别其中的方法调用和参数。例如,当 NetworkManager 收到 ActivateConnection 方法的调用时,它会检查连接的 UUID 或者设备名称,并确定要激活的连接。

4.2 执行网络操作

根据消息中的方法调用,NetworkManager 会执行相应的网络操作。例如,如果是 ActivateConnection 方法,NetworkManager 会执行:

  • 查找并读取连接配置。
  • 配置网络接口并启用该接口。
  • 分配 IP 地址、设置路由和 DNS 等。

这些操作可能涉及与内核通过 netlink 交互,控制网络设备的状态。

4.3 异步处理

D-Bus 支持异步通信,意味着 NetworkManager 在处理某些较慢的操作(如 DHCP IP 分配、网络接口配置等)时,可以通过异步调用来避免阻塞。NetworkManager 会启动这些操作,并在操作完成后再发送回复。

5. NetworkManager 发送 D-Bus 响应

一旦 NetworkManager 完成了指定的操作(例如成功激活连接),它会通过 D-Bus 发送响应消息,通知请求的客户端(如 nmcli)操作的结果。响应消息可能包含以下信息:

  • 状态码:指示操作是否成功。如果失败,还会附带错误代码。
  • 结果数据:例如,激活连接的接口名称、分配的 IP 地址等。

这个响应消息会通过 D-Bus 系统总线发送回给 nmcli

6. nmcli 处理 D-Bus 响应

nmcli 在接收到 NetworkManager 的响应后,会解析该消息,并将结果反馈给用户。如果操作成功,它会输出成功的消息,例如:

Connection 'MyConnection' successfully activated.

如果操作失败,nmcli 会显示错误消息,并可能提供故障诊断信息。

7. NetworkManager D-Bus API 的具体接口

NetworkManager 提供了多个 D-Bus 接口和方法,供 nmcli 或其他应用程序使用。常用的接口包括:

  • org.freedesktop.NetworkManager:这是主要的接口,提供了管理连接、设备和总体网络配置的功能。例如:

    • ActivateConnection():激活某个连接。
    • DeactivateConnection():断开某个连接。
    • GetDevices():获取所有可用的网络设备。
  • org.freedesktop.NetworkManager.Device:用于查询和管理具体网络设备的接口。例如:

    • GetDeviceType():获取设备类型(如有线、无线等)。
    • Reapply():重新应用设备的配置。
  • org.freedesktop.NetworkManager.Connection.Active:用于管理活动连接的接口。例如:

    • GetConnection():获取连接的详细信息。
    • Disconnect():断开活动连接。

8. 错误处理

如果在处理请求时出现错误(如设备不可用、连接配置无效等),NetworkManager 会通过 D-Bus 发送带有错误状态的响应。常见的错误包括:

  • org.freedesktop.NetworkManager.DeviceNotFound:表示找不到指定的网络设备。
  • org.freedesktop.NetworkManager.ConnectionError:表示无法激活连接。

nmcli 收到错误响应后,会将错误信息显示给用户。

9. D-Bus 信号

除了请求-响应的方式,NetworkManager 还会通过 D-Bus 发送信号(Signals)来异步通知其他进程网络状态的变化。例如,当网络接口状态发生变化时,NetworkManager 会发送类似如下的 D-Bus 信号:

PropertiesChanged(org.freedesktop.NetworkManager.Device, ...)

其他订阅了该信号的进程(如 GUI 工具或监控工具)可以响应这些信号并更新其状态。

总结

NetworkManager 守护进程通过 D-Bus 与 nmcli 进行通信。这个通信流程包括:nmcli 发送 D-Bus 请求,D-Bus 系统总线将消息转发给 NetworkManager,NetworkManager 解析请求、执行操作并返回响应。通过这种机制,nmcli 可以与 NetworkManager 高效地进行进程间通信,以管理系统的网络连接。

标签:freedesktop,nmcli,系统总线,Bus,org,NetworkManager,接收,客户端
From: https://www.cnblogs.com/wanghongwei-dev/p/18408091

相关文章

  • Kafka客户端核心参数详解
    目录从客户端理解Kafka正确使用方式一、客户端1、消息发送者主流程2、消息消费者主流程二、从客户端属性来梳理客户端工作机制1、消费者分组消费机制2、生产者拦截器机制3、消息序列化机制4、消息分区路由机制5、生产者消息缓存机制6、发送应答机制7、生产者消息......
  • KingFusion|KingFusion客户端接入KingHistorian历史数据
    哈喽,你好啊,我是雷工!本来想着再也不会使用到KingFusion这个软件了,结果有个相关的项目有一些问题让去处理,时隔多半年不得不重新再次打开这个软件,庆幸的是虚拟机内的软件还能正常运行,避免了重新安装一遍的繁琐;前面记录了《KingIOServer数据存入KingHistorian的......
  • 13.6 编写go代码接收webhook的告警发送钉钉
    本节重点介绍:使用钉钉机器人发送到钉钉群通过alertmanagerwebhook发送我们自定义的go程序中解析alert对象并拼接钉钉信息发送需求分析使用钉钉机器人发送到钉钉群钉钉机器人发送群消息文档地址通过webhook发送我们自定义的go程序中然后解析发过来的alert,转换成钉钉的数据结构。......
  • ssh客户端选择
    背景挑选一款用于连接linux主机的ssh客户端。当然,ssh不止可以连接远程linu主机,但我主要是这个用途。需求保存使用的连接,下次连接可以快速连接上,最好不需要输入密码。界面最好好看一些,像PuTTY这种就显得有些老了。最好是多平台的,比如linux和windows都能用。最好是开源的,......
  • CH58x/CH59x/CH57x RF_PHY(2.4g)切换Channel发送接收
    前言:在做某些应用的时候可能需要我们发送或者接收时切换对应的channel。此次完成测试的平台在WCH的CH592F上完成的。在工作发送过程中切换37、38、39三个信道进行轮询发送。具体需要使用最关键的函数是:RF_SetChannel实现代码如下:if(events&channl_37_tx_evt){......
  • 使用SSE发送和接收流式数据
    背景早期去玩了一下各个Ai厂商的免费额度(主要是国内的),虽然不是很给力,但是还是蛮好玩的。建立长连接我们通常使用WebSocket,而对于流式数据发送,只需要服务器返回数据,而不需要客户端发送数据的情况下,SSE是一个不错的选择。介绍SSE(Server-SentEvents)。数据格式大致如下,如果不写......
  • python接收163邮箱邮件
    importosimportemailimportimaplibimportquopriimportrequestsimportrefromemail.headerimportdecode_headerimportjsonfrompathlibimportPathproject_dir=Path(__file__).resolve().parentimap_host="imap.163.com"email_user=&q......
  • U3D德州工程源码带视频教程带控服务端打包透视客户端u3d打包java后端Spring Boot框架
    U3D德州工程源码带控服务端打包透视客户端u3d打包java后端SpringBoot框架实现技术安卓苹果U3D开发,C#语言后端java SpringBo完整开源不加密,搭建视频教程https://www.bilibili.com/video/BV1PnHLewEkZ/长达八十分钟的搭建教程......
  • 【C#生态园】构建完美的C#网络请求:深度剖析六大HTTP客户端库
    构建高效网络应用:C#HTTP库终极手册前言在现代的软件开发中,与网络通信相关的功能变得愈发重要。针对C#开发者而言,选择一个合适的HTTP客户端库和RESTfulAPI客户端库至关重要。这些库可以帮助开发者简化HTTP请求、处理API响应、处理重试和异常以及进行JSON序列化和反序列化......
  • 客户端代码
    //客户端#include"mysocket.h"//头文件usingnamespacestd;intmain(){cout<<"-------------------客户端---------------\n";startup();//填充服务端:这里填和服务端一样的就好,不做解释SOCKETclient=createSocket(PF_INET,SOCK_STREAM);......