Hat
译者
⚠️ 注意
如果您发现了错误,欢迎 参与贡献。
💡 摘要 (Powered by OpenAI)
在本文中,我们将介绍 BIRD 的设计目标,包括如何实现支持现有、拥抱最新、复用实现、少造轮子、去耦合、可移植、灵活可靠的路由表、强大的路由过滤器、灵活无耦合的配置文件、高效的实时控制、可靠地响应所有事件等内容目标。
在规划 BIRD 的架构时,我们仔细研究了其他现有的路由守护程序以及在专用路由器上使用的一些操作系统,收集了所有重要特性,并添加了许多新特性。
想以此弥补这些工具的不足之处并更好地满足今天互联网路由的需求,比如 IPv6、策略路由、路由过滤等。从这个规划中,产生了以下一系列设计目标:
我们意识到许多路由程序对于新兴的路由协议的支持都不够完善,支持新的协议标准时,往往需要对代码和配置文件进行大量的修改重构,这样会导致程序的可维护性变差,使网络工程师的学习曲线变得更为陡峭。
于是 BIRD 实现了功能模块化的设计,并将路由协议的实现与核心程序分离,这样就可以轻松地添加新的路由协议,而不需要对核心程序进行修改。
许多路由程序都会在不同的地方重复实现一些相似的功能,这样会导致代码冗余,也增加了维护和学习的成本。
BIRD 将 IPv4 和 IPv6 的实现进行了大量的复用融合,现在可以在同一个进程中同时运行 IPv4 和 IPv6 的路由协议,路由表也更加抽象而统一。
与操作系统的耦合是许多路由程序的通病,这样会导致程序的可移植性变差,也会使程序的维护变得更加困难。
遗憾的是,由于不同操作系统的网络栈实现不同,这种耦合是不可避免的,但是我们可以通过抽象出一些通用的接口,来减少这种耦合。
即使确实需要依赖操作系统的一些特性,我们也会尽可能地将这些特性封装到一个单独的模块中,这样就可以轻松地在不同的操作系统上移植 BIRD。
一些路由程序只允许同时存在一个路由表,存储与操作路由表的逻辑相互耦合,这样会大大降低程序的可扩展性。
BIRD 允许同时存在多个路由表,每个路由表都可以独立地存储和操作路由表,不同的路由表之间也可以相互交换路由信息,这样就可以轻松地实现路由信息的过滤、交换等灵活的操作。
虽然已经有人尝试在动态路由程序中加入路由过滤功能,但大多数都是使用简单的字符过滤,非常不灵活,也很难应用于庞大复杂的网络环境。
于是我们决定采用一种简单的、无循环的编程语言,它可以读取和修改路由表中的路由信息,并根据用户的需求对路由信息进行过滤,这样就可以轻松地实现复杂的路由过滤功能。
某些路由程序的配置文件随意嵌套肆意耦合、允许使用命令行在运行时随意覆盖配置文件,导致极为严重的配置文件混乱灾难。
我们决定采用一种结构化的配置文件,它可以被分为多个模块,每个模块都可以独立地被加载和卸载,不依赖上下文,这样就不会干扰路由过程中不受更改影响的部分。
除了热重载之外,BIRD 还应能够在多用户环境中与其他程序进行通信,以便检查路由表的内容、所有路由协议的状态,并控制它们的行为(禁用、启用或热重载)。
为了实现这一点,我们实现了一个基于 FTP 和 SMTP 所使用的命令行协议(即文本命令和文本回复,伴随着一个数字代码,使它们既易于人类阅读又易于软件识别)。
解决这个问题的传统方法是使用多线程分离所有的路由协议与用户界面的部分,并指望调度程序能够以足够公平的方式分配 CPU 时间。
这确实是一个不错的解决方案,但我们还是避开了涉及大量的线程开销和可能导致的进程锁,选择使用我们自研事件驱动架构。
这种方法很好,但是有一个不太愉快的后果:长期任务必须被分割成由特殊事件或计时器链接的多个部分,以便为其他任务提供 CPU。
译者
原文作者: <Ondrej Filip>
, <Martin Mares>
, <Maria Matejka>
, <Ondrej Zajicek>
原文链接: https://bird.network.cz/?get_doc&v=20&f=prog-1.html#ss1.2
原文标题: 1.2 Design Goals
遵循协议: CC BY-NC-SA 4.0
译者: hat
翻译时间: 2023-11-10
更新时间: 2023-11-12
本文链接: https://bird.xmsl.dev/docs/developer-guide/1-2-design-goals.html