常见的特殊地址
作为数据库运维人员,常常要和防火墙策略打交道,比如限制不同用户的客服端登录地址。
比如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