3、网络层核心协议:IP协议头部结构、IPv4与IPv6、子网划分与路由原理
网络层是整个协议栈的「交通枢纽」。数据链路层只负责同一段链路内的通信,而网络层要解决的是:数据包如何从地球上的A点到达B点,中间可能跨越几十个路由器、不同的物理网络。
说白了,IP协议就是互联网的「地址系统」加「路由规则」。我做了这么多年网络抓包和协议分析,可以负责任地告诉你——搞懂IP头部结构,你就能读懂网络层的一切行为。
3.1 IP协议头部结构——每一比特都有意义
IPv4头部固定部分20字节,选项部分最多40字节。我建议你把这20字节背下来,不是死记硬背,而是理解每个字段的设计意图。
| 偏移(字节) | 字段 | 长度(bit) | 说明 |
|---|---|---|---|
| 0 | Version / IHL | 4 + 4 | 版本号(IPv4=4) + 头部长度(单位4字节) |
| 1 | DSCP / ECN | 6 + 2 | 差分服务代码点 + 显式拥塞通知 |
| 2-3 | Total Length | 16 | 整个IP包长度(含头部+数据),单位字节 |
| 4-5 | Identification | 16 | 标识符,用于分片重组 |
| 6-7 | Flags / Fragment Offset | 3 + 13 | 标志位(DF/MF) + 分片偏移量 |
| 8 | Time to Live | 8 | 生存时间,每经过一个路由器减1 |
| 9 | Protocol | 8 | 上层协议号(TCP=6, UDP=17, ICMP=1) |
| 10-11 | Header Checksum | 16 | 头部校验和,仅校验头部 |
| 12-15 | Source Address | 32 | 源IP地址 |
| 16-19 | Destination Address | 32 | 目的IP地址 |
关键字段解读:
- TTL:我见过太多人以为TTL是「时间」,其实它是「跳数」。Windows默认128,Linux默认64。抓包时看到TTL=128,基本能判断源端是Windows。
- Identification + Flags + Fragment Offset:这三个字段联合实现IP分片。我曾经在分析一个视频流丢包问题时,发现分片重组失败导致花屏——就是因为MF标志位被中间设备错误修改了。
- Protocol:这个字段告诉接收方,IP数据部分应该交给哪个上层协议处理。没有它,网络层就不知道把数据传给TCP还是UDP。
抓包小技巧:用Wireshark看IP头部时,重点关注TTL和Identification。TTL异常(比如突然变小)可能说明路由环路;Identification连续递增说明是同一会话的数据包。
3.2 IPv4与IPv6——从32位到128位的跨越
IPv4地址只有32位,理论上43亿个。听起来很多,但互联网设备早就超过这个数了。我记得2011年IANA分配完最后一批IPv4地址时,整个行业都紧张了一下。
IPv6把地址空间扩展到128位,这个数字有多大?2^128 ≈ 3.4×10^38,地球上每粒沙子都能分到几十亿个地址。
| 对比项 | IPv4 | IPv6 |
|---|---|---|
| 地址长度 | 32位 | 128位 |
| 表示方式 | 点分十进制(192.168.1.1) | 冒号十六进制(2001:db8::1) |
| 头部长度 | 20-60字节(可变) | 40字节(固定) |
| 校验和 | 有 | 无(依赖上层) |
| 分片 | 路由器可做分片 | 仅源端可做分片 |
| 广播 | 支持 | 不支持(用组播替代) |
| 自动配置 | DHCP | SLAAC(无状态地址自动配置) |
IPv6头部比IPv4简洁很多。它去掉了校验和、分片相关字段和选项,把选项放到了扩展头部里。为什么去掉校验和?因为数据链路层和传输层都有校验,网络层再做一次就是冗余。这个设计思路值得学习——不要做别人已经做好的事。
注意:IPv6的地址表示中,连续的全0段可以用双冒号(::)压缩一次。但双冒号只能出现一次,否则地址就不唯一了。比如 2001:0:0:0:0:0:0:1 可以写成 2001::1,但不能写成 2001::1::。
3.3 子网划分——把大网络切成小段
子网划分的核心思想是:从主机位借位给网络位。为什么要这么做?因为一个A类网络有1600多万个主机地址,现实中根本用不了,而且广播域太大,网络性能会急剧下降。
我当年刚入行时,给一个中型企业做网络规划。老板说「给我一个C类地址段就够了」,结果半年后分公司扩张,IP不够用,只能重新划分子网,所有设备重新配置——那叫一个痛苦。所以我现在做规划时,一定会预留30%的地址空间。
子网划分的公式很简单:
- 子网数 = 2^n(n为借用的主机位数)
- 每个子网主机数 = 2^(8-n) - 2(减去网络地址和广播地址)
- 子网掩码 = 原掩码 + n位
举个例子:把 192.168.1.0/24 划分成4个子网:
- 借2位主机位 → 子网掩码变成 /26(255.255.255.192)
- 子网1:192.168.1.0/26(可用地址1-62)
- 子网2:192.168.1.64/26(可用地址65-126)
- 子网3:192.168.1.128/26(可用地址129-190)
- 子网4:192.168.1.192/26(可用地址193-254)
避坑指南:每个子网的第一个地址是网络地址,最后一个地址是广播地址,都不能分配给主机。我曾经见过有人把192.168.1.0配给服务器,结果全网广播风暴——因为网络地址被当成了普通IP使用。
3.4 路由原理——数据包如何找到路
路由,说白了就是「问路」。每个路由器维护一张路由表,数据包到达后,路由器查表决定下一跳该往哪走。
路由表的核心条目:
- 目的网络:目标地址所在的网段
- 下一跳:下一台路由器的接口IP
- 出接口:本路由器的哪个端口发出去
- 度量值:到达目标网络的「代价」(跳数、带宽、延迟等)
路由匹配规则:最长前缀匹配。什么意思?路由表中可能有多个条目匹配同一个目的IP,路由器会选择子网掩码最长的那个。比如去往8.8.8.8,同时匹配了0.0.0.0/0(默认路由)和8.0.0.0/8,那肯定走8.0.0.0/8,因为它的掩码更长、更精确。
我遇到过最经典的案例:某公司网络突然变慢,排查发现路由表里多了一条/16的静态路由,覆盖了原本的/24精确路由,导致流量绕了一大圈才到达目标。删掉那条多余路由后,延迟从200ms降到了5ms。
路由类型对比:
- 直连路由:路由器自动学习,优先级最高
- 静态路由:管理员手动配置,适合小型网络
- 动态路由:通过RIP、OSPF、BGP等协议自动学习,适合大型网络
- 默认路由:0.0.0.0/0,所有未匹配的流量都走这里
3.5 知识体系总览
下面这张图把本章的核心知识点串起来了。你可以看到IP头部、地址类型、子网划分和路由决策之间的关系。
嗯,到这里网络层的核心内容就讲完了。IP头部结构是基础中的基础,IPv4和IPv6的差异要理解设计思路,子网划分是网络工程师的必备技能,路由原理决定了数据包能不能到达目的地。这些知识点在抓包分析、网络排障、协议开发中都会反复用到。