IP协议详解:IPv4报文结构、IP分片与重组、子网划分与CIDR、IPv6基础与过渡技术

IP协议是整个互联网的基石。说白了,它就是让数据包能从A点跑到B点的规则。我做了这么多年网络协议,见过太多因为IP层配置不当导致的诡异故障。今天咱们就把这块硬骨头啃下来。

IPv4报文结构:每个字节都有它的脾气

IPv4报文头,固定20字节,选项部分最多40字节。我刚开始学的时候总觉得记这些字段没用,直到有一次排查一个MTU问题,才发现版本号和首部长度这两个字段能帮我快速定位问题。

字段 长度(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, ICMP=1
首部校验和 16 只校验首部
源IP地址 32 发送方IP
目的IP地址 32 接收方IP

我的小技巧:抓包时看到TTL=1,基本可以断定这个包要么是 traceroute 的探测包,要么是遇到了环路。我曾经靠这个特征半小时定位了一个跨机房的路由黑洞。

IP分片与重组:别让大包卡住脖子

为什么需要分片?因为链路层有MTU限制。以太网MTU是1500字节,你发个3000字节的包,路由器就得帮你切一刀。

分片的核心逻辑其实不复杂:

  • 标识符相同 → 属于同一个原始报文
  • MF=1 → 后面还有分片
  • MF=0 + 片偏移≠0 → 最后一个分片
  • 片偏移 × 8 = 该分片在原始报文中的起始位置

我曾经踩过的坑:有一次线上服务间歇性超时,查了三天才发现是防火墙对分片报文处理有问题。DF标志位被某些中间设备悄悄改了,导致大包被分片后无法重组。从那以后,我建议所有关键业务都主动控制报文大小,别超过1400字节。

分片重组只在目的主机进行。中间路由器只负责分片,不负责重组。你想想看,如果每个路由器都重组再分片,那性能得差成什么样?

子网划分与CIDR:告别IP地址浪费

早期的IP地址分类(A/B/C类)太浪费了。一个C类254个地址不够用,一个B类65534个地址又太多。CIDR的出现解决了这个问题。

CIDR的核心思想:网络前缀 + 主机号。用/后面的数字表示网络前缀的长度。

举个例子:192.168.1.0/24,表示前24位是网络号,后8位是主机号。

子网划分实战:假设你拿到一个192.168.1.0/24的网段,需要划分成4个子网,每个子网至少50个可用地址。

2^6=64,所以主机位需要6位。网络位变成24+2=26位。子网掩码从255.255.255.0变成255.255.255.192。

四个子网分别是:192.168.1.0/26、192.168.1.64/26、192.168.1.128/26、192.168.1.192/26。

我个人的习惯是,做子网规划时永远留20%的余量。别算得太死,业务一扩张你就得重新规划,那才叫痛苦。

IPv6基础:128位地址空间到底有多大?

IPv6的地址长度是128位,是IPv4的2^96倍。这么说吧,地球上每一粒沙子都能分到几十亿个IPv6地址。

IPv6报文头固定40字节,比IPv4简单多了:

  • 去掉了校验和(上层协议自己校验)
  • 去掉了分片相关字段(分片由源主机处理)
  • 增加了流标签(用于QoS)

IPv6地址的写法:2001:0db8:85a3:0000:0000:8a2e:0370:7334

简化规则:

  • 每组前导0可以省略 → 2001:db8:85a3:0:0:8a2e:370:7334
  • 连续全0组可以用::代替一次 → 2001:db8:85a3::8a2e:370:7334

注意:::只能出现一次。2001::85a3::8a2e:370:7334 这种写法是错的,因为无法确定::代表多少组0。

IPv6过渡技术:双栈、隧道、翻译

IPv6不可能一夜之间替换IPv4,过渡技术就派上用场了。我参与过几个大型网络的IPv6改造,总结下来就三种主流方案:

技术 原理 适用场景
双栈 设备同时运行IPv4和IPv6协议栈 最推荐,逐步迁移
隧道 将IPv6报文封装在IPv4报文中传输 IPv6孤岛互联
翻译 在网关处做IPv4↔IPv6地址和协议转换 纯IPv6节点访问IPv4资源

我个人最推荐双栈方案。虽然成本高一点,但最稳定,出问题也好排查。隧道技术我遇到过几次封装解封装导致的性能瓶颈,翻译技术则经常碰到应用层协议不兼容的问题。

IP协议知识体系 IP协议 IPv4报文结构 分片与重组 子网划分与CIDR IPv6与过渡 版本/首部长度 TTL/协议号 标识符/标志位 片偏移 网络前缀 子网掩码 双栈/隧道 核心要点 • IPv4报文头固定20字节,分片由标识符+标志位+片偏移控制 • CIDR用/前缀长度替代传统分类,子网划分要留余量 • IPv6地址128位,过渡推荐双栈方案

嗯,IP协议这块内容确实不少。但只要你把报文结构、分片逻辑、子网划分和IPv6过渡这四块吃透了,日常工作中90%的IP层问题你都能搞定。剩下的10%,靠经验和抓包工具慢慢磨就行。