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,它们是一脉相承的。

IPv4知识体系结构图 IPv4 核心知识体系 IPv4 协议 IPv4 报文结构 版本 / 首部长度 / 服务类型 总长度 / 标识 / 标志 / 片偏移 TTL / 协议 / 首部校验和 源IP地址 / 目的IP地址 IP地址分类 A类:0.0.0.0 - 126.255.255.255 B类:128.0.0.0 - 191.255.255.255 C类:192.0.0.0 - 223.255.255.255 D类(组播)/ E类(保留) 子网划分 & CIDR 从主机号借位 → 子网号 子网掩码:255.255.255.192 CIDR:IP/前缀长度 路由聚合:多条→一条 核心:寻址 + 分片 + 路由

3.6 实战:子网划分计算

光说不练假把式。咱们来算一个实际场景。

需求:公司有5个部门,分别需要30、50、20、10、100个IP地址。给你一个 192.168.0.0/24 的网段,怎么分?

我的做法是这样的:

  1. 按需求从大到小排序:100、50、30、20、10。
  2. 计算每个子网需要的主机位数:
    • 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
  3. 分配地址块:
    • 子网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让你更灵活地管理地址空间。这些东西,你在配置路由器、写防火墙规则、排查网络问题时,天天都会用到。