简要分析Netlink协议

Netlink协议是Linux内核中用于内核态与用户态进程间通信(IPC)的一种机制,基于套接字的通信接口,提供高效、灵活的双向数据传输能力,常用于内核模块与用户程序之间的实时交互。

Netlink协议的核心内容

  1. 协议基础
    1. 通信模式:基于消息的通信,支持单播(unicast)、多播(multicast)和广播。
    2. 协议族(Family)
      1. Netlink不是单一协议,而是一组协议族,每个协议族通过唯一的协议号(如NETLINK_ROUTE、NETLINK_USER)区分用途。例如
        1. NETLINK_ROUTE : 路由信息、网络设备管理
        2. NETLINK_KOBJECT_UEVENT :内核事件(如设备热插拔)。
        3. NETLINK_USER:用户自定义
  2. 消息格式

        每条Netlink消息由消息头(Header)+有效载荷(Payload)组成,结构如下:

struct nlmsghdr {__u32 nlmsg_len;    // 消息总长度(包括头部和内容)__u16 nlmsg_type;   // 消息类型(如请求、响应、错误)__u16 nlmsg_flags;  // 标志位(如 NLM_F_REQUEST、NLM_F_MULTI)__u32 nlmsg_seq;    // 序列号(用于跟踪请求/响应)__u32 nlmsg_pid;    // 发送方端口号(PID或自定义标识)
};

        有效载荷:紧跟在nlmsghdr后的用户数据,可以是任意格式(如二进制数据、结构体等)。

3.  地址结构

Netlink使用专用的地址结构标识通信端点:

struct sockaddr_nl {sa_family_t nl_family;  // 固定为 AF_NETLINKunsigned short nl_pad;   // 填充字段(通常为0)pid_t nl_pid;           // 用户态进程的PID或自定义端口号__u32 nl_groups;        // 多播组掩码(用于订阅多播组)
};

Netlink的主要特点

  1. 双向通信
    1. 内核可以主动向用户态发送消息(如事件通知),用户态也可向内核发送请求。
    2. 示例场景:内核检测到网络设备状态变化时,主动通信用户态监控程序。
  2. 支持多协议
    1. 通过协议号区分不同用途的通信,避免消息混杂。
    2. 自定义ieyi:用户可自定义私有协议号(须在中选择未占用的值)。
  3. 大容量数据传输
    1. 支持分片传输,适合传输较大数据块(如配置表、日志)。
  4. 异步通信
    1. 用户态可通过select()、epoll()或非阻塞模式失效异步接收
  5. 多播支持
    1. 允许用户态进程订阅特定多播组,接受特定类型的广播消息。

Netlink的典型应用场景

  1. 网络管理
    1. 配置路由表(NETLINK_ROUTE)
    2. 管理网络设备(如启动/关闭网卡)
  2. 硬件事件通知
    1. 热插拔事件(如USB设备插入)通过NETLINK_KOBJECT_UEVENT通知用户态
  3. 安全模块
    1. SELinux使用Netlink与用户态进程通信
  4. 用户自定义通信
    1. 内核模块与用户程序交换私有数据

Netlink的通信流程

1.  用户态进程

        a. 创建Netlink套接字

int fd = socket(AF_NETLINK, SOCK_RAW, NETLINK_ANC);

        b. 绑定地址并监听消息

struct sockaddr_nl addr;
addr.nl_family = AF_NETLINK;
addr.nl_pid = getpid(); // 使用进程PID作为端口号
bind(fd, (struct sockaddr*)&addr, sizeof(addr));

2. 内核模块

        a. 通过netlink_kernel_create()创建内核端套接字

        b. 使用nlmsg_new()分配消息缓冲区,填充数据后通过netlink_unicast()发送

与其他IPC机制的对比

机制

方向

适用场景

缺点

Netlink

双向

内核-用户态实时通信

需要内核支持

Sysfs

单向

配置内核参数

仅支持小数据,操作基于文件

ioctl

用户→内核

设备控制命令

单向,扩展性差

procfs

单向

状态查询或简单配置

性能较低,不适合高频操作

