高频业务:一种IP网段判断重叠的算法(其三)

💡 原文中文,约2900字,阅读约需7分钟。
📝

内容提要

提出一种IP重叠判断算法:将IP段映射到数轴,用扫描线算法处理CIDR嵌套继承,使小段自动继承大段业务标签。IP段用(start,end,length)三元组表示,采用u128结构避免溢出。通过维度聚合,将(ip,维度,值)排序后线性扫描,以O(N)复杂度完成标签继承与去重,可应用于攻击源IP匹配等场景,百万级/24段60秒内完成。

🔎

延伸解读

从重叠判断到业务标签碰撞

文章将IP重叠判断算法拓展到业务维度碰撞。核心思路是:任何针对IP属性标签的碰撞需求,本质上都是计算重叠。例如,筛选与僵尸网络A源IP相同的IP,或筛选曾出现在美国且属于攻击组织B常用肉鸡的IP。通过给IP加上维度标签,算法能自动继承和聚合标签,从而支持复杂的业务筛选场景。

u128结构避免大整数开销

针对IPv6的128位地址,文章采用自定义的u128结构(hi和lo各64位)表示整数,避免使用big.Int和动态内存分配,降低GC压力并提高比较速度。IP段统一用(start, end, length)三元组表示,单IP的start等于end且length为1,CIDR段则对应连续区间。属性标签存储在字典中,可任意定义。

扫描线算法实现CIDR嵌套继承

扫描线算法通过将每个CIDR拆分为进入和离开事件,按位置排序(同位置start优先于end,同类型大CIDR优先),维护active集合。当扫描到start事件时,若active非空,则当前段被active中的段包含,从而继承其维度标签。该算法以O(N)复杂度解决嵌套继承,支持任意维度扩展,且子段继承父段几乎无开销。

性能与适用场景

文章声称该算法速度极快,在100万个/24段的情况下,能在60秒内完成整个扫描与结果输出。其优势在于线性复杂度、灵活的业务维度扩展以及高效的继承操作。适用于攻击源IP匹配、僵尸网络筛选等需要基于IP属性进行碰撞的高频业务场景。

❓

Q&A

IP网段重叠判断算法除了判断重叠,还能获取哪些额外信息?

当得出重叠的段时,可以获取到重叠的IP所在的数轴区域,以及重叠的IP究竟被什么IP所覆盖(碰撞)。

如何用数据结构表示IPv6地址以避免溢出?

使用type u128 struct { hi uint64 lo uint64 }表示128位整数,其中hi表示高64位,lo表示低64位。这样可以避免使用big.Int、避免动态内存分配、降低GC压力、提高比较速度。

IP段在数轴上映射后有什么性质?

小段始终被大段包裹,并且小段和小段之间不会重叠。

扫描线算法如何解决CIDR嵌套继承问题?

扫描线算法通过将每个CIDR拆为进入和离开事件,按位置排序(同一位置start优先于end,同类型事件更大的CIDR优先),维护active集合。当扫描到start事件时,如果active集合不为空,则当前段被active集合中的段包含,将active的维度复制到当前段,完成维度聚合。

该算法处理百万级/24段需要多长时间?

即使在100万个/24段的情况下,仍然能在60秒内完成整个扫描与结果输出。

该算法可以应用于哪些业务场景?

可以应用于筛选存在与僵尸网络A的源IP相同的源IP,筛选曾经出现在美国且处于攻击组织B的常用肉鸡的源IP等场景。

🏷️

标签

➡️

继续阅读