Page 418 - 《软件学报》2025年第8期
P. 418
武文浩 等: 可编程数据平面 DDoS 检测与防御机制 3841
当前窗口 源地址 Sketch 0
Sketch 更新
Hash 1
源地址计数
最小值
Hash 2
当前观察窗口
目的地址 Sketch 0 计数结果
Hash 1 目的地址计数
最小值
Hash 2
标识寄存器
flag=0
源地址 Sketch 1
Hash 1
源地址计数
最小值
Hash 2
上一观察窗口
目的地址 Sketch 1
计数结果
Hash 1
目的地址计数
最小值
Hash 2
上一窗口
Sketch 查询
图 8 Sketch 轮换工作与副本保存原理
算法 1. 标识寄存器更新.
输入: 数据包 p;
输出: 标识寄存器值 flag.
1. if p.resubmit_ flag = 1 // 数据包的重发标识 resubmit_ flag 为 1, 上一观察窗口结束
2. Wid = Wid +1; // 观察窗口序号 Wid 更新
3. if p.r.ddos_ flag = 1 // 上一窗口中未发生 DDoS 攻击, 重发包头 r 中的标识位为 0
4. flag = ~ flag; // 标识寄存器翻转
5. else
6. flag = flag; // 标识寄存器保持不变
7. end
8. end
4.2.2 熵值计算模块
熵值计算模块使用前文中多组 Sketch 得到的当前观察窗口源目地址计数值计算当前的源目地址熵. 由于可
编程交换机的限制, 数据平面中的单次处理仅能使用当前数据包的头部信息, 且数据平面中无法直接支持循环操
作及浮点数运算. 为了解决以上问题, 本模块中采用了一种逐数据包累加的方式进行熵值更新, 并将实际的熵值扩
大一定的倍数后近似为整数, 同时, 将复杂计算操作的计算结果预先配置在查找转发表中, 使用查找转发的计算方
法进行对数等计算.
(1) 逐数据包累加的计算方法
原有的熵值计算方法中需要同时计算所有类别 IP 地址的计数信息, 由于可编程数据面中仅能处理当前数据
包的头部信息, 难以同时获取所有 IP 的计数值, 因此本文实现了一种逐数据包累加的计算方法, 每次计算时仅需
要使用单个数据包的头部信息, 如图 9 所示.
在这一计算方法的具体实现中, IP 地址熵值计算的公式可以改写为如公式 (6) 所示的形式.