注意事项

  1. 协议号冲突
    1. 自定义协议号需确保不与内核已有协议冲突(通常从NETLINK_USER开始定义)。
  2. 内核管理
    1. 内核发送的消息由内核自动释放,用户态需自行管理接受缓冲区。
  3. 权限控制
    1. 可通过CAP_NET_ADMIN权限限制敏感操作(如修改路由表)

总结

Netlink是linux内核中高效、灵活的内核-用户态通信协议,尤其适合需要双向交互和大数据量传输的场景

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/30776.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

nvm list available为空

nvm list available为空 该问题主要是因为nvm 获取不到node导致,排查网络问题外,可能就是由于nvm环境变量配置问题导致,本次我这个问题就是由于环境变量配置缺少导致的。 第一步:排查并排除了网络问题。 第二步:排查环…

mosfet的驱动设计-栅极电阻

栅极电阻在MOSFET驱动电路中具有关键作用,其阻值直接影响器件开关速度、功率损耗及电磁干扰水平。本文将从物理原理出发,推导典型栅极电阻计算公式,并详细说明各参数选取依据。 本人查阅了很多资料,不同的资料介绍的计算方法也不尽…

Unity Dots从入门到精通之 Prefab引用 转 实体引用

文章目录 前言安装 DOTS 包实体引用Authoring 前言 DOTS(面向数据的技术堆栈)是一套由 Unity 提供支持的技术,用于提供高性能游戏开发解决方案,特别适合需要处理大量数据的游戏,例如大型开放世界游戏。 本文讲解我在…

并查集模板

