Plankton: Scalable network configuration verification through model checking
背景
对支持充分多路由协议的大规模网络配置验证工作仍具有挑战。
已有研究
-
离线数据平面验证:Anteater, HSA
-
配置分析工具:Batfish,ERA,ARC, Minesweeper,在提供的特定环境和网络配置下,检查网络的“正确性”,但都面临同样的问题:scalability
已有工具的其他问题:
ARC: 使用抽象图算法来对网络建模验证,但只局限于最短路径路由
Minesweeper:将网络控制平面编码成SMT约束再求解,存在性能瓶颈
Batfish:基于模拟的方式,只能得到唯一收敛的路由计算结果,采取枚举方式的验证,效率太低
-
影响scalability的主要因素:1. 巨大的包头空间,2.控制平面执行结果的不确定性
思路
将等价划分(equivalence partitioning)和显示状态模型检查(explicit-state model checking)结合起来,以提高现有方法的扩展性。
-
equivalence partitioning
用来减小需要检查的数据包头空间,方法参考 VeriFlow ,在Plankton中,保持相同转发行为的数据包记为Packet Equivalence Classes (PECs),然后对这些PECs尽可能地采取独立分析,提高并行性。但是对数据包头中的前缀划分需要考虑前缀之间可能存在的依赖关系,Plankton中设计了一个依赖感知器来调度不同PECs的计算顺序。
-
explicit-state model checking
用来解决控制平面不同收敛状态下产生的数据平面多样性问题。通用的SMT求解技术让网络验证工作的困难程度超过了它的本质,事实上,常见的情况是控制平面计算最短或最小代价路径的一些变体。Plankton在SMT(Z3)和模型检查器(SPIN)中实现了简单的单源最短路径求解器,模型检查器可以探索许多不确定的路径执行结果,并且性能优于SMT。
SPIN performs a depth-first search on the state space of the program, looking for states that violate the policy being checked.
-
pruning “irrelevant” non-determinism
the effect of non-determinism is important, but the amount of “relevant” non-determinism is limited
创建包含不确定性行为的控制平面,并对无关的非确定性部分进行剪枝。
策略检查范围
Reachability, Waypointing, Loop Freedom, BlackHole Freedom,Bounded Path Length and Multipath Consistency
方法
利用等价划分技术来管理巨大的包头空间和显示模型检查来搜索路由协议执行的结果,并通过优化手段来减少探索的空间范围,以提高扩展性。
Packet Equivalence Classes
Plankton使用trie树的技术来管理等价类,每个节点关联一个配置对象,对于每一个已知的分区,该对象记录了对应网络配置的范围。当遍历到一个新的网络前缀时,可以通过将其关联的原始前缀对应的配置合并,来表示当前节点的网络配置范围。
Dependency-aware Scheduling
进行等价类划分是为了对它们进行独立分析,但是网络中的前缀在路由计算过程中,是存在相互依赖关系的,例如iBGP的计算需要IGP路由来解决下一跳的可达问题,因此需要对不同等价类之间存在的依赖关系进行分析。
在Minesweeper中,对于运行(n)个运行iBGP的路由器,Minesweeper创建(n+1)个网络副本,搜索n个环回地址和BGP的收敛解决方案,如上图所示,这导致问题原有的规模扩大((n ightarrow n^2))。但是Plankton会首先分析PECs的依赖关系,构建成有向图SCC:
-
位于同一个SCC的PECs存在相互依赖关系,他们需要同时一起验证;
-
不同SCC之间存在有向边,则下游的SCC必须在上游的SCC分析完之后再进行;
-
分析的结果包括可能的收敛结果,被写入本地,提供给后续分析;
Explicit-state Model Checker
对控制平面不确定性结果的探索由SPIN完成,对于每个SCC,Plankton都使用SPIN来详尽地探索控制平面的行为。被SPIN执行的网络模型:
- SPVP and its extension
SPVP是真实世界中BGP的一个抽象模型,用import/export filter 和 ranking function 的抽象概念取代了BGP配置的细节。一些不恰当的BGP配置会导致出现不收敛情况,如果只通过模型检查器探索收敛状态下的行为,则是完备的。
-
Reduced Path Vector Protocol (RPVP)
line5
A node n is considered enabled if either
- the current best path p of n is invalid, meaning that the next hop in p has a best path that is not a prefix of p.
- there is a node (n') among the peers of n that can produce an advertisement which will change the current best path of n.
RPVP的每一步可以用若干步SPVP完成,如果只关心收敛状态,RPVP也是完备的:
Theorem 1: For any converged state reachable from the initial state of the network with a particular set of links L failing at certain steps during the execution of SPVP, there is an execution of RPVP with the same import/export filters and ranking functions equal to the latest version of ranking functions in the execution of SPVP, which starts from the initial state in which all links in L have failed before the protocol execution starts, and reaches the same converged state. Particularly, there is a such execution in which at each step, each node takes a best path that does not change during the rest of the execution.
Policies
Plankton实现了一个策略API,其中一个策略提供一个回调,每次模型检查器生成收敛状态时都会调用该回调。
优化
Partial Order Reduction
Explore consistent executions only
一致执行: 对于收敛状态S以及一个RPVP的偏序执行(pi),如果(pi)的每一步执行中,节点选择的路径都与S中的一致,就称(pi)是一致的。定理1确保在发生链路故障的情况下,一致执行总能得到一个收敛的状态,因此模型检查器只探索与某些收敛状态一致的执行就能保证完备性。模型检查使用POR技术进行优化。
如何知道收敛状态对应的执行情况呢?Plankton是假设所有的偏序执行都是相关的,然后探索所有的执行情况,一旦出现反例,就停止探索该执行。
Deterministic nodes
为了减少模型检查器探索的空间,需要对“不相关”的非确定性进行修剪。在执行过程中,每一步选择中,确定性节点不会改变收敛状态。因此一个优化方向是尽量识别网络中的确定性节点。
Theorem 2. Any partial execution of RPVP consistent with a converged state can be extended to a complete execution consistent with that state.
Decision independence
分析节点之间执行的独立性,来进行独立分析。
Failure ordering
模型检查器在协议开始执行之前执行所有拓扑更改,还强制执行了严格的链路故障顺序,进一步减少了分支。
Policy-based Pruning
基于策略的修剪将协议的执行限制在网络中与策略的满意/失败相关的部分
Choice of Failures
参考【Bonsai】,将网络中的设备分组为抽象节点,创建一个较小的拓扑用于验证,Plankton首先计算设备等效类(DEC),并将链路等效类(LEC)定义为两个DEC之间的链接集合。对于每个链接失败,浮游生物然后只探索来自每个LEC的一个代表。
State Hashing
对状态空间的详尽探索过程中,显式状态模型检查器需要同时跟踪大量的状态,对网络状态使用更高效的表示方法,并建立哈希索引来进行优化。