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