注意理解路径压缩 static class UnionFind {int[] fa;public UnionFind(int n) {fa new int[n];for (int i 0; i < n; i) {fa[i] i;}}public int find(int i) {if (fa[i] ! i) {fa[i] find(fa[i]);}return fa[i];}public void union(int i, int j) {int fai find(i);in…

深入了解Linux —— 调试程序

前言 我们已经学习了linux下许多的工具&#xff0c;vim、gcc、make/makefile等&#xff1b; 已经能够在linux写代码&#xff0c;并且进行编译运行&#xff0c;让程序在linux下跑起来。 但是&#xff0c;如果我们在写代码的时候遇见了错误&#xff1b;但是我们并不知道错误在哪&…

Python接口自动化之断言封装!

该框架支持两种断言方式&#xff0c;相等和包含。 先看一下断言的yaml文件编写规范&#xff1a; validate: - equals: {status_code: 200} - contains: $ddt{assert_str} 其中assert_str和之前用例一样&#xff0c;作为变量&#xff0c;放在对应的data yaml文件中 # D…

基于Rye的Django项目通过Pyinstaller用Github工作流简单打包

前言 Rye的介绍和安装 Ryehttps://rye.astral.sh/Rye 完整使用教程_安装rye-CSDN博客https://blog.csdn.net/zhenndbc/article/details/144544692 正文 项目建立 配置好环境后 新建文件夹 新建文件夹&#xff0c;进入项目 初始化 rye init下载依赖 rye syncpycharm 打…

Pycharm 取消拼写错误检查(Typo:in word xxx)

现象 Pycharm显示单词存在错误&#xff0c;下面看着有下划波浪线&#xff0c;看着很不舒服。 快捷键AltEnter&#xff0c;查看提示错误。 Typo是啥? "Typo" 这个词通常用于描述打字或排印过程中的小错误&#xff0c;尤其是拼写错误。它指的是在文本中由于打字或印刷…

K8S学习之基础十七:k8s的蓝绿部署

蓝绿部署概述 ​ 蓝绿部署中&#xff0c;一共有两套系统&#xff0c;一套是正在提供服务的系统&#xff0c;一套是准备发布的系统。两套系统都是功能完善、正在运行的系统&#xff0c;只是版本和对外服务情况不同。 ​ 开发新版本&#xff0c;要用新版本替换线上的旧版本&…

三、0-1搭建springboot+vue3前后端分离-idea新建springboot项目

一、ideal新建项目1 ideal新建项目2 至此父项目就创建好了&#xff0c;下面创建多模块&#xff1a; 填好之后点击create 不删了&#xff0c;直接改包名&#xff0c;看自己喜欢 修改包名和启动类名&#xff1a; 打开ServiceApplication启动类&#xff0c;修改如下&#xff1a; …

任天堂Switch拉美游戏价涨,传Switch 2全球或提价

易采游戏网3月9日独家消息&#xff1a;近日据相关资讯显示&#xff0c;在拉丁美洲地区&#xff0c;任天堂Switch的游戏价格出现了上扬态势。这一变化引发了玩家与市场的关注&#xff0c;不过就目前而言&#xff0c;其并未波及全球游戏市场的整体定价格局。但值得注意的是&#…

10.2 继承与多态

文章目录 继承多态 继承 继承的作用是代码复用。派生类自动获得基类的除私有成员外的一切。基类描述一般特性&#xff0c;派生类提供更丰富的属性和行为。在构造派生类时&#xff0c;其基类构造函数先被调用&#xff0c;然后是派生类构造函数。在析构时顺序刚好相反。 // 基类…

如何在需求分析阶段考虑未来扩展性

在需求分析阶段考虑未来扩展性的关键在于 前瞻规划、灵活架构、标准设计。其中&#xff0c;前瞻规划尤为重要&#xff0c;因为通过全面分析业务发展趋势与技术演进&#xff0c;能够在初期设计阶段预留足够扩展空间&#xff0c;降低后期改造成本&#xff0c;为企业长期发展奠定坚…

PawSQL for MSSQL:PawSQL 支持 SQL Server 的SQL优化、SQL审核、性能巡检

0. 概述 在PawSQL的最新版本中&#xff0c;PawSQL 为 SQL Server 数据库提供了全方位的SQL优化、SQL审核、性能巡检支持&#xff0c;覆盖SQL开发、测试、运维的整个生命周期&#xff0c;助力用户充分发挥 SQL Server 数据库的性能潜力。 1. 纳管SQL Server 实例 工作空间是SQ…

【Java代码审计 | 第六篇】XSS防范

文章目录 XSS防范使用HTML转义使用Content Security Policy (CSP)输入验证使用安全的库和框架避免直接使用用户输入构建JavaScript代码 XSS防范 使用HTML转义 在输出用户输入时&#xff0c;对特殊字符进行转义&#xff0c;防止它们被解释为HTML或JavaScript代码。 例如&…

NO.26十六届蓝桥杯备战|字符数组七道练习|islower|isupper|tolower|toupper|strstr(C++)

P5733 【深基6.例1】自动修正 - 洛谷 小写字母 - 32 大写字母 大写字母 32 小写字母 #include <bits/stdc.h> using namespace std;const int N 110; char a[N] { 0 };int main() {ios::sync_with_stdio(false);cin.tie(nullptr);cin >> a;int i 0;while (a…

langChainv0.3学习笔记(初级篇)

LangChain自0.1版本发布以来&#xff0c;已经历了显著的进化&#xff0c;特别是向AI时代的适应性提升。在0.1版本中&#xff0c;LangChain主要聚焦于提供基本的链式操作和工具集成&#xff0c;帮助开发者构建简单的语言模型应用。该版本适用于处理简单任务&#xff0c;但在应对…

qt 播放pcm音频

一、获取PCM音频 ffmpeg -i input.mp3 -acodec pcm_s16le -ar 44100 -ac 2 -f s16le output.pcm -acodec pcm_s16le&#xff1a;指定16位小端PCM编码格式&#xff08;兼容性最佳&#xff09;-ar 44100&#xff1a;设置采样率为CD标准44.1kHz&#xff08;可替换为16000/8000等&a…

Windsuf 连接失败问题:[unavailable] unavailable: dial tcp...

问题描述 3月6日&#xff0c;在使用Windsuf 时&#xff0c;遇到以下网络连接错误&#xff1a; [unavailable] unavailable: dial tcp 35.223.238.178:443: connectex: A connection attempt failed because the connected party did not properly respond after a period of…

Leetcode 刷题记录 05 —— 普通数组

本系列为笔者的 Leetcode 刷题记录&#xff0c;顺序为 Hot 100 题官方顺序&#xff0c;根据标签命名&#xff0c;记录笔者总结的做题思路&#xff0c;附部分代码解释和疑问解答。 目录 01 最大子数组和 方法一&#xff1a;动态规划&#xff08;卡达尼算法&#xff09; 方法…