3. IP协议详解:从IPv4到IPv6,再到子网划分

IP协议是整个互联网的基石。说白了,没有IP,数据包就不知道往哪儿送。今天咱们就把它彻底讲透。

3.1 IPv4报文结构:每一比特都有意义

先看IPv4报文头。标准长度是20字节,但可以带选项。我当年刚学的时候,总觉得这些字段是死记硬背的。后来做抓包分析,才发现每个字段都有它的脾气。

字段 长度(bit) 说明
版本 4 IPv4固定为4
首部长度 4 以4字节为单位,最小5,最大15
服务类型 8 现在主要用于DSCP
总长度 16 整个IP包长度,最大65535字节
标识 16 分片时用于重组
标志 3 DF(不分片)、MF(更多分片)
片偏移 13 以8字节为单位
生存时间 8 每经过一个路由器减1
协议 8 上层协议类型,如TCP=6,UDP=17
首部校验和 16 只校验头部
源IP地址 32 发送方IP
目的IP地址 32 接收方IP
我的习惯:抓包时先看“总长度”和“首部长度”。如果总长度小于首部长度,那包肯定有问题。我曾经在排查一个丢包问题时,发现就是某个设备把首部长度字段写错了。

3.2 IP分片与重组:MTU的博弈

以太网的MTU是1500字节。如果IP包超过这个值,就得分片。分片发生在源端或中间路由器,重组只在目的端进行。

分片的核心字段有三个:标识、标志、片偏移。

  • 标识:同一个原始包的所有分片,标识相同。
  • DF标志:置1表示不分片。如果路径MTU太小,路由器会丢弃并返回ICMP错误。
  • MF标志:置1表示后面还有分片。最后一个分片MF=0。
  • 片偏移:该分片在原始包中的位置,单位是8字节。
我曾经踩过的坑:有一次线上服务间歇性超时,抓包发现客户端发了大包,DF=1,但中间某段链路的MTU只有1400。路由器直接丢弃了包,返回了ICMP“需要分片但DF置位”。结果防火墙把ICMP过滤了,客户端永远不知道要减小包大小。从那以后,我建议所有服务端都开启PMTUD(路径MTU发现),并且确保ICMP不被拦截。

分片重组有个关键点:所有分片必须全部到达才能重组。只要丢了一个分片,整个包就废了。所以TCP会尽量避开分片,通过MSS协商来控制段大小。

3.3 IPv6基础:为什么需要它?

IPv4地址不够用了,这是最直接的原因。IPv6有128位地址,号称能给地球上的每粒沙子分配一个IP。但它的改进远不止地址长度。

特性 IPv4 IPv6
地址长度 32位 128位
地址表示 点分十进制 冒号十六进制
头部长度 可变(20-60字节) 固定40字节
校验和 有 无(依赖上层)
分片 路由器和源端均可 仅源端
广播 有 无(用组播代替)

IPv6头部固定40字节,去掉了校验和、分片相关字段,新增了流标签。你想想看,路由器处理固定长度的头部,效率高多了。

IPv6地址简写规则:
  • 每组前导0可以省略:2001:0db8::1 等价于 2001:db8::1
  • 连续的全0组可以用双冒号代替一次:2001:db8:0:0:0:0:0:1 → 2001:db8::1
  • 双冒号只能出现一次,否则无法确定位数

我个人习惯在抓包时,先看IPv6的下一个头部字段。它相当于IPv4的协议字段,但更灵活。IPv6支持扩展头部链,比如逐跳选项、路由、分片、认证等。

3.4 子网划分与CIDR:让IP分配更高效

子网划分说白了,就是把一个大的网络切成多个小的网络。CIDR(无类域间路由)则是让这个切分更灵活。

先看传统分类编址:

类别 起始位 网络位 主机位 地址范围
A类 0 8位 24位 1.0.0.0 - 126.255.255.255
B类 10 16位 16位 128.0.0.0 - 191.255.255.255
C类 110 24位 8位 192.0.0.0 - 223.255.255.255

但这种方式太浪费了。一个C类只有254个主机,一个B类有65534个。CIDR打破了这种固定边界,用子网掩码来标识网络位和主机位的分界。

比如 192.168.1.0/24,/24 表示前24位是网络位,后8位是主机位。你可以进一步划分子网:

  • /25:两个子网,每个126个主机
  • /26:四个子网,每个62个主机
  • /27:八个子网,每个30个主机
快速计算技巧:子网数 = 2^(新掩码位数 - 原掩码位数)。主机数 = 2^(32 - 掩码位数) - 2。减2是因为网络地址和广播地址不能用。我每次做子网规划,都会先画个二进制表,确保不犯低级错误。

CIDR还有一个好处:路由聚合。比如你有8个连续的C类地址:192.168.0.0/24 到 192.168.7.0/24,可以聚合成 192.168.0.0/21。这样路由表条目从8条变成1条,路由器压力小很多。

IP协议知识体系 IP协议 IPv4报文结构 IP分片与重组 IPv6基础 子网划分与CIDR 版本/首部长度 总长度/校验和 标识/标志/偏移 MTU/PMTUD 128位地址 扩展头部 子网掩码 路由聚合 核心要点 IPv4→IPv6过渡 分片只在源端(IPv6)

最后说一句,子网划分和CIDR是网络工程师的基本功。你想想看,一个公司有300台机器,用/23(512个地址)刚好,用/24(254个地址)不够,用/22(1024个地址)又浪费。CIDR让你能精确匹配需求。

实战建议:做子网规划时,先列出所有子网的需求,然后从大到小分配。比如先分/24的,再分/25的,最后分/30的(点对点链路)。这样能最大化利用地址空间。