IP协议基础:IP地址分类、子网掩码、CIDR表示法

聊到HTTP,很多人会直接跳到应用层。但我得说,不理解IP层,你看到的HTTP就像空中楼阁。IP协议是整个互联网的基石,它负责把数据包从源主机送到目标主机。今天我们就来拆解IP协议最核心的三个概念:地址分类、子网掩码和CIDR。

IP地址是什么?

IP地址,说白了就是网络设备的门牌号。IPv4地址由32位二进制组成,通常写成点分十进制,比如 192.168.1.1。这32位被分成网络部分和主机部分。网络部分标识你在哪个网段,主机部分标识你在该网段里的具体位置。

核心要点:IP地址 = 网络号 + 主机号。网络号相同的主机,在同一个广播域内可以直接通信。

IP地址分类:A、B、C、D、E

早期设计IP地址时,人们想了个简单的办法:按前几位固定值来划分网络规模。这就是所谓的"分类编址"(Classful Addressing)。

类别 前几位 地址范围 默认子网掩码 网络数 每网络主机数
A类 0 1.0.0.0 – 126.255.255.255 255.0.0.0 126 16,777,214
B类 10 128.0.0.0 – 191.255.255.255 255.255.0.0 16,384 65,534
C类 110 192.0.0.0 – 223.255.255.255 255.255.255.0 2,097,152 254
D类 1110 224.0.0.0 – 239.255.255.255 组播地址 — —
E类 1111 240.0.0.0 – 255.255.255.255 保留/实验 — —

你看,A类网络能容纳1600多万台主机,C类只有254台。这种划分太死板了。我记得早年做校园网规划时,申请到一个B类地址,结果一个网段里就放了200台机器,剩下6万多个地址全浪费了。这就是分类编址最大的问题——地址利用率极低。

注意:127.0.0.0/8是环回地址段,用于本地测试,不属于任何类别。0.0.0.0/8表示"本网络",通常用于默认路由。

子网掩码:划清网络与主机的边界

子网掩码的作用,就是告诉路由器:这32位里,前多少位是网络号,后多少位是主机号。它也是一个32位的二进制数,网络部分全为1,主机部分全为0。

举个例子:255.255.255.0 的二进制是 11111111.11111111.11111111.00000000。前24位是网络号,后8位是主机号。把IP地址和子网掩码做"与"运算,就能得到网络地址。

IP地址:    192.168.1.100  →  11000000.10101000.00000001.01100100
子网掩码:  255.255.255.0  →  11111111.11111111.11111111.00000000
与运算结果:                 11000000.10101000.00000001.00000000
网络地址:  192.168.1.0

我个人习惯用这个口诀:掩码为1的位是网络位,掩码为0的位是主机位。简单粗暴,不容易出错。

避坑指南:我曾经在配置ACL时,把子网掩码写反了,把主机位当成了网络位。结果ACL匹配了半个互联网的流量,差点把核心交换机打挂。从那以后,我每次写掩码都会先在心里默念一遍二进制。

CIDR表示法:打破分类的枷锁

分类编址浪费地址的问题越来越严重。到了1993年,IETF推出了CIDR(无类别域间路由)。CIDR的核心思想是:不再按固定类别划分,而是用前缀长度灵活指定网络位。

CIDR的写法很简单:在IP地址后面加一个斜杠,跟上网络位的位数。比如 192.168.1.0/24,表示前24位是网络号,后8位是主机号。这跟子网掩码 255.255.255.0 是一个意思,但写起来更简洁。

CIDR的好处很明显:

  • 灵活划分:你可以用/25、/26、/27等任意长度,不再受A/B/C类限制
  • 路由聚合:多条路由可以合并成一条,减少路由表条目
  • 节省地址:按需分配,避免浪费

举个例子,一个公司需要500个IP地址。用分类编址,你只能申请一个B类(6万多个地址,浪费99%以上)。用CIDR,你可以申请一个/23(512个地址),刚刚好。

CIDR计算公式:

  • 主机数 = 2^(32 - 前缀长度) - 2
  • 网络地址 = IP地址 & 子网掩码
  • 广播地址 = 网络地址 + 主机数 + 1

减2是因为要去掉网络地址和广播地址。

常见CIDR前缀速查表

前缀长度 子网掩码 可用主机数 适用场景
/30 255.255.255.252 2 点对点链路
/29 255.255.255.248 6 小型网络
/28 255.255.255.240 14 小型网络
/24 255.255.255.0 254 标准C类网段
/23 255.255.254.0 510 中型网络
/22 255.255.252.0 1022 中型网络
/16 255.255.0.0 65534 大型网络

你想想看,如果没有CIDR,互联网的路由表早就爆炸了。我记得2010年左右,全球路由表条目数突破了30万条。要是还用分类编址,这个数字恐怕得翻几倍。

IP地址分类与CIDR的对比

特性 分类编址 CIDR
划分方式 固定前缀(/8、/16、/24) 任意前缀长度
地址利用率 低(大量浪费) 高(按需分配)
路由聚合 不支持 支持
路由表大小 大 小
灵活性 差 强

IP地址分类与CIDR结构图

下面这张图展示了从分类编址到CIDR的演进,以及它们之间的关系。

IP地址分类与CIDR结构图 IP地址分类与CIDR结构图 32位IPv4地址 分类编址(Classful) A类 B类 C类 D类 E类 CIDR(无类别域间路由) 任意前缀长度 路由聚合 CIDR表示法示例 192.168.1.0/24 → 前24位网络号,后8位主机号 10.0.0.0/8 → 前8位网络号,后24位主机号 分类编址缺点 地址浪费严重 路由表膨胀 CIDR优点 按需分配,利用率高 支持路由聚合

实际应用中的注意事项

嗯,这里要注意几个容易踩坑的地方:

  • 全0和全1的主机号不能用:全0代表网络地址,全1代表广播地址。比如 192.168.1.0/24 中,192.168.1.0 是网络地址,192.168.1.255 是广播地址,都不能分配给主机。
  • 私有地址段:RFC 1918规定了三个私有地址段,用于内网通信,不会在互联网上路由。分别是 10.0.0.0/8、172.16.0.0/12、192.168.0.0/16。我建议你在做内网规划时,优先用 10.0.0.0/8,地址空间大,不容易冲突。
  • 子网划分时注意增长:我曾经给一个项目做子网规划,按当时的需求分了/28的网段。结果半年后业务扩张,每个网段都不够用了,只能重新做VLAN规划,折腾了好几个通宵。所以,子网划分时一定要留出20%-30%的余量。

个人经验:我现在做网络规划时,习惯先用CIDR算出最小需要的地址数,然后向上取整到2的幂次,再额外加一个幂次作为缓冲。比如需要300个地址,最小是/23(512个),我会直接给/22(1024个)。多出来的地址,以后扩展时就知道有多香了。

好了,IP地址分类、子网掩码和CIDR就讲到这里。这些概念是理解IP层的基础,也是后续学习路由、NAT、VLAN等技术的基石。你想想看,没有这些基础,HTTP请求怎么找到目标服务器?下一层一层往上走,每一步都离不开IP协议的支持。