3、IP协议详解:IPv4报文结构,IP地址分类与子网划分,CIDR表示法
聊到网络协议栈,IP协议绝对是绕不开的核心。我经常跟团队里的新人说,TCP/IP协议栈里,IP层就是整个网络的「快递底盘」。你上层应用数据再怎么封装,最终都得交给IP层去寻址和投递。今天咱们就把它掰开揉碎了讲清楚。
3.1 IPv4报文结构:一个数据包的长相
先看IPv4报文长什么样。说白了,它就是一组固定格式的二进制位,前面是头部,后面是数据。我当年在抓包分析一个丢包问题时,就是盯着这个头部结构一行一行看的。
IPv4头部固定部分(20字节)
- 版本(4bit):IPv4就是4,IPv6就是6。没啥好说的。
- 首部长度(4bit):单位是4字节。最小值5(20字节),最大值15(60字节)。
- 服务类型(8bit):以前叫TOS,现在被DSCP和ECN占了。做QoS时会用到。
- 总长度(16bit):整个IP包的长度,包括头部和数据。最大65535字节。
- 标识(16bit)+ 标志(3bit)+ 片偏移(13bit):这三个字段是给分片用的。我踩过坑,后面细说。
- 生存时间(8bit):TTL。每经过一个路由器减1,减到0就丢弃。 traceroute就是靠这个原理。
- 协议(8bit):上层协议类型。6是TCP,17是UDP,1是ICMP。
- 首部校验和(16bit):只校验头部,不校验数据。每个路由器都要重新计算。
- 源IP地址(32bit) + 目的IP地址(32bit):核心中的核心。
个人经验:我曾经排查过一个视频卡顿问题,抓包发现IP头部总长度字段异常,数据包被截断了。后来发现是网卡驱动对巨型帧(Jumbo Frame)支持有问题。所以,别小看这些头部字段,关键时刻能救命。
3.2 IP地址分类:老古董但必须懂
IP地址是32位的,通常写成点分十进制。早期设计时,人们把IP地址分成了A、B、C、D、E五类。你想想看,那时候网络规模小,这么分确实直观。但现在看来,这设计挺浪费地址空间的。
| 类别 | 前导位 | 网络号位数 | 主机号位数 | 地址范围 | 默认子网掩码 |
|---|---|---|---|---|---|
| A类 | 0 | 8位 | 24位 | 1.0.0.0 - 126.255.255.255 | 255.0.0.0 |
| B类 | 10 | 16位 | 16位 | 128.0.0.0 - 191.255.255.255 | 255.255.0.0 |
| C类 | 110 | 24位 | 8位 | 192.0.0.0 - 223.255.255.255 | 255.255.255.0 |
| D类(组播) | 1110 | — | — | 224.0.0.0 - 239.255.255.255 | — |
| E类(保留) | 1111 | — | — | 240.0.0.0 - 255.255.255.255 | — |
避坑指南:我曾经在配置ACL时,把B类地址范围记错了,导致公司内部一个网段被错误拦截。记住,B类是从128开始的,不是从128.0开始的。细节决定成败。
3.3 子网划分:把大网络切成小段
分类地址太浪费了。一个C类只有254个主机,一个B类却有65534个。你想想看,一个公司要300个IP,给个B类太浪费,给个C类又不够。怎么办?子网划分就是干这个的。
子网划分的核心思想:从主机号里借几位出来当子网号。借的位数越多,子网越多,但每个子网里的主机数越少。
举个例子,一个C类网络 192.168.1.0/24,我想把它分成4个子网:
- 借2位主机号当子网号(2^2 = 4个子网)
- 子网掩码变成
255.255.255.192(/26) - 每个子网有 2^(8-2) - 2 = 62个可用主机
子网划分后,网络号、子网号、主机号的关系就变成了:
原C类: 网络号(24位) | 主机号(8位)
划分后:网络号(24位) | 子网号(2位) | 主机号(6位)
我的习惯:做子网规划时,我一般先画个二进制表格。把IP地址写成二进制,借位一目了然。别嫌麻烦,这比心算靠谱多了。
3.4 CIDR表示法:现代网络的标配
分类地址和子网划分虽然能用,但太死板了。1993年,CIDR(无类别域间路由)出现了。它彻底抛弃了A/B/C类的概念,直接用「IP地址/前缀长度」来表示一个网络。
比如 192.168.1.0/24,意思就是前24位是网络号,后8位是主机号。再比如 10.0.0.0/8,前8位是网络号,后24位是主机号。
CIDR的好处很明显:
- 灵活:你可以用任意长度的前缀,不局限于8、16、24。
- 节省地址:比如你需要500个IP,给个/23(512个地址)刚刚好,不用浪费。
- 路由聚合:可以把多个小网络聚合成一个大网络,减少路由表条目。
举个例子,路由聚合:
192.168.0.0/24
192.168.1.0/24
192.168.2.0/24
192.168.3.0/24
→ 聚合为 192.168.0.0/22
你看,4条路由变成1条,路由器的压力小多了。
CIDR表示法速查表
| 前缀长度 | 子网掩码 | 可用主机数 | 典型用途 |
|---|---|---|---|
| /30 | 255.255.255.252 | 2 | 点对点链路 |
| /29 | 255.255.255.248 | 6 | 小型网络 |
| /24 | 255.255.255.0 | 254 | 标准C类大小 |
| /16 | 255.255.0.0 | 65534 | 中型企业 |
| /8 | 255.0.0.0 | 16777214 | 大型组织 |
3.5 知识体系总览
下面这张图把IPv4的核心知识点串起来了。从报文结构到地址分类,再到子网划分和CIDR,它们是一脉相承的。
3.6 实战:子网划分计算
光说不练假把式。咱们来算一个实际场景。
需求:公司有5个部门,分别需要30、50、20、10、100个IP地址。给你一个 192.168.0.0/24 的网段,怎么分?
我的做法是这样的:
- 按需求从大到小排序:100、50、30、20、10。
- 计算每个子网需要的主机位数:
- 100个主机 → 需要7位主机号(2^7 - 2 = 126)→ /25
- 50个主机 → 需要6位主机号(2^6 - 2 = 62)→ /26
- 30个主机 → 需要5位主机号(2^5 - 2 = 30)→ /27
- 20个主机 → 需要5位主机号(2^5 - 2 = 30)→ /27
- 10个主机 → 需要4位主机号(2^4 - 2 = 14)→ /28
- 分配地址块:
- 子网1(/25):192.168.0.0/25,范围 192.168.0.1 - 192.168.0.126
- 子网2(/26):192.168.0.128/26,范围 192.168.0.129 - 192.168.0.190
- 子网3(/27):192.168.0.192/27,范围 192.168.0.193 - 192.168.0.222
- 子网4(/27):192.168.0.224/27,范围 192.168.0.225 - 192.168.0.254
- 子网5(/28):192.168.1.0/28,范围 192.168.1.1 - 192.168.1.14
我曾经犯过的错:有一次我忘了减2(网络地址和广播地址),结果分配出去的IP地址不够用,导致一个子网里有两台设备冲突。记住,可用主机数 = 2^n - 2,n是主机位数。
嗯,到这里IPv4的核心内容就差不多了。报文结构让你知道数据包长什么样,地址分类和子网划分让你知道怎么分地址,CIDR让你更灵活地管理地址空间。这些东西,你在配置路由器、写防火墙规则、排查网络问题时,天天都会用到。