这篇文章不打算讲太深的网络原理那得写一本书而是聚焦在 IP 地址和子网的日常转换、计算、分析——包括你怎么在命令行、脚本、在线工具之间快速切换以及那些我踩过的坑。本文工具由 VidDown 提供——一个完全免费、无需登录、纯前端处理的在线工具集。除了 IP/子网分析还提供视频解析下载、JSON 格式化、PDF 合并、Cron 表达式生成等 20 实用功能。所有计算在浏览器本地完成不上传任何数据。 主站https://www.viddown.cn 本文专属工具IP 地址转换与子网分析工具一、你到底需要会什么点分十进制 IP ↔ 整数十进制/十六进制互转 CIDR 表示法比如192.168.1.0/24的含义 给定 IP 和掩码或者前缀长度算出网络地址、广播地址、第一个/最后一个可用地址 子网划分把一个大的 /16 拆成若干个 /24 或者 /28 IPv6 的简单缩展转换如果你只是偶尔配一下路由器手算也行。但如果你要写脚本、做自动化、分析网络日志那必须掌握几种转换和计算的方法。二、IP 地址与整数互转最常被忽略但巨有用为什么要把 IP 转成整数两个场景1、在数据库里存 IP 时用 INT UNSIGNED 比字符串快得多。2、判断两个 IP 是否在同一网段时直接用位运算。2.1 手动换算了解一下就行192.168.1.119224168161813232235521这个公式谁都会但手算容易错。强烈建议用工具。2.2 用 Python 三行解决最稳importipaddress# IP → 整数int(ipaddress.IPv4Address(192.168.1.1))# 3232235521# 整数 → IPstr(ipaddress.IPv4Address(3232235521))# 192.168.1.1# IPv6 一样int(ipaddress.IPv6Address(2001:db8::1))# 425407664112825928569039849516538265612.3 Linux 命令行没有 Python 环境时用 printf 和算术运算但很麻烦。我一般直接装一个 ipcalc后面会讲。2.4 一个小坑符号问题整数 IP 范围是 0 到 2^32-1在 C 语言或某些环境里如果用了 int有符号192.168.1.1 会变成负数-1062731519。记得用无符号类型或 Python 自动处理。三、子网计算从 CIDR 到详细信息给定 10.20.30.40/26你能几秒钟说出子网掩码是什么 网络地址 广播地址 可用 IP 范围如果还得拿笔算那下面这些工具和命令你得收藏。3.1 超实用的 ipcalc 命令大多数 Linux 发行版都可以装sudoaptinstallipcalc# Ubuntu/Debian# 或者用 net-tools 里的但 ipcalc 是专用的使用示例ipcalc192.168.1.100/24输出Address:192.168.1.10011000000.10101000.00000001.01100100 Netmask:255.255.255.02411111111.11111111.11111111.00000000 Wildcard:0.0.0.255 00000000.00000000.00000000.11111111Network:192.168.1.0/2411000000.10101000.00000001.00000000 HostMin:192.168.1.111000000.10101000.00000001.00000001 HostMax:192.168.1.25411000000.10101000.00000001.11111110 Broadcast:192.168.1.25511000000.10101000.00000001.11111111 Hosts/Net:254Class C, Private Internet注意那个 Wildcard 是通配符掩码反掩码给 OSPF 用的一般我们用不到。也可以直接用掩码ipcalc10.1.2.3255.255.240.0输出一样的。坑老版本 ipcalc 对前缀大于 30 时的 HostMin/HostMax 会有误我没遇到过但要注意区分点分十进制掩码和 CIDR。3.2 没有 ipcalc用 sipcalc 或者在线sipcalc 更细致支持 IPv6sudoaptinstallsipcalc sipcalc192.168.1.100/24输出更长带网络区间、可用范围、反向掩码等。我比较喜欢 sipcalc因为它能直接给出网络范围的两个边界。3.3 Python ipaddress 模块脚本化首选如果你要批量处理几百个网段命令行一个个敲不现实。用 Pythonimportipaddress netipaddress.IPv4Network(192.168.1.100/24,strictFalse)# strictFalse 表示即使传入的是主机IP/前缀也会自动取网络地址print(网络地址:, net.network_address)# 192.168.1.0print(广播地址:, net.broadcast_address)# 192.168.1.255print(掩码:, net.netmask)# 255.255.255.0print(前缀长度:, net.prefixlen)# 24print(可用主机数:, net.num_addresses -2)# 254# 迭代所有主机IP不包括网络地址和广播forhostinnet.hosts(): print(host)# 小心如果/24就是254次循环注意ipaddress 模块在 Python 3.3 内置不需要安装。但是 IPv6 的 hosts() 会返回巨量结果小心内存。3.4 我踩过的坑严格模式与主机位一开始我写 ipaddress.IPv4Network(‘192.168.1.100/24’) 会报错ValueError:192.168.1.100/24 hashostbitsset因为 192.168.1.100 的二进制最后几位 01100100 不是全 0严格模式下不允许。解决方法1、加 strictFalse2、或者手动把 IP 改成 192.168.1.0/24两种都行但 strictFalse 更省事。四、子网划分实践把一个 /16 切成 4 个 /18需求总公司有 172.16.0.0/1665536 个地址要分成 4 个一样大的子网每个支持大约 16000 个主机。4.1 手算思路2位用于子网因为2^24所以新前缀16218。 每个子网的地址块大小2^(32-18)16384个地址。 四个子网分别是172.16.0.0/18172.16.64.0/18172.16.128.0/18172.16.192.0/184.2 用 ipcalc 验证子网边界查第二个子网的广播地址ipcalc172.16.64.0/18输出 Network: 172.16.64.0/18, Host range: 172.16.64.1 - 172.16.127.254, Broadcast: 172.16.127.255。没毛病。4.3 用 Python 自动划分子网importipaddress supernetipaddress.IPv4Network(172.16.0.0/16)subnetslist(supernet.subnets(new_prefix18))forsubinsubnets: print(sub)输出172.16.0.0/18172.16.64.0/18172.16.128.0/18172.16.192.0/18如果你想切成非等大小或者按主机数量分配那就得自己写逻辑了。但这个 subnets() 方法对统一划分非常方便。五、IPv6 的地址转换与子网IPv6 已经是公司网络的标配了虽然很多还在混用。最常用的两个操作5.1 展开/压缩 IPv62001:db8::1 是2001:0db8:0000:0000:0000:0000:0000:0001 的压缩形式。importipaddressipipaddress.IPv6Address(2001:db8::1)print(ip.exploded)# 2001:0db8:0000:0000:0000:0000:0000:0001print(ip.compressed)# 2001:db8::15.2 IPv6 子网计算IPv6 一般不用子网掩码直接用前缀长度通常 /64 是常见的最小分配单元。net6ipaddress.IPv6Network(2001:db8::/48)# 分成 /64 子网subnetslist(net6.subnets(new_prefix64))print(len(subnets))# 65536 个 /64注意千万别尝试 list(net6.hosts())一个 /64 有 2^64 个地址会死机。六、常用技巧汇总6.1 判断两个 IP 是否在同一网段importipaddress ip1ipaddress.IPv4Address(192.168.1.10)ip2ipaddress.IPv4Address(192.168.1.200)netipaddress.IPv4Network(192.168.1.0/24)print(ip1innet and ip2innet)# True命令行 (ipcalc) 可以分别看 Network 地址是否相同。6.2 从 IP 和掩码获取网络地址纯 shell如果你在一个极其受限的环境比如嵌入式系统没 Python 没 ipcalc可以用 bc 做位运算但那酸爽……建议还是编译一个 ipcalc 的静态版本传进去。6.3 批量转换 IP 列表我有个日志文件里面存了访问来源 IP需要转成整数去数据库里查。一行 Python 搞定catips.txt|python3-cimport sys, ipaddress; [print(int(ipaddress.IPv4Address(line.strip()))) for line in sys.stdin]七、我踩过的坑总结误以为 /24 的广播地址是 .255 对/24 是 .255。但 /25 的广播地址可能是 .127 或 .255取决于子网起点。要用工具算别凭记忆。 掩码写成255.255.255.255 时什么意思 那就是单个主机路由。我第一次看到时一脸懵逼。 IPv6 里 :: 只能出现一次2001::db8::1 是非法的。Python 的 ipaddress 会报错但有些手写配置可能直接传进路由器导致奇怪行为。 子网划分时忘了保留网络地址和广播地址 尤其是给点对点链路分配 /31RFC3021时可以用2个地址没有网络和广播但很多老设备不支持。我之前分配 /30 浪费了一半地址。八、写在最后IP 计算这件事学会手算原理是为了面试和排错但日常工作千万不要跟纸笔过不去。记住三件套ipcalc / sipcalc —— 快速查单个子网 Python ipaddress —— 脚本批量处理 在线工具比如 https://www.viddown.cn/tools/ip/ip_converter/ 你也可以像我一样在 ~/.bashrc 里加个函数functionipinfo(){curl-shttps://ipinfo.io/$1# 需要联网查公网 IP 归属地}但那是另一个话题了。好了下次再有同事拿着计算器算广播地址你就把这篇文章甩给他。
IP 地址转换与子网分析:手算不如工具,命令行不如在线(附 VidDown 工具集介绍)
这篇文章不打算讲太深的网络原理那得写一本书而是聚焦在 IP 地址和子网的日常转换、计算、分析——包括你怎么在命令行、脚本、在线工具之间快速切换以及那些我踩过的坑。本文工具由 VidDown 提供——一个完全免费、无需登录、纯前端处理的在线工具集。除了 IP/子网分析还提供视频解析下载、JSON 格式化、PDF 合并、Cron 表达式生成等 20 实用功能。所有计算在浏览器本地完成不上传任何数据。 主站https://www.viddown.cn 本文专属工具IP 地址转换与子网分析工具一、你到底需要会什么点分十进制 IP ↔ 整数十进制/十六进制互转 CIDR 表示法比如192.168.1.0/24的含义 给定 IP 和掩码或者前缀长度算出网络地址、广播地址、第一个/最后一个可用地址 子网划分把一个大的 /16 拆成若干个 /24 或者 /28 IPv6 的简单缩展转换如果你只是偶尔配一下路由器手算也行。但如果你要写脚本、做自动化、分析网络日志那必须掌握几种转换和计算的方法。二、IP 地址与整数互转最常被忽略但巨有用为什么要把 IP 转成整数两个场景1、在数据库里存 IP 时用 INT UNSIGNED 比字符串快得多。2、判断两个 IP 是否在同一网段时直接用位运算。2.1 手动换算了解一下就行192.168.1.119224168161813232235521这个公式谁都会但手算容易错。强烈建议用工具。2.2 用 Python 三行解决最稳importipaddress# IP → 整数int(ipaddress.IPv4Address(192.168.1.1))# 3232235521# 整数 → IPstr(ipaddress.IPv4Address(3232235521))# 192.168.1.1# IPv6 一样int(ipaddress.IPv6Address(2001:db8::1))# 425407664112825928569039849516538265612.3 Linux 命令行没有 Python 环境时用 printf 和算术运算但很麻烦。我一般直接装一个 ipcalc后面会讲。2.4 一个小坑符号问题整数 IP 范围是 0 到 2^32-1在 C 语言或某些环境里如果用了 int有符号192.168.1.1 会变成负数-1062731519。记得用无符号类型或 Python 自动处理。三、子网计算从 CIDR 到详细信息给定 10.20.30.40/26你能几秒钟说出子网掩码是什么 网络地址 广播地址 可用 IP 范围如果还得拿笔算那下面这些工具和命令你得收藏。3.1 超实用的 ipcalc 命令大多数 Linux 发行版都可以装sudoaptinstallipcalc# Ubuntu/Debian# 或者用 net-tools 里的但 ipcalc 是专用的使用示例ipcalc192.168.1.100/24输出Address:192.168.1.10011000000.10101000.00000001.01100100 Netmask:255.255.255.02411111111.11111111.11111111.00000000 Wildcard:0.0.0.255 00000000.00000000.00000000.11111111Network:192.168.1.0/2411000000.10101000.00000001.00000000 HostMin:192.168.1.111000000.10101000.00000001.00000001 HostMax:192.168.1.25411000000.10101000.00000001.11111110 Broadcast:192.168.1.25511000000.10101000.00000001.11111111 Hosts/Net:254Class C, Private Internet注意那个 Wildcard 是通配符掩码反掩码给 OSPF 用的一般我们用不到。也可以直接用掩码ipcalc10.1.2.3255.255.240.0输出一样的。坑老版本 ipcalc 对前缀大于 30 时的 HostMin/HostMax 会有误我没遇到过但要注意区分点分十进制掩码和 CIDR。3.2 没有 ipcalc用 sipcalc 或者在线sipcalc 更细致支持 IPv6sudoaptinstallsipcalc sipcalc192.168.1.100/24输出更长带网络区间、可用范围、反向掩码等。我比较喜欢 sipcalc因为它能直接给出网络范围的两个边界。3.3 Python ipaddress 模块脚本化首选如果你要批量处理几百个网段命令行一个个敲不现实。用 Pythonimportipaddress netipaddress.IPv4Network(192.168.1.100/24,strictFalse)# strictFalse 表示即使传入的是主机IP/前缀也会自动取网络地址print(网络地址:, net.network_address)# 192.168.1.0print(广播地址:, net.broadcast_address)# 192.168.1.255print(掩码:, net.netmask)# 255.255.255.0print(前缀长度:, net.prefixlen)# 24print(可用主机数:, net.num_addresses -2)# 254# 迭代所有主机IP不包括网络地址和广播forhostinnet.hosts(): print(host)# 小心如果/24就是254次循环注意ipaddress 模块在 Python 3.3 内置不需要安装。但是 IPv6 的 hosts() 会返回巨量结果小心内存。3.4 我踩过的坑严格模式与主机位一开始我写 ipaddress.IPv4Network(‘192.168.1.100/24’) 会报错ValueError:192.168.1.100/24 hashostbitsset因为 192.168.1.100 的二进制最后几位 01100100 不是全 0严格模式下不允许。解决方法1、加 strictFalse2、或者手动把 IP 改成 192.168.1.0/24两种都行但 strictFalse 更省事。四、子网划分实践把一个 /16 切成 4 个 /18需求总公司有 172.16.0.0/1665536 个地址要分成 4 个一样大的子网每个支持大约 16000 个主机。4.1 手算思路2位用于子网因为2^24所以新前缀16218。 每个子网的地址块大小2^(32-18)16384个地址。 四个子网分别是172.16.0.0/18172.16.64.0/18172.16.128.0/18172.16.192.0/184.2 用 ipcalc 验证子网边界查第二个子网的广播地址ipcalc172.16.64.0/18输出 Network: 172.16.64.0/18, Host range: 172.16.64.1 - 172.16.127.254, Broadcast: 172.16.127.255。没毛病。4.3 用 Python 自动划分子网importipaddress supernetipaddress.IPv4Network(172.16.0.0/16)subnetslist(supernet.subnets(new_prefix18))forsubinsubnets: print(sub)输出172.16.0.0/18172.16.64.0/18172.16.128.0/18172.16.192.0/18如果你想切成非等大小或者按主机数量分配那就得自己写逻辑了。但这个 subnets() 方法对统一划分非常方便。五、IPv6 的地址转换与子网IPv6 已经是公司网络的标配了虽然很多还在混用。最常用的两个操作5.1 展开/压缩 IPv62001:db8::1 是2001:0db8:0000:0000:0000:0000:0000:0001 的压缩形式。importipaddressipipaddress.IPv6Address(2001:db8::1)print(ip.exploded)# 2001:0db8:0000:0000:0000:0000:0000:0001print(ip.compressed)# 2001:db8::15.2 IPv6 子网计算IPv6 一般不用子网掩码直接用前缀长度通常 /64 是常见的最小分配单元。net6ipaddress.IPv6Network(2001:db8::/48)# 分成 /64 子网subnetslist(net6.subnets(new_prefix64))print(len(subnets))# 65536 个 /64注意千万别尝试 list(net6.hosts())一个 /64 有 2^64 个地址会死机。六、常用技巧汇总6.1 判断两个 IP 是否在同一网段importipaddress ip1ipaddress.IPv4Address(192.168.1.10)ip2ipaddress.IPv4Address(192.168.1.200)netipaddress.IPv4Network(192.168.1.0/24)print(ip1innet and ip2innet)# True命令行 (ipcalc) 可以分别看 Network 地址是否相同。6.2 从 IP 和掩码获取网络地址纯 shell如果你在一个极其受限的环境比如嵌入式系统没 Python 没 ipcalc可以用 bc 做位运算但那酸爽……建议还是编译一个 ipcalc 的静态版本传进去。6.3 批量转换 IP 列表我有个日志文件里面存了访问来源 IP需要转成整数去数据库里查。一行 Python 搞定catips.txt|python3-cimport sys, ipaddress; [print(int(ipaddress.IPv4Address(line.strip()))) for line in sys.stdin]七、我踩过的坑总结误以为 /24 的广播地址是 .255 对/24 是 .255。但 /25 的广播地址可能是 .127 或 .255取决于子网起点。要用工具算别凭记忆。 掩码写成255.255.255.255 时什么意思 那就是单个主机路由。我第一次看到时一脸懵逼。 IPv6 里 :: 只能出现一次2001::db8::1 是非法的。Python 的 ipaddress 会报错但有些手写配置可能直接传进路由器导致奇怪行为。 子网划分时忘了保留网络地址和广播地址 尤其是给点对点链路分配 /31RFC3021时可以用2个地址没有网络和广播但很多老设备不支持。我之前分配 /30 浪费了一半地址。八、写在最后IP 计算这件事学会手算原理是为了面试和排错但日常工作千万不要跟纸笔过不去。记住三件套ipcalc / sipcalc —— 快速查单个子网 Python ipaddress —— 脚本批量处理 在线工具比如 https://www.viddown.cn/tools/ip/ip_converter/ 你也可以像我一样在 ~/.bashrc 里加个函数functionipinfo(){curl-shttps://ipinfo.io/$1# 需要联网查公网 IP 归属地}但那是另一个话题了。好了下次再有同事拿着计算器算广播地址你就把这篇文章甩给他。