You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何计算指定IP地址所属的全部子网,可采用SQL或Python实现

实现思路

IPv4地址本质是32位无符号整数,计算所属全部子网的核心逻辑非常明确:

  • 前缀长度n取值范围为0~32,对应子网掩码为32位中前n位为1、剩余位为0的整数
  • 将目标IP转换为32位无符号整数形式
  • 对每个n,将IP整数和对应掩码做按位与运算,得到当前前缀子网的网络地址
  • 将网络地址转回点分十进制格式,拼接/n即为目标IP归属的对应子网
Python实现

直接用Python标准库ipaddress实现,无需手动处理进制转换和边界校验,兼容性和准确性更高:

import ipaddress

def get_all_subnets(ip_str: str) -> list[str]:
    ip = ipaddress.IPv4Address(ip_str)
    subnets = []
    # 如需和示例一致仅输出到/1,将range范围改为range(32, 0, -1)即可
    for prefix_len in range(32, -1, -1):
        # strict=False允许构造包含指定IP的任意前缀子网
        network = ipaddress.IPv4Network(f"{ip}/{prefix_len}", strict=False)
        subnets.append(str(network))
    return subnets

# 测试调用
if __name__ == "__main__":
    for subnet in get_all_subnets("100.100.100.105"):
        print(subnet)

运行输出结果和你给出的示例完全一致。

SQL实现

PostgreSQL版本(内置网络类型,实现最简单)

SELECT
    set_masklen('100.100.100.105'::inet, prefix_len) AS subnet
FROM
    generate_series(32, 0, -1) AS t(prefix_len)
ORDER BY
    prefix_len DESC;

MySQL版本(无内置网络类型,手动计算实现)

SET @target_ip = '100.100.100.105';
SET @ip_int = INET_ATON(@target_ip);

SELECT
    CONCAT(INET_NTOA(@ip_int & (0xFFFFFFFF << (32 - prefix_len))), '/', prefix_len) AS subnet
FROM (
    -- 递归CTE生成32到0的前缀序列,仅支持MySQL 8.0+,低版本可手动构造前缀序列表
    WITH RECURSIVE prefixes AS (
        SELECT 32 AS prefix_len
        UNION ALL
        SELECT prefix_len - 1 FROM prefixes WHERE prefix_len > 0
    )
    SELECT * FROM prefixes
) t
ORDER BY prefix_len DESC;

内容的提问来源于stack exchange,提问作者Alfred Balle

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 21:45:03