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种:/procioctlnetlink。前两种都是单向的,而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进程发送通知等;

3. ioctl()

【未完待续】