Page 420 - 《软件学报》2025年第8期
P. 420
武文浩 等: 可编程数据平面 DDoS 检测与防御机制 3843
a 个观察窗口中的熵差均高于阈值, 观察窗口被认定为
所示的具有两个状态的有限状态机, 在安全状态时, 若连续
受到 DDoS 攻击, 系统跳转至 DDoS 攻击状态; 当该机制目前认为网络正发生 DDoS 攻击时, 仅当连续 a 个观察窗
口中的熵差均低于阈值时, 观察窗口认定 DDoS 攻击结束, 回到正常状态.
DDoS 攻击判定模块中通过维护两个计数器实现所需的状态转换方法, 这一流程如算法 2 所示. 在一个观
察窗口结束时, 首先根据会上一模块中的源目地址熵计算结果判断熵差是否超过固定阈值. 若超过阈值则将正
常状态窗口计数器归零, 并将 DDoS 攻击状态窗口计数器加 1; 若未超过固定阈值则会进行相反操作 (第
1–7 行). 在该模块结束时将检查两个计数器中的值, 若 DDoS 攻击状态窗口计数值超过设定的参数 a, 则认为这
一窗口受到了 DDoS 攻击 (第 8、9 行); 若正常状态窗口计数值超过 a, 则认为该窗口中没有受到 DDoS 攻击
(第 10、11 行). 若二者均在 a 以下, 则保持状态寄存器中的值不变, 认为这一窗口与上一个窗口的状态相同 (第
12–14 行).
算法 2. DDoS 攻击状态判定.
输入: 当前观察窗口源地址熵 S src , 目的地址熵 S dst ;
输出: DDoS 攻击判定结果 ddos_ flag.
1. if S src −S dst > T S // 源目地址熵值差超过固定阈值 T S
2. C safe = 0; // 正常状态窗口计数器 C safe 置 0
3. C ddos = C ddos + 1; // DDoS 状态窗口计数器 C ddos 加 1
4. else // 源目地址熵值差未超过阈值
5. C ddos = 0; // 正常状态窗口计数器 C ddos 置 0
C safe = C safe + 1; // DDoS C safe 加 1
6. 状态窗口计数器
7. end // 标识寄存器保持不变
8. if C ddos > a // 正常状态窗口计数器超过 a, 连续 a 个窗口熵值差超过阈值
9. ddos_ flag = 1; // 这一窗口被判定为 DDoS 攻击状态
10. else if C safe > a // 连续 a 个窗口熵值差低于阈值
11. ddos_ flag = 0; // 这一窗口被判定为正常状态
12. else // 两个计数器均小于 a
13. ddos_ flag = ddos_ flag; // 当前窗口状态与上一窗口状态相同
14. end
4.2.4 数据包类别判定模块及受攻击 IP 地址存储模块
数据包在入口流水线中经过 DDoS 攻击检测流程后, 在桥接包头中携带检测结果与源目 IP 地址的计数值进
入出口流水线. 出口流水线中将利用桥接包头中所携带的计算结果判断该数据包的目的 IP 是否受到了 DDoS 攻
击. 各模块的工作流程如后文图 11 所示, 首先将会读取当前窗口中的 DDoS 攻击状态, 若 DDoS 攻击发生, 则根据
公式 (5) 的原理判断源目 IP 地址之差的变化是否超过阈值 T D . 当超过固定阈值时, 认为该数据包指向的 IP 地址
受到 DDoS 攻击. 此时会计算这一 IP 的哈希值并将其存储在哈希表中的对应位置. 以上流程结束后, 交换机会检
查该 IP 在哈希表中的对应位置是否有值, 若发现对应位置非零, 则会将该数据包丢弃.
4.3 基于 Tofino 架构的 DDoS 攻击检测与防御流程
4.3.1 基于 Tofino 架构的机制部署
基于 Tofino 架构实现所述的攻击检测与防御机制的总体设计与流程如图 12 所示, 主要包含控制平面和基于
Tofino 架构的可编程数据平面. 其中, 控制平面负责可编程交换的表项配置和状态查询, 在交换机启动后, 控制平
面程序将通过插入表项的方式完成可编程交换机所需的配置, 之后将会循环查询当前网络的状态以及出口模块中

