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字节。
分片重组有个关键点:所有分片必须全部到达才能重组。只要丢了一个分片,整个包就废了。所以TCP会尽量避开分片,通过MSS协商来控制段大小。
3.3 IPv6基础:为什么需要它?
IPv4地址不够用了,这是最直接的原因。IPv6有128位地址,号称能给地球上的每粒沙子分配一个IP。但它的改进远不止地址长度。
| 特性 | IPv4 | IPv6 |
|---|---|---|
| 地址长度 | 32位 | 128位 |
| 地址表示 | 点分十进制 | 冒号十六进制 |
| 头部长度 | 可变(20-60字节) | 固定40字节 |
| 校验和 | 有 | 无(依赖上层) |
| 分片 | 路由器和源端均可 | 仅源端 |
| 广播 | 有 | 无(用组播代替) |
IPv6头部固定40字节,去掉了校验和、分片相关字段,新增了流标签。你想想看,路由器处理固定长度的头部,效率高多了。
- 每组前导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个主机
CIDR还有一个好处:路由聚合。比如你有8个连续的C类地址:192.168.0.0/24 到 192.168.7.0/24,可以聚合成 192.168.0.0/21。这样路由表条目从8条变成1条,路由器压力小很多。
最后说一句,子网划分和CIDR是网络工程师的基本功。你想想看,一个公司有300台机器,用/23(512个地址)刚好,用/24(254个地址)不够,用/22(1024个地址)又浪费。CIDR让你能精确匹配需求。