20220925-监听网络环境变化
监听网络环境变化
0. 概述
监听网络环境变化情况一般来说可以通过以下方式进行:
方式1:BIRD协议(BFD机制:状态更新间隔调整 + 状态机转换(tla+))
方式2:libnl
方式3:netlink(参考链接)
1. libnl概念
核心库(core library)提供了使用netlink套接字进行通信的基础功能。它处理套接字的连接建立和断开、发送和接收数据、构造和解析消息、提供可配置的接收状态机。除此之外它还提供了一套抽象数据类型的框架,这套框架使得基于对象的netlink协议实现起来更加简单。在这种协议中,对象可以通过基于netlink的协议来添加、删除或者修改。
- netlink libray:套接字的处理、发送和接收数据、消息的构造和解析;
- routing family library:地址、链路、邻居节点、路由、流量控制、邻居节点表;
- netfilter library:连接追踪、记录日志、排队;
- generice netlink library:控制器的API、协议簇和命令的注册;
2. netlink概念
- 概念:用以实现用户进程与内核进程通信的一种特殊的进程间通信(IPC),也是网络应用程序与内核通信的最常用的接口;
- 在linux内核中,使用netlink进行应用与内核通信的应用有很多:
- 路由daemon:NETLINK_ROUTE
- 用户态socket协议:NETLINK_USERSOCK
- 防火墙:NETLINK_FIREWALL
- netfilter子系统:NETLINK_NETFILTER
- 内核事件向用户态通知:NETLINK_KOBJECT_UEVENT
- 通用netlink:NETLINK_GENERIC
- netlink是一种在内核与用户应用间进行双向数据传输的非常好的方式,用户态应用使用标准的socket API就可以使用gnetlink提供的强大功能,内核态需要使用专门的API来使用netlink;
- 一般来说,用户空间和内核空间的通信方式有3种:
/proc
、ioctl
、netlink
。前两种都是单向的,而netlink可以实现双工通信; - netlink相对于系统调用,ioctl以及
/proc
文件系统而言,具体有以下优点:- netlink使用简单,只需要在
include/linux/netlink.h
中增加一个新类型的netlink协议定义即可(#define NETLINK_TEST 20
)。然后,内核和用户态应用就可以立即通过socket API使用该netlink协议类型进行数据交换; - netlink是一种异步通信机制,在内核与用户态应用之间传递的消息保存在socket缓存队列中发送消息只是把消息保存在接收者的socket的接收队列,而不需要等待接收者收到消息;
- 使用netlink的内核部分可以采用模块的方式实现,使用netlink的应用部分和内核部分没有编译时依赖;
- netlink支持多播,内核模块或应用可以把消息多播给一个netlink组,属于该netlink组的任何内核模块或应用都能接收到该消息,内核事件向用户态的通知机制就使用了这一特性;
- 内核可以使用netlink首先发起会话;
- netlink协议基于BSD socket和AF_NETLINK地址簇,使用32位的端口号寻址,每个netlink协议通常与一个或一组内核服务/组件相关联,如NETLINK_ROUTE用于获取和设置路由与链路信息、NETLINK_KOBJECT_UEVENT用于内核向用户空间的udev进程发送通知等;
- netlink使用简单,只需要在
3. ioctl()
【未完待续】