IP地址的本质与编址思想
在TCP/IP协议族中,IP地址承担着两个核心职责:标识网络中的主机、指明主机所属的网络。一个32位的IPv4地址在逻辑上被切分为**网络号(Network ID)和主机号(Host ID)**两个部分。这种分层结构是路由系统能够高效转发数据包的根基——路由器只需关注网络号即可完成跨网络的寻址,而无需记忆每一台具体主机的位置。
我做了十几年网络架构,每次给新人讲IP分类,都会从一个根本问题切入:为什么要分类? 答案是历史性的——上世纪80年代,互联网刚起步时,IETF需要一种简单的方式让设备从IP地址本身就能判断出网络号占多少位、主机号占多少位。于是有了基于地址首位特征的"分类编址"(Classful Addressing)方案,这就是A、B、C、D、E五类地址的由来。
分类编址的设计原理
32位地址的二进制表达
IPv4地址的标准书写形式是点分十进制(Dotted Decimal Notation),将32位二进制按每8位一组划分为四个八位组(octet),每组转换为十进制并以点号分隔。
二进制:11000000.10101000.00000001.00000001
十进制:192.168.1.1
每个八位组的取值范围是0~255(即2^8=256个值),整个IPv4地址空间共有2^32 ≈ 42.9亿个地址。
分类的判断依据
分类编址的精妙之处在于:地址的最高几位bit决定了它属于哪一类。路由器和主机收到一个IP地址后,只需检查首字节的二进制前缀,即可立刻知道网络号有多长。
类别首位bit特征首字节十进制范围默认掩码网络号位数主机号位数A类0xxxxxxx1 ~ 126255.0.0.08 位24 位B类10xxxxxx128 ~ 191255.255.0.016 位16 位C类110xxxxx192 ~ 223255.255.255.024 位8 位D类1110xxxx224 ~ 239无(组播)——E类1111xxxx240 ~ 255无(保留)——
A类地址详解
A类地址的结构
A类地址使用第一个八位组作为网络号,剩余三个八位组作为主机号。最高位固定为0,因此网络号的有效位数实际为7位。
结构示意:
0 网络号(7bit) 主机号(24bit)
+-+--------------+------------------------+
|0| NetID | HostID |
+-+--------------+------------------------+
数量与容量计算
可用网络数:2^7 = 128个,但实际可用为 126个(去掉0和127这两个保留网络)
每个网络可容纳主机数:2^24 - 2 = 16,777,214 台(减去网络地址和广播地址)
首字节范围:1 ~ 126
关键保留地址
0.0.0.0/8:表示"本网络",常用于默认路由和DHCP初始请求
127.0.0.0/8:环回地址段,最常用的就是 127.0.0.1,用于本机自测
10.0.0.0/8:RFC 1918规定的私有地址段,企业内网最常用
A类地址的典型场景
A类地址因为单网络主机数量极多,最初被分配给超大规模组织。比如:
3.0.0.0/8 → General Electric
9.0.0.0/8 → IBM
12.0.0.0/8 → AT&T
17.0.0.0/8 → Apple
19.0.0.0/8 → Ford Motor Company
我刚入行的时候特别震撼——一家公司就把1600多万个IP独占了。这也正是后来IPv4地址枯竭的重要原因之一。
B类地址详解
B类地址的结构
B类地址使用前两个八位组作为网络号,后两个八位组作为主机号。最高两位固定为10,因此网络号有效位为14位。
结构示意:
1 0 网络号(14bit) 主机号(16bit)
+-+-+----------------+------------------+
|1|0| NetID | HostID |
+-+-+----------------+------------------+
数量与容量计算
可用网络数:2^14 = 16,384 个
每个网络可容纳主机数:2^16 - 2 = 65,534 台
首字节范围:128 ~ 191
私有地址段
RFC 1918在B类范围中预留了:
172.16.0.0 ~ 172.31.255.255 (即 172.16.0.0/12)
注意这是一个连续的16个B类网络的集合,常用于中型企业内网。Docker默认网桥 docker0 通常使用 172.17.0.0/16 就在这个范围内。
B类地址的典型场景
B类适合中等规模组织,例如大学、跨国公司分部等。每个网络容纳6万多台主机,规模适中,曾经是高校最爱的资源——清华大学就拥有 166.111.0.0/16,北京大学拥有 162.105.0.0/16。
C类地址详解
C类地址的结构
C类地址使用前三个八位组作为网络号,最后一个八位组作为主机号。最高三位固定为110,网络号有效位为21位。
结构示意:
1 1 0 网络号(21bit) 主机号(8bit)
+-+-+-+----------------------+------------+
|1|1|0| NetID | HostID |
+-+-+-+----------------------+------------+
数量与容量计算
可用网络数:2^21 = 2,097,152 个
每个网络可容纳主机数:2^8 - 2 = 254 台
首字节范围:192 ~ 223
私有地址段
192.168.0.0 ~ 192.168.255.255 (即 192.168.0.0/16)
这个地址段几乎所有家用路由器、SOHO环境都在使用。192.168.1.1、192.168.0.1 是大家最熟悉的网关地址。
C类地址的典型场景
C类网络规模小但数量多,适合小型办公网、家庭网络、子分支机构。每个C类网络仅254台主机,正好契合小型LAN的实际需求。
D类与E类地址
D类:组播地址
D类地址不分网络号和主机号,整个32位作为一个组播组标识(Multicast Group ID)。
范围:224.0.0.0 ~ 239.255.255.255
典型用途:路由协议通信、视频会议、IPTV、流媒体推送
常见的D类地址:
224.0.0.1 所有主机组(all-hosts)
224.0.0.2 所有路由器组(all-routers)
224.0.0.5 OSPF 所有路由器
224.0.0.6 OSPF 指定路由器
224.0.0.9 RIPv2
224.0.0.18 VRRP
239.0.0.0/8 管理边界范围(私有组播,类似私网IP)
E类:保留地址
E类地址(240.0.0.0 ~ 255.255.255.255)被IETF标记为"保留供未来使用",至今未正式分配,普通主机收到目的地为E类的报文一般会丢弃。其中 255.255.255.255 是受限广播地址,仅在本地链路有效,不被路由器转发。
网络地址、广播地址、可用地址
每个网络中有两个地址不能分配给主机:
网络地址(Network Address)
主机号全为0的地址,用于标识这个网络本身。例如 192.168.1.0/24 中的 192.168.1.0 就是网络地址,路由表里写的也是这个。
广播地址(Broadcast Address)
主机号全为1的地址,发送到此地址的数据包会被该网络内所有主机接收。例如 192.168.1.0/24 的广播地址是 192.168.1.255。
主机地址数量公式
可用主机数 = 2^主机位数 - 2
举几个具体例子:
A类网络 10.0.0.0/8 可用主机 = 2^24 - 2 = 16,777,214
B类网络 172.16.0.0/16 可用主机 = 2^16 - 2 = 65,534
C类网络 192.168.1.0/24 可用主机 = 2^8 - 2 = 254
子网掩码与网络号的提取
子网掩码的作用
子网掩码(Subnet Mask)是一个与IP地址等长的32位数字,1的部分标识网络位,0的部分标识主机位。通过IP地址与掩码进行按位与(AND)运算,即可提取出网络号。
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
默认掩码(Classful Mask)
A类:255.0.0.0 /8
B类:255.255.0.0 /16
C类:255.255.255.0 /24
CIDR斜杠表示法
/n 表示掩码前n位为1。这种表示法源自CIDR(无类别域间路由),简洁高效:
192.168.1.0/24 等价于 255.255.255.0
10.0.0.0/8 等价于 255.0.0.0
172.16.0.0/12 等价于 255.240.0.0
私有地址与公有地址
三段私有地址(RFC 1918)
类别地址段CIDR表示容量A类10.0.0.0 ~ 10.255.255.25510.0.0.0/81个A类网络B类172.16.0.0 ~ 172.31.255.255172.16.0.0/1216个B类网络C类192.168.0.0 ~ 192.168.255.255192.168.0.0/16256个C类网络
私有地址的核心特征是不可在公网上路由,必须经过NAT转换才能访问互联网。这是缓解IPv4枯竭的关键技术之一。
特殊用途地址
0.0.0.0/8 本网络(仅作为源地址)
127.0.0.0/8 环回地址
169.254.0.0/16 链路本地地址(APIPA,DHCP失败时自动分配)
100.64.0.0/10 运营商级NAT(CGN)
192.0.2.0/24 文档示例地址(TEST-NET-1)
198.51.100.0/24 文档示例地址(TEST-NET-2)
203.0.113.0/24 文档示例地址(TEST-NET-3)
分类编址的局限与CIDR的兴起
分类编址虽然简单直观,但存在严重的资源利用问题:
地址浪费问题
假设一个组织需要500台主机:
申请一个C类网络(254台):不够用
申请一个B类网络(65534台):严重浪费——剩下65000多个地址闲置
这就是经典的"C类太小、B类太大"困境。整个90年代,B类地址被以飞快的速度耗尽。
路由表膨胀
随着C类地址被大量分配,全球路由表迅速膨胀,给骨干路由器带来巨大压力。
CIDR的解决方案
1993年,RFC 1518/1519引入无类别域间路由(CIDR),彻底打破了A/B/C类的边界:
用 /n 形式自由指定网络位长度
支持变长子网掩码(VLSM),按需切分
通过路由聚合(Supernetting) 将多个连续网络合并为一条路由通告
举例:把4个连续的C类网络聚合:
192.168.0.0/24
192.168.1.0/24 → 聚合为 192.168.0.0/22
192.168.2.0/24
192.168.3.0/24
聚合后路由表中只需一条记录,大幅减少了表项数量。
实战:识别IP地址的类别
Python代码示例
def classify_ip(ip: str) -> str:
"""Identify the class of an IPv4 address based on the first octet."""
first_octet = int(ip.split('.')[0])
if 1 <= first_octet <= 126:
return f"{ip} -> Class A (default mask /8)"
elif first_octet == 127:
return f"{ip} -> Loopback (reserved)"
elif 128 <= first_octet <= 191:
return f"{ip} -> Class B (default mask /16)"
elif 192 <= first_octet <= 223:
return f"{ip} -> Class C (default mask /24)"
elif 224 <= first_octet <= 239:
return f"{ip} -> Class D (multicast)"
elif 240 <= first_octet <= 255:
return f"{ip} -> Class E (reserved)"
else:
return f"{ip} -> Invalid"
# Test cases
test_ips = [
"10.0.0.1",
"172.16.5.4",
"192.168.1.100",
"8.8.8.8",
"224.0.0.1",
"127.0.0.1",
]
for ip in test_ips:
print(classify_ip(ip))
输出:
10.0.0.1 -> Class A (default mask /8)
172.16.5.4 -> Class B (default mask /16)
192.168.1.100 -> Class C (default mask /24)
8.8.8.8 -> Class A (default mask /8)
224.0.0.1 -> Class D (multicast)
127.0.0.1 -> Loopback (reserved)
Linux命令行验证
# View interface IP address and mask
ip addr show eth0
# Calculate network and broadcast addresses
ipcalc 192.168.1.100/24
# Output example:
# Address: 192.168.1.100
# Netmask: 255.255.255.0 = 24
# Network: 192.168.1.0/24
# Broadcast: 192.168.1.255
# HostMin: 192.168.1.1
# HostMax: 192.168.1.254
# Hosts/Net: 254
子网划分实例
以C类网络 192.168.10.0/24 为例,划分成4个等长子网:
原网络:192.168.10.0/24,掩码 255.255.255.0
借2位作为子网位 → 新掩码 /26(255.255.255.192)
子网1:192.168.10.0/26 范围 .0 - .63 (可用 .1 - .62)
子网2:192.168.10.64/26 范围 .64 - .127 (可用 .65 - .126)
子网3:192.168.10.128/26 范围 .128 - .191 (可用 .129 - .190)
子网4:192.168.10.192/26 范围 .192 - .255 (可用 .193 - .254)
每个子网可容纳62台主机(2^6 - 2 = 62)。