为什么 IP 子网计算是开发者的必修课
每个开发者或多或少都会遇到 IP 子网问题:
- 给服务器配置内网 IP,如何判断是否在同一子网
- 写 Nginx / 防火墙规则,如何用 CIDR 表示允许的网段
- K8s Calico / Cilium 网络策略,如何用 CIDR 限定 pod 通信范围
- AWS / 阿里云 VPC 子网划分,如何切分 16 位掩码段
- 数据库存储 IP 时,应该用
INET类型还是字符串 - Docker 默认
172.17.0.0/16,容器 IP 如何分配
这些场景的底层都是同一套概念:CIDR 表示法 + 子网掩码 + 网络地址。理解了它们,你就能在 30 秒内回答「192.168.1.100/22 与 192.168.2.200/22 是否在同一子网」这类问题。
配套工具:IP 子网计算器
一、IPv4 与 IPv6 地址基础
IPv4:32 位点分十进制
IPv4 地址是 32 位无符号整数,习惯写作 4 个 0-255 的八位组,用点号分隔:
192.168.1.100
= 11000000.10101000.00000001.01100100
= 3232235876(十进制)
总共 2^32 ≈ 43 亿个地址,2011 年 IANA 主池已耗尽,因此出现 NAT、CGNAT、IPv6 等过渡方案。
IPv6:128 位十六进制
IPv6 地址是 128 位,写作 8 组 4 位十六进制,用冒号分隔:
2001:0db8:0000:0000:0000:0000:0000:0001
可省略前导零,并用 :: 缩略最长连续零段(仅一次):
2001:db8::1
总共 2^128 ≈ 3.4×10^38 个地址,“给地球每粒沙子分配一个 IP”绰绰有余。IPv6 还支持 IPv4-mapped 后缀:::ffff:192.168.1.1 表示 IPv4 地址嵌入 IPv6。
二、CIDR 表示法详解
CIDR(Classless Inter-Domain Routing)用 /数字 表示网络前缀长度,取代了早期的 A/B/C 类别编址:
192.168.1.0/24
└────┬────┘ └┘
IP 地址 前缀
- 前 24 位是网络位(必须相同才能在同一子网)
- 后 8 位是主机位(可分配给具体设备)
- 该子网共 2^8 = 256 个地址,可用 254 个
常见前缀长度对照:
| 前缀 | 网络位 | 主机位 | 总地址数 | 可用主机数(IPv4) |
|---|---|---|---|---|
| /8 | 8 | 24 | 16,777,216 | 16,777,214 |
| /16 | 16 | 16 | 65,536 | 65,534 |
| /24 | 24 | 8 | 256 | 254 |
| /28 | 28 | 4 | 16 | 14 |
| /30 | 30 | 2 | 4 | 2 |
| /31 | 31 | 1 | 2 | 2(RFC 3021) |
| /32 | 32 | 0 | 1 | 1(单机) |
IPv6 前缀含义相同,但前缀通常更长(家用 /64,运营商 /48 或 /56)。
三、子网掩码与通配符掩码
子网掩码是前缀长度对应的二进制表示:前缀位全 1,主机位全 0。
/24 -> 255.255.255.0
/16 -> 255.255.0.0
/30 -> 255.255.255.252
掩码必须为连续 1 后接连续 0,否则非法(如 255.255.0.255 不合法)。
通配符掩码(反掩码)= 子网掩码按位取反:
/24 掩码 255.255.255.0 -> 通配符 0.0.0.255
/16 掩码 255.255.0.0 -> 通配符 0.0.255.255
通配符掩码中 0 表示”必须匹配”、1 表示”任意”,常用于 Cisco ACL 与 OSPF 配置:
access-list 1 permit 192.168.1.0 0.0.0.255
# 允许 192.168.1.0/24 网段所有流量
四、网络地址与广播地址
给定 IP 与前缀,可计算两个特殊地址:
- 网络地址:主机位全 0(如
192.168.1.0/24中的192.168.1.0),标识子网本身 - 广播地址:主机位全 1(如
192.168.1.255),向子网内所有主机发送
IP: 192.168.1.100
掩码: 255.255.255.0
网络地址 = IP AND 掩码 = 192.168.1.0
广播地址 = IP OR 通配符 = 192.168.1.255
这两个地址不能分配给主机,因此 IPv4 在前缀 ≤ 30 时可用主机数 = 总数 - 2。
IPv6 没有广播地址——RFC 4291 取消了广播,改用多播(ff00::/8)替代。因此 IPv6 的可用主机数 = 总数(不减 2)。
五、私有地址与特殊地址段
RFC 1918 定义了三段 IPv4 私有地址(不在公网路由,需 NAT):
| 段 | 范围 | 默认前缀 | 容量 |
|---|---|---|---|
| A 类私有 | 10.0.0.0 - 10.255.255.255 | /8 | 1677 万 |
| B 类私有 | 172.16.0.0 - 172.31.255.255 | /12 | 104 万 |
| C 类私有 | 192.168.0.0 - 192.168.255.255 | /16 | 65536 |
其他特殊段:
127.0.0.0/8环回(loopback)169.254.0.0/16链路本地(DHCP 失败时自动分配)224.0.0.0/4多播240.0.0.0/4保留(E 类)0.0.0.0/8未指定 / 默认路由
IPv6 特殊段:
::1/128环回fe80::/10链路本地fc00::/7唯一本地(类似私有)ff00::/8多播2001:db8::/32文档示例专用(RFC 3849,禁止公网使用)
六、子网划分(VLSM)实践
VLSM(Variable Length Subnet Masking)允许在同一网络内使用不同前缀长度,更精细地切分地址空间。
规则:子网数量必须是 2 的幂(2/4/8/16…),每次划分使前缀长度增加 log2(N) 位。
示例:将 192.168.1.0/24 划分为 4 个子网:
原前缀 /24,新增 2 位(log2(4) = 2),新前缀 /26
子网 1: 192.168.1.0/26 范围 .0 - .63 可用 .1 - .62
子网 2: 192.168.1.64/26 范围 .64 - .127 可用 .65 - .126
子网 3: 192.168.1.128/26 范围 .128 - .191 可用 .129 - .190
子网 4: 192.168.1.192/26 范围 .192 - .255 可用 .193 - .254
每个子网 64 个地址,可用 62 个。常见划分场景:
- 不同业务隔离(生产 / 测试 / 灰度)
- 不同部门独立子网
- AWS VPC 多可用区子网
- K8s 多节点 IP 池
七、IPv4 vs IPv6 关键差异
| 维度 | IPv4 | IPv6 |
|---|---|---|
| 地址长度 | 32 位 | 128 位 |
| 表示 | 点分十进制 | 冒号十六进制(可 :: 缩略) |
| 网络位 | CIDR /0-/32 | CIDR /0-/128 |
| 广播地址 | 有(主机位全 1) | 无(改用多播) |
| 私有段 | RFC 1918 三段 | fc00::/7 唯一本地 |
| 环回 | 127.0.0.0/8 | ::1/128 |
| 链路本地 | 169.254.0.0/16 | fe80::/10 |
| DHCP | 必须 | SLAAC 自动配置 |
| NAT | 普遍 | 理论上不需要 |
| 默认网段 | /24 | /64 |
生产建议:云上 VPC 双栈部署,对外服务监听 IPv6,内部网络保留 IPv4 以兼容老系统。
八、/31 与 /30 的边界处理
/30 子网
192.168.1.0/30:
网络地址: 192.168.1.0
可用主机: 192.168.1.1, 192.168.1.2
广播地址: 192.168.1.3
共 4 个地址,可用 2 个。传统点对点链路标准。
/31 子网(RFC 3021)
192.168.1.0/31:
主机 1: 192.168.1.0
主机 2: 192.168.1.1
无网络地址,无广播地址
仅 2 个地址,全部可用。RFC 3021 专为点对点链路设计,节省一半地址空间。现代路由器普遍支持。
/32 子网
单机地址,可用 1 个。常见于 loopback 接口、防火墙规则、负载均衡虚拟 IP。
九、工具矩阵联动
IP 子网计算不是孤立的,与多个工具配合使用能覆盖更多场景:
- IP 子网计算器 × URL 编解码:解析 URL 中的 host 后用 IP 工具判断网段。例如 Nginx
allow 192.168.0.0/16配合 URL 工具理解请求路径 - IP 子网计算器 × YAML/JSON 互转:K8s NetworkPolicy、Calico IPPool、Terraform 资源配置都是 YAML/JSON 格式,其中包含大量 CIDR 字段
- IP 子网计算器 × 正则表达式:用正则校验 IPv4 / IPv6 字符串格式。IPv4 正则
^(\d{1,3}\.){3}\d{1,3}$(粗校)或^(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}$(精校) - IP 子网计算器 × CRON 解析器:定时任务常需访问特定网段,IP 配置 + cron 表达式共同定义”何时访问哪个网段”
- IP 子网计算器 × 时间戳转换:日志分析时,IP 与时间戳是两个最常见维度
- IP 子网计算器 × Hash 计算:配置文件版本管理,IP 段变更后用哈希校验差异
十、扩展阅读
- RFC 1918:私有 IPv4 地址段定义
- RFC 3021:/31 子网用于点对点链路
- RFC 4291:IPv6 地址架构
- RFC 3849:IPv6 文档示例地址段
- RFC 4632:CIDR 无类别域间路由
- Cisco: 通配符掩码与 ACL 配置指南
- AWS VPC 子网划分最佳实践
理解 IP 子网不需要背公式,多用 IP 子网计算器 实操几次,CIDR / 网络地址 / 广播地址 / 通配符掩码就会形成直觉。配合 URL 工具 理解请求结构、YAML/JSON 工具 配置 K8s 网络、正则工具 校验 IP 格式,你的网络配置能力会显著提升。