20220925-监听网络环境变化
监听网络环境变化
0. 概述
监听网络环境变化情况一般来说可以通过以下方式进行:
方式1:BIRD协议(BFD机制:状态更新间隔调整 + 状态机转换(tla+))
方式2:libnl
方式3:netlink(参考链接)
configure.ac
文件,设置CONFIG_FILE
变量为配置文件;autoconf
将configure.ac
中的宏展开,生成configure脚本;conf/conf.c
文件中通过config_parse
函数进行语法解析;sysdep/unix/main.c
文件分析:
parse_args
函数对配置文件解析(解析指定路径,无指定则选择默认配置);log_switch()
, random_init()
, net_init()
, resource_init()
, timer_init()
, olock_init()
, io_init()
, rt_init()
,if_init()
;核心文件夹:
filter
:过滤器相关;lib
:底层实现相关;lib/birdlib.h
:包含编译bird-gdb.py;nest
:BIRD核心相关;proto
:协议相关;sysdep
:glibc系统相关;test
:暂未了解【猜测是用来debug的,里面包含了gdb等】;其他知识点:
.Y(Yet Another Compiler Compiler)
是Unix/Linux上一个用来生成编译器的编译器。yacc生成的编译器主要是用C语言写成的语法解析器(Parser),需要与词法解析器Lex一起使用,再把两部份产生出来的C程序一并编译。
.m4
文件:M4实际上是一种编程语言,后缀是.m4,说明这个文件是使用.m4写的,说的专业一点,这实际上就是一个通用宏处理器。 它经常被用来生成Makefile的脚本语言来使用。
toml
文件:配置文件,一种非常基础的文件格式。
distribution
(often abbreviated as distro
);
misc
文件夹:contains miscellaneous file types that do not fit within other categories.
sysdep
文件夹:(在Linux源码中是/arch
,在glibc
中是/sysdep
)
glibc
是GNU发布的libc库,即c运行库。glibc是linux系统中最底层的api,几乎其它任何运行库都会依赖于glibc。glibc除了封装linux操作系统所提供的系统服务外,它本身也提供了许多其他一些必要功能服务的是心啊。
stdarg.h
: a header in the C standard library of the C programming language that allows functions to accept an indefinite number of arguments.
···
用法:可变参数函数是可以采用可变数量的参数并用省略号代替最后一个参数声明的函数。例如:static void bt_log_overall_result(int result, const char *fmt, ...)
。
asciz
:编译相关;
ISP
:互联网服务提供商,如电信、网通等;
Linux Kernel Netlink Route Syncer:
GNU的autoconf可以用来生成makefile。一个GNU程序的编写,需要autoscan, aclocal, autoconf和automake这四个工具;
GNU软件安装的三部曲是:./configure
, make
, make install
;
./configure
根据autoconf, aclocal等工具生成一个makefile文件。检测你的安装平台的目标特征的。比如它会检测你是不是有CC或GCC,并不是需要CC或GCC,它是个shell脚本。make
从Makefile中读取指令,然后编译;make install
是用来安装的,它也从Makefile中读取指令,安装到指定的位置。守护进程(Daemon)是运行在后台的一种特殊进程。它独立于控制终端并且周期性地执行某种函数或等待某些发生的事件。守护进程最重要的特性是后台运行。其次,守护进程必须与其运行前的环境隔离开来(这些环境包括未关闭的文件描述符、控制终端、会话和进程组、工作目录以及文件的创建掩模等)。这些环境通常是守护进程从执行它地方父进程中集成下来的。最后,守护进程的启动方式有其特殊之处。它可以在linux系统启动时从启动脚本/etc/rc.d
中启动,可以由作业规划进程crond启动,还可以由用户终端执行。
为避免挂起控制终端将Daemon放入后台执行,相应的解决方法是在进程中调用fork使父进程终止,让Daemon在子进程中后台执行。
C使用:
read()
用于读取打开文件的内容,返回实际读取的字节数;
getgrnam()
用于逐一搜索参数指定的组名称,找到时便将改组的数据以group结构返回;
getgrgid()
用于根据参数gid指定的组识别码逐一搜索组文件,找到时便将该组的数据以group结构返回;
getopt()
函数用于解析命令行选项,可用来捕获选项(如-c
, -v
等),在sysdep/unix/main.c
中optstring = bc:dD:ps:P:u:g:flRh
;
a:b:cd::e
,这就是一个选项字符串。对应到命令行就是-a ,-b ,-c ,-d, -e 。冒号又是什么呢? 冒号表示参数,一个冒号就表示这个选项后面必须带有参数(没有带参数会报错哦),但是这个参数可以和选项连在一起写,也可以用空格隔开,比如-a123 和-a 123(中间有空格) 都表示123是-a的参数;两个冒号的就表示这个选项的参数是可选的,即可以有参数,也可以没有参数,但要注意有参数时,参数与选项之间不能有空格(有空格会报错的哦),这一点和一个冒号时是有区别的。
setsid()
的作用:(1)新建一个对话;(2)新建进程组;
strrchr(str, c)
:查找str中最后一次出现字符的位置,并返回从字符串中的这个位置起,直到字符串结束的所有字符;
每个打开的文件描述符(fd标志)在进程表中都有自己的文件表项。dup()
函数被调用时,内核在进程中创建一个新的文件描述符,此描述符是当前可用文件描述符的最小数值,这个文件描述符指向oldfd所拥有的文件表项。
pthread_self()
:获得自身线程标识。
pthread_create()
:创建线程调用。
va_start(va_list ap, last_arg)
:将初始化ap变量,与va_arg
和va_end
宏是一起使用的,last_arg
是最后一个传递给函数的已知的固定参数,即省略号之前的参数。
ftrubcate(int fd, off_t length)
:改变文件大小,即会将参数fd指定的文件大小改为参数length指定的大小。
在头文件中使用#ifdef
和#ifndef
是非常重要的,可以防止双重定义的错误。具体而言,其作用是当满足某条件时对一组语句进行编译,而当条件不满足时则编译另一组语句。
isatty()
:检查给定的设备类型函数名;
socket(AF_UNIX, SOCK_STREAM, 0);
用于实现同一主机上的进程间通信;
Makefile语法:
makefile
中.PHONY
的作用是声明伪目标。声明为为目标后,在执行对应的命令时,make就不会去检查是或否存在对应的文件,而是每次都会运行标签对应的命令;patsubst
函数用于将文件模式进行替换,其格式为$(patsubst原模式,目标模式,文件列表)
;
BIRD使用命令:
systemctl start bird
systemctl stop bird
systemctl restart bird
sudo systemctl enable/disable bird
;socket:
TCP/IP和HTTP协议的关系:
hook:
MPLS:
平滑重启(graceful restart):(参考)
定义:在主备切换或协议重启时保证转发业务不中断的机制。
高可靠性(HA, High Availability)技术:HA是一整套综合技术,主要包括冗余容错、链路保证、节点故障修复及流量工程。其中,GR是一种冗余容错技术,目前已经被广泛的使用在主备切换和系统升级方面,以保证关键业务的不间断转发。
前提:
传统技术和GR技术的比较:
传统主备切换时造成的网络问题:
采用GR技术解决了主备切换时造成的网络问题:
注意:如果在R1在GR的过程中,网络拓扑发生了变化,那么可能导致短暂的路由环路或路由黑洞。对于这个问题的处理方法,目前不同厂商的实现略有不同。与业务中断的危害相比较,是否可以容忍可能出现的短暂的路由环路和路由黑洞,对这个问题的不同观点决定了在具体实现上的不同。
网络流量工程:
WebRTC(Web Real-Time Communication)是一个可以用在视频聊天、音频聊天或P2P文件分享Web App中的API。
WebRTC是一个可以在Web程序中实现音频,视频和数据的实时通信的开源项目。在实时通信中,音视频的采集和处理是一个很复杂的过程。比如音视频流的编解码、降噪和回声消除等,但是在WebRTC中,这一切都交由浏览器的底层封装来完成。我们可以直接拿到优化后的媒体流,然后在其输出到本地屏幕和扬声器,或者转发给其对等端。长话短说,就是一个支持网页浏览器进行实时语音对话、视频对话、数据传输的API。