Page 417 - 《软件学报》2025年第8期
P. 417
3840 软件学报 2025 年第 36 卷第 8 期
● 难以在可编程数据面上完成熵值计算. 由于可编程交换机仅支持简单的整数算术运算, 不支持对数、熵值
等复杂运算类型及浮点数的计算, 并且无法在一次计算中同时获得多个数据包的信息, 这导致难以直接对所有数
据包统计信息进行熵值计算.
为了解决以上的问题, 本文中针对可编程数据面的特性及计算与存储限制, 对上述流程中的步骤设计了适应
可编程交换机的计算模块, 其中包含一种多组 Sketch 轮换的新型数据结构用于实现对多个窗口统计信息的记录
与保存, 同时, 使用了逐包累加的熵值计算方式以及基于查找转发的计算方法, 实现对熵值的计算. 各模块功能与
关键技术如下所示.
● 地址频率统计与状态保存 (第 4.2.1 节). 使用多组 Sketch 轮换的新型数据结构, 完成多个观察窗口统计数据
的实现对观察窗口内 IP 地址频率的估计和保存, 同时完成观察窗口结束时所需的自动刷新.
● 熵值计算模块 (第 4.2.2 节). 使用逐包累加的熵值计算方法, 将原始的单次计算转换成单个时间窗口的数据
包熵值增量的累加, 在每个数据包到达时对熵值进行更新, 无须获取其他数据包信息; 同时, 使用基于查找转发的
计算方法, 完成计算中所涉及的对数、熵值等复杂运算.
● DDoS 攻击状态判定模块 (第 4.2.3 节). 通过多个计数器实现包含安全状态与 DDoS 攻击状态的有限状态
机, 实现对当前窗口的 DDoS 攻击检测及当前系统所处状态的保存.
● 数据包类别判定及受攻击 IP 地址存储 (第 4.2.4 节). 使用来自此前模块中的源目地址计数值及状态信息判
断当前数据包类别, 并将判断为 DDoS 攻击类型的数据包的目的 IP 存入哈希表.
4.2 关键模块工作原理
4.2.1 地址频率统计与状态保存模块
在本文所述机制中, 实现熵值计算和 DDoS 攻击防御需要统计并保存观察窗口中各 IP 地址的出现频次. 针对
这一问题, 采用一种拓展的 Count-Min Sketch 结构实现对观察窗口内 IP 地址频率的估计, 同时完成观察窗口结束
时所需的自动刷新. 与普通的 Count-Min Sketch 结构不同, 本次设计为每一个观察窗口进行编号, Count-Min
Sketch 中将会同时记录该键值的计数与这一计数值对应的观察窗口序号. 在进行更新时, 如果 Count-Min Sketch
内部记录的窗口号与当前窗口一致, 则该位置计数值增加. 若与当前窗口序号不一致, 则说明观察窗口发生了变
化, 此时将会把被选中位置的计数值置为 1 以实现自动的刷新. 为了同时计算源目地址的频率值并保存正常状态
的信息, 交换机中将会同时维护 4 个上述数据结构, 其中每两个 Count-Min Sketch 为一组, 记录同一个观察窗口中
的源 IP 地址和目的 IP 地址的出现频率. 两组数据结构将分别处于更新状态和查询状态并在观察窗口结束时根据
当前网络状态进行轮换, 其中处于更新状态的 Count-Min Sketch 将会记录当前窗口中各 IP 的计数值, 而处于查询
状态的 Count-Min Sketch 则会保持原有计数值不变.
如图 8 所示, 数据包到达后首先会查询一个标志寄存器, 并在该寄存器所指定的 Count-Min Sketch 上进行更
新. 例如, 图中该寄存器的值为 0, 会更新上方两个编号为 0 的 Count-Min Sketch, 而另一组则不更新计数值, 仅进
行查询操作. 此时, 下方编号为 1 的 Count-Min Sketch 中所保留的即为上一观察窗口中的各 IP 地址的计数值.
通过在每个窗口结束翻转标识寄存器的值, 两组数据结构将会轮换地进行更新, 从而实现在完成当前计数的
同时保留上一个窗口中的计数状态. 为了给后续的 DDoS 攻击防御机制提供网络在正常状态下的计数值, 需要保
证用于保存之前窗口计数值的一组 Count-Min Sketch 中的计数状态是在没有发生 DDoS 攻击的情况下得到的. 因
此, 在多组数据结构进行轮换时会检查上一观察窗口中是否发生了 DDoS 攻击, 若上一窗口中发生了 DDoS 攻击,
则标志寄存器不会翻转. 算法 1 演示了两组数据结构在观察窗口结束时的轮换. 首先判断观察窗口是否结束, 并更
新窗口序号 (第 1、2 行), 在安全状态的观察窗口结束后标志寄存器翻转 (第 3、4 行), 两组 Sketch 将会轮换工作.
当 DDoS 攻击发生时, 标识寄存器不会进行翻转 (第 5、6 行), 仍然会使用与上一个窗口中相同的 Sketch 进行计
数, 此时另一组 Sketch 中的安全状态计数值将会得到保留. 最终这一模块将会为接下来的计算提供当前数据包的
源目 IP 在本观察窗口中的计数值以及在正常状态下的计数值.

