CIDR表示法
常见的特殊地址¶
作为数据库运维人员,常常要和防火墙策略打交道,比如限制不同用户的客服端登录地址。
比如pg_hba.conf中存在以下条目
# TYPE DATABASE USER ADDRESS METHOD
host all all 127.0.0.1/32 trust
host all postgres 20.19.128.0/24 md5
很明显上面的防火墙策略是对于本地环回地址(Loopback Address)登录全部免密登录。
而postgres账户的登录地址被限制在了20.19.128.0到20.19.128.255这个IPV4网段中。
环回地址¶
Loopback 直译为环回,即数据从本机发出后立即“绕回”到本机,不经过物理网络设备(如网卡、路由器)
操作系统会为回环地址创建一个虚拟网络接口(如 lo),所有发送到 127.0.0.1 的数据包会被直接交给本机的网络协议栈处理,而不是发送到外部网络。
需要注意的是,环回地址和本地IP地址不是一回事。如 192.168.1.100就是本地IP地址,是物理或虚拟网卡(如以太网、Wi-Fi)分配的真实地址,数据通过物理网络传输。我们常用的localhost和127.0.0.1也不是一回事,localhost是域名,解析后成为 127.0.0.1,或者IPV6表示的::1。两者的功能相同,但是localhost 依赖 DNS 解析,而后者则直接指向本机。
IPv6 的回环地址是 ::1/128,功能与 IPv4 的 127.0.0.1 完全相同。
IPv4 早期设计中,127.0.0.0/8 整个 A 类地址段被保留给回环地址。尽管大部分地址未实际使用,但所有 127.x.x.x 的地址都属于回环地址。
广播地址¶
什么是广播地址¶
广播地址(Broadcast Address) 是网络中用于 向同一子网内所有设备发送数据包 的特殊 IP 地址。当数据包发送到广播地址时,子网内的所有设备都会接收并处理该数据包。广播地址是 IPv4 网络中的核心概念,主要用于 网络协议通信 和 设备发现。
在 IPv4 中,广播地址是子网中最后一个可用的 IP 地址。例如:
-
子网
192.168.1.0/24(子网掩码255.255.255.0)的广播地址是192.168.1.255。 -
子网
10.0.16.0/22(子网掩码255.255.252.0)的广播地址是10.0.19.255。
广播地址是子网中一个 明确预留的特殊地址,所有设备都约定俗成地识别它。
广播地址的功能¶
广播地址是许多网络协议正常运行的关键,比如:
- ARP(地址解析协议):通过广播查询目标设备的 MAC 地址
谁的 IP 是 192.168.1.2?请告诉我你的 MAC 地址
- DHCP(动态主机配置协议):客户端首次接入网络时,通过广播请求
IP地址
我是新设备,请 DHCP 服务器给我分配一个 IP
- 路由协议:某些路由协议(如
OSPF、RIP)使用广播或组播来交换路由信息。
广播地址简化了通讯流程
-
单播(Unicast):数据包发送给单个目标设备(1对1)。
-
组播(Multicast):数据包发送给一组设备(1对多)。
-
广播(Broadcast):数据包发送给子网内所有设备(1对所有)。
广播地址提高了网络管理效率
-
设备发现:管理员可以通过广播快速发现子网内的设备(如网络扫描工具)。
-
故障排查:广播测试(如
ping 广播地址)可验证子网内设备的连通性。
网络地址¶
什么是网络地址¶
网络地址(Network Address) 是用于标识一个子网的唯一地址,它是子网中第一个可用的 IP 地址。网络地址的作用类似于子网的身份证,用于表示一个逻辑上的网络段。所有属于该子网的设备共享相同的网络地址,但拥有唯一的主机地址。
在 IPv4 子网中,网络地址是子网范围内的第一个 IP 地址。例如:
-
子网
192.168.1.0/24(子网掩码255.255.255.0)的网络地址是192.168.1.0。 -
子网
10.0.16.0/22(子网掩码255.255.252.0)的网络地址是10.0.16.0。
网络地址的功能¶
-
标识子网
网络地址是子网的唯一标识符。
-
当路由器收到一个数据包时,会根据目标 IP 的网络地址判断该数据包属于哪个子网,从而决定如何转发。
-
如果没有网络地址,设备无法区分不同子网(例如
192.168.1.0/24和192.168.2.0/24会被视为同一网络)。
-
-
子网划分的基础
在 CIDR(无类别域间路由)中,网络地址和前缀长度(如
/24)共同定义了子网的边界。10.0.16.0/22表示子网从10.0.16.0开始,覆盖到10.0.19.255。所有主机地址必须属于该网络地址定义的范围。
-
协议和设备的依赖
路由表:路由器通过存储网络地址(而非单个主机地址)来简化路由决策。 例如,路由表中可能有一条记录:
10.0.16.0/22 via 192.168.1.1。网络协议:某些协议(如 OSPF、BGP)依赖网络地址交换路由信息。
CIDR¶
什么是CIDR¶
回到本文的主题,CIDR(无类别域间路由,Classless Inter-Domain Routing)是一种用于 IP 地址分配和子网划分 的现代方法。
它取代了传统的基于类(A/B/C类)的地址分配方式,大幅提高了 IP 地址的利用率。
CIDR 表示法的格式¶
CIDR 的表示形式为:IP地址/前缀长度,例如:
-
192.168.1.0/24 -
10.0.16.9/22 -
2001:db8::/32(IPv6)
可以看到,这种表示方法由IP地址和前缀长度两部分构成。
前缀长度(Prefix Length)表示 网络部分的位数(二进制形式中从左到右连续的 1 的数量)。
- 例如:
/24表示前 24 位是网络地址,剩余 8 位是主机地址。
可以理解为2^8=256个地址,但是可分配的地址需要排除全 0 的网络地址和全 1 的广播地址,所以256-2=254
CIDR 的核心作用¶
取代传统的 IP 分类(A/B/C 类)¶
传统分类的局限性 A 类(/8)、B 类(/16)、C 类(/24)地址划分固定,导致大量 IP 浪费。例如:一个公司需要 500 个 IP,但必须分配一个 B 类地址 /16,浪费 65000+ IP
CIDR 的灵活性 允许任意长度的前缀(如 /23、/28),按需分配地址,减少浪费。
支持路由聚合(Route Summarization)¶
将多个连续的子网合并为一个更大的 CIDR 块,简化路由表。例如:将 192.168.0.0/24 到 192.168.3.0/24 合并为 192.168.0.0/22
CIDR 的计算方法¶
-
将 IP 地址转换为二进制
以
10.0.16.9/22为例:IPv4 地址
10.0.16.9→ 二进制:00001010.00000000.00010000.00001001 -
提取网络部分
前缀长度为
22,表示前 22 位是网络地址:00001010.00000000.000100|00.00001001 ↑↑↑↑↑↑↑↑ ↑↑↑↑↑↑↑↑ ↑↑↑↑↑↑ (前 22 位是网络部分) -
计算主机部分
剩余位数 = 32 - 22 = 10 位 → 可分配的主机数量为 \(2^{10} - 2 = 1022\) 个
- 减 2 是因为排除全 0 的网络地址和全 1 的广播地址
-
确定地址范围
网络地址:
10.0.16.0广播地址:
10.0.19.255可用主机范围:
10.0.16.1到10.0.19.254
这么常见的计算,Linux有相关的计算命令ipcalc:
[postgres@zhangtongLab data]$ ipcalc 20.19.128.0/24
Network: 20.19.128.0/24
Netmask: 255.255.255.0 = 24
Broadcast: 20.19.128.255
Address space: Internet
Address class: Class A
HostMin: 20.19.128.1
HostMax: 20.19.128.254
Hosts/Net: 254
[postgres@zhangtongLab data]$ ipcalc fe80::5054:ff:fecd:4401/64
Full Address: fe80:0000:0000:0000:5054:00ff:fecd:4401
Address: fe80::5054:ff:fecd:4401
Full Network: fe80:0000:0000:0000:0000:0000:0000:0000/64
Network: fe80::/64
Netmask: ffff:ffff:ffff:ffff:: = 64
Address space: Link-Scoped Unicast
HostMin: fe80::
HostMax: fe80::ffff:ffff:ffff:ffff
Hosts/Net: 2^(64) = 18446744073709551616
CIDR 与子网掩码的关系¶
子网掩码(Subnet Mask): 用连续的 1 表示网络部分,0 表示主机部分。 例如:/24 → 子网掩码 255.255.255.0。
转换方法:
-
/24→255.255.255.0 -
/22→255.255.252.0 -
/28→255.255.255.240
IPV4子网类型速查¶
| Prefix size | Network mask | Usable hosts per subnet |
| /1 | 128.0.0.0 | 2,147,483,646 |
| /2 | 192.0.0.0 | 1,073,741,822 |
| /3 | 224.0.0.0 | 536,870,910 |
| /4 | 240.0.0.0 | 268,435,454 |
| /5 | 248.0.0.0 | 134,217,726 |
| /6 | 252.0.0.0 | 67,108,862 |
| /7 | 254.0.0.0 | 33,554,430 |
| Class A | ||
| /8 | 255.0.0.0 | 16,777,214 |
| /9 | 255.128.0.0 | 8,388,606 |
| /10 | 255.192.0.0 | 4,194,302 |
| /11 | 255.224.0.0 | 2,097,150 |
| /12 | 255.240.0.0 | 1,048,574 |
| /13 | 255.248.0.0 | 524,286 |
| /14 | 255.252.0.0 | 262,142 |
| /15 | 255.254.0.0 | 131,070 |
| Class B | ||
| /16 | 255.255.0.0 | 65,534 |
| /17 | 255.255.128.0 | 32,766 |
| /18 | 255.255.192.0 | 16,382 |
| /19 | 255.255.224.0 | 8,190 |
| /20 | 255.255.240.0 | 4,094 |
| /21 | 255.255.248.0 | 2,046 |
| /22 | 255.255.252.0 | 1,022 |
| /23 | 255.255.254.0 | 510 |
| Class C | ||
| /24 | 255.255.255.0 | 254 |
| /25 | 255.255.255.128 | 126 |
| /26 | 255.255.255.192 | 62 |
| /27 | 255.255.255.224 | 30 |
| /28 | 255.255.255.240 | 14 |
| /29 | 255.255.255.248 | 6 |
| /30 | 255.255.255.252 | 2 |
| /31 | 255.255.255.254 | 0 |
| /32 | 255.255.255.255 | 0 |