0

0

高效判断端口范围集合是否相交:三种算法对比与推荐实现

心靈之曲

心靈之曲

发布时间:2026-01-31 14:57:10

|

412人浏览过

|

来源于php中文网

原创

高效判断端口范围集合是否相交:三种算法对比与推荐实现

本文对比分析了三种判断防火墙访问控制列表(acl)端口范围与目标端口范围是否存在交集的算法,重点评估其时间/空间复杂度与工程适用性,最终推荐基于有序区间二分查找的方案,并提供可直接使用的 java 实现。

网络安全运维与自动化策略分析中,常需快速判定一组目标端口(如 {"5672", "15672-15674"})是否与防火墙 ACL 中定义的服务端口范围(如 {"20-22", "443", "8080-8088", "10000-65535"})存在交集。由于端口范围可能覆盖 1–65535 的整数空间,暴力展开为单点集合(Approach 1)虽编码简单,但内存与时间开销不可接受(最坏 O(65535) 级别)。因此,必须采用基于区间表示与高效区间重叠检测的算法。

✅ 推荐方案:有序区间 + 二分查找(Approach 2)

该方案将 ACL 端口统一归一化为 [start, end] 区间(如 "443" → [443, 443],"20-22" → [20, 22]),构建按 start 排序的不可变区间列表;对每个待查目标区间 [tStart, tEnd],通过二分查找定位所有可能重叠的候选 ACL 区间(即满足 acl[i].end >= tStart && acl[i].start

其核心优势在于:

Multiavatar
Multiavatar

Multiavatar是一个免费开源的多元文化头像生成器,可以生成高达120亿个虚拟头像

下载
  • 时间复杂度优:预处理 ACL 区间排序仅需 O(n log n);每次查询 m 个目标区间仅需 O(m log n);
  • 空间极省:仅存储 n 个区间(通常 n ≪ 65535),内存占用恒定;
  • 工程友好:逻辑清晰、易于测试、支持复用(ACL 列表构建一次,多次查询)。

以下是完整 Java 实现(含解析、标准化与交集检测):

import java.util.*;

public class PortRangeIntersector {
    // 内部区间类(不可变)
    public static final class Range implements Comparable {
        final int start, end;
        Range(int s, int e) {
            this.start = Math.min(s, e);
            this.end = Math.max(s, e);
        }
        @Override
        public int compareTo(Range o) { return Integer.compare(this.start, o.start); }
        // 检查 [this.start, this.end] 与 [otherStart, otherEnd] 是否有交集
        boolean intersects(int otherStart, int otherEnd) {
            return this.start <= otherEnd && otherStart <= this.end;
        }
    }

    // 解析字符串端口(支持 "80" 或 "1000-2000")
    public static Range parsePort(String portStr) {
        if (portStr == null || portStr.trim().isEmpty())
            throw new IllegalArgumentException("Invalid port string: " + portStr);
        String[] parts = portStr.trim().split("-", 2);
        int start = Integer.parseInt(parts[0]);
        int end = parts.length == 2 ? Integer.parseInt(parts[1]) : start;
        return new Range(start, end);
    }

    // 构建已排序的 ACL 区间列表(建议缓存复用)
    public static List buildSortedAclRanges(String[] aclPorts) {
        List ranges = new ArrayList<>();
        for (String p : aclPorts) {
            ranges.add(parsePort(p));
        }
        ranges.sort(Comparator.naturalOrder());
        return Collections.unmodifiableList(ranges);
    }

    // 判断目标端口集合(字符串数组)是否与 ACL 存在任意交集
    public static boolean hasIntersection(List sortedAcl, String[] targetPorts) {
        for (String t : targetPorts) {
            Range target = parsePort(t);
            // 二分查找:首个 start <= target.end 的区间(右边界约束)
            int lo = 0, hi = sortedAcl.size();
            while (lo < hi) {
                int mid = lo + (hi - lo) / 2;
                if (sortedAcl.get(mid).start <= target.end) lo = mid + 1;
                else hi = mid;
            }
            // 检查 [0, lo) 范围内所有可能重叠的区间(因 start ≤ target.end 是必要条件)
            for (int i = 0; i < lo && i < sortedAcl.size(); i++) {
                if (sortedAcl.get(i).intersects(target.start, target.end)) {
                    return true;
                }
            }
        }
        return false;
    }

    // 使用示例
    public static void main(String[] args) {
        String[] acl = {"20-22", "443", "8080-8088", "10000-65535"};
        String[] targets1 = {"5672", "15672-15674"}; // 无交集 → false
        String[] targets2 = {"21", "443-444"};       // 有交集 → true

        List aclRanges = buildSortedAclRanges(acl);
        System.out.println(hasIntersection(aclRanges, targets1)); // false
        System.out.println(hasIntersection(aclRanges, targets2)); // true
    }
}

⚠️ 注意事项与优化建议

  • 输入校验:生产环境需增强 parsePort 对非法格式(如负数、非数字、end
  • 性能再优化:若 ACL 规则极多(n > 10⁴)且查询高频,可改用 TreeSet 替代 ArrayList,利用 headSet() / tailSet() 快速截取候选区间;
  • 扩展性:本方案天然支持 IPv4/IPv6 地址段、时间窗口等任意一维连续区间交集检测,只需替换 Range 的类型与比较逻辑;
  • 避免误区:不要试图用位运算(如 bitmap)压缩端口——65536 位虽仅 8KB,但动态范围合并、区间查询仍需遍历,且丧失语义清晰性。

综上,Approach 2 是平衡开发效率、运行性能与长期可维护性的最优解。它摒弃了“以空间换时间”的粗暴思路,转而利用区间数学性质与经典搜索算法,在真实防火墙策略分析场景中兼具鲁棒性与可扩展性。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
页面置换算法
页面置换算法

页面置换算法是操作系统中用来决定在内存中哪些页面应该被换出以便为新的页面提供空间的算法。本专题为大家提供页面置换算法的相关文章,大家可以免费体验。

416

2023.08.14

Java 网络安全
Java 网络安全

本专题聚焦 Java 在网络安全与加密通信中的应用,系统讲解常见加密算法(MD5、SHA、AES、RSA)、数字签名、HTTPS证书配置、令牌认证(JWT、OAuth2)及常见安全漏洞防护(XSS、SQL注入、CSRF)。通过实战项目(如安全登录系统、加密文件传输工具),帮助学习者掌握 Java 安全开发与加密技术的实战能力。

721

2025.10.13

PHP 安全与防护
PHP 安全与防护

本专题聚焦于PHP开发中的安全问题与防御措施,详细讲解SQL注入、XSS攻击、CSRF攻击、文件包含漏洞等常见安全风险及其修复方法。通过结合实际案例,帮助开发者理解漏洞成因,掌握输入验证、会话安全、加密存储与安全编码规范,全面提升PHP网站的安全防护水平。

122

2025.11.04

PHP 命令行脚本与自动化任务开发
PHP 命令行脚本与自动化任务开发

本专题系统讲解 PHP 在命令行环境(CLI)下的开发与应用,内容涵盖 PHP CLI 基础、参数解析、文件与目录操作、日志输出、异常处理,以及与 Linux 定时任务(Cron)的结合使用。通过实战示例,帮助开发者掌握使用 PHP 构建 自动化脚本、批处理工具与后台任务程序 的能力。

42

2025.12.13

2026赚钱平台入口大全
2026赚钱平台入口大全

2026年最新赚钱平台入口汇总,涵盖任务众包、内容创作、电商运营、技能变现等多类正规渠道,助你轻松开启副业增收之路。阅读专题下面的文章了解更多详细内容。

32

2026.01.31

高干文在线阅读网站大全
高干文在线阅读网站大全

汇集热门1v1高干文免费阅读资源,涵盖都市言情、京味大院、军旅高干等经典题材,情节紧凑、人物鲜明。阅读专题下面的文章了解更多详细内容。

23

2026.01.31

无需付费的漫画app大全
无需付费的漫画app大全

想找真正免费又无套路的漫画App?本合集精选多款永久免费、资源丰富、无广告干扰的优质漫画应用,涵盖国漫、日漫、韩漫及经典老番,满足各类阅读需求。阅读专题下面的文章了解更多详细内容。

28

2026.01.31

漫画免费在线观看地址大全
漫画免费在线观看地址大全

想找免费又资源丰富的漫画网站?本合集精选2025-2026年热门平台,涵盖国漫、日漫、韩漫等多类型作品,支持高清流畅阅读与离线缓存。阅读专题下面的文章了解更多详细内容。

6

2026.01.31

漫画防走失登陆入口大全
漫画防走失登陆入口大全

2026最新漫画防走失登录入口合集,汇总多个稳定可用网址,助你畅享高清无广告漫画阅读体验。阅读专题下面的文章了解更多详细内容。

9

2026.01.31

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Kotlin 教程
Kotlin 教程

共23课时 | 3.1万人学习

C# 教程
C# 教程

共94课时 | 8.1万人学习

Java 教程
Java 教程

共578课时 | 54.1万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号