3. 网络层核心协议:IP协议头部结构、IPv4与IPv6对比、子网划分与CIDR、路由选择原理
网络层是整个协议栈的「交通枢纽」。数据链路层管的是相邻节点怎么传,网络层管的是数据包怎么从源端一路跑到目的端。说白了,没有网络层,你的数据包连小区大门都出不去。
这一章我们聚焦四个核心话题:IP头部到底长什么样、IPv4和IPv6到底差在哪、子网划分和CIDR怎么玩、路由器是怎么选路的。我当年刚入行时,被这几个问题折磨得不轻,尤其是子网掩码的计算,一度让我怀疑自己是不是数学没学好。
3.1 IP协议头部结构
IP头部是每个IP数据包的开头部分。路由器拿到一个包,第一件事就是解析头部,决定往哪扔。IPv4头部长度通常是20字节,不含选项字段的话。
我习惯把IP头部拆成几个关键字段来记:
- 版本号(4bit):IPv4就是4,IPv6就是6。没啥好说的。
- 头部长度(4bit):单位是4字节。最小值5(20字节),最大值15(60字节)。
- 服务类型(8bit):现在主要用DSCP做QoS。我在做视频会议系统时,就靠这个字段给RTP流打标记,保证语音不卡。
- 总长度(16bit):整个IP包的长度,包括头部和数据。最大值65535字节。
- 标识、标志、片偏移:这三个字段是给IP分片用的。嗯,IPv6直接砍掉了分片功能,后面会讲。
- 生存时间TTL(8bit):每经过一个路由器减1,减到0就丢弃。我排查环路问题时,第一件事就是看TTL。
- 协议号(8bit):标识上层协议。6是TCP,17是UDP,1是ICMP。
- 头部校验和(16bit):只校验头部,不校验数据。每个路由器都要重新计算,因为TTL变了。
- 源IP地址和目标IP地址(各32bit):这个不用解释了吧。
一个容易踩的坑:我曾经在排查一个丢包问题时,发现某个老旧路由器对IP选项字段处理有bug,导致所有带时间戳选项的包都被丢弃。后来我们统一在出口路由器上剥离了IP选项,问题解决。所以生产环境尽量别用IP选项,兼容性是个大问题。
3.2 IPv4与IPv6对比
IPv6不是IPv4的简单升级,它是一次彻底的重新设计。我刚开始接触IPv6时,觉得128位地址太夸张了,后来发现好处远不止地址数量。
| 对比项 | IPv4 | IPv6 |
|---|---|---|
| 地址长度 | 32位 | 128位 |
| 地址数量 | 约43亿 | 2^128个 |
| 头部长度 | 20-60字节(可变) | 40字节(固定) |
| 分片 | 路由器可做分片 | 只有源端可做分片 |
| 校验和 | 有头部校验和 | 无校验和(依赖链路层) |
| 广播 | 支持 | 不支持,用组播替代 |
| 配置方式 | DHCP或手动 | 无状态地址自动配置(SLAAC) |
| 安全性 | 可选(IPSec) | 原生支持IPSec |
你想想看,IPv6砍掉了校验和,为什么?因为链路层(以太网)已经有CRC校验了,上层(TCP)也有校验和,IP层再做一遍纯属浪费。这就是「分层各司其职」的体现。
IPv6的头部结构更简洁:
- 版本号(4bit):固定为6。
- 流量类型(8bit):类似IPv4的ToS。
- 流标签(20bit):用于标识同一流的数据包,方便做QoS。
- 负载长度(16bit):不包括头部,只算扩展头部和数据。
- 下一个头部(8bit):类似IPv4的协议号,但也可以指向扩展头部。
- 跳数限制(8bit):就是IPv4的TTL,只是改了个名字。
- 源地址和目标地址(各128bit):地址变长了,但处理更高效。
我的建议:如果你还在做纯IPv4的网络设计,现在可以开始考虑双栈部署了。我在2019年帮一个客户做数据中心迁移时,就强制要求所有新设备支持IPv6。虽然当时IPv6流量占比不到5%,但三年后这个比例涨到了30%。早做准备不吃亏。
3.3 子网划分与CIDR
子网划分说白了就是把一个大网络切成若干个小网络。为什么要切?因为广播域太大,网络性能会下降。你想想看,一个办公室500台电脑都在一个广播域里,谁发个ARP请求,所有人都得听,那画面太美我不敢看。
子网掩码的作用就是告诉路由器:IP地址中哪些位是网络部分,哪些是主机部分。比如255.255.255.0,前24位是网络位,后8位是主机位。
CIDR(无类别域间路由)的出现,彻底改变了IP地址分配方式。它用「IP地址/前缀长度」的表示法,比如192.168.1.0/24,意思就是前24位是网络位。
我当年考CCNA时,子网划分的题目做得我头皮发麻。后来总结了一个笨办法:
- 确定需要的子网数量,算出需要借多少位。
- 确定每个子网需要的主机数量,算出主机位够不够。
- 写出新的子网掩码。
- 列出每个子网的网络地址、广播地址和可用主机范围。
举个例子:把192.168.1.0/24划分成4个子网。
- 需要2位(2^2=4),所以子网掩码变成/26(255.255.255.192)。
- 每个子网有2^(32-26)-2=62个可用主机地址。
- 子网1:192.168.1.0/26,可用范围192.168.1.1-62,广播192.168.1.63。
- 子网2:192.168.1.64/26,可用范围192.168.1.65-126,广播192.168.1.127。
- 子网3:192.168.1.128/26,可用范围192.168.1.129-190,广播192.168.1.191。
- 子网4:192.168.1.192/26,可用范围192.168.1.193-254,广播192.168.1.255。
注意:每个子网的第一个地址是网络地址,最后一个地址是广播地址,都不能分配给主机用。我曾经见过一个新手把网络地址配给了服务器,结果整个子网通信都出了问题。排查了半天才发现是地址冲突。
CIDR还有一个重要作用:路由聚合。把多个连续的子网聚合成一个大的路由条目,可以大幅减少路由表大小。比如把192.168.0.0/24、192.168.1.0/24、192.168.2.0/24、192.168.3.0/24聚合成192.168.0.0/22,路由条目从4条变成1条。
3.4 路由选择原理
路由选择,就是路由器决定数据包走哪条路的过程。说白了,路由器就是一个「查表转发」的机器。
路由表里有什么?目标网络、下一跳地址、出接口、路由优先级(管理距离)、度量值(Metric)。
路由选择的核心原则:
- 最长前缀匹配:路由表里有多个条目匹配目标IP时,选前缀最长的那个。比如目标IP是192.168.1.100,路由表里有192.168.0.0/16和192.168.1.0/24,那就选/24的。
- 管理距离:不同路由来源的优先级。直连路由是0,静态路由是1,OSPF是110,RIP是120。数值越小越优先。
- 度量值:同一种路由协议内部,选度量值最小的路径。RIP用跳数,OSPF用带宽,EIGRP用复合度量。
我遇到过最经典的路由问题:一个客户的核心交换机上配了默认路由指向出口路由器,同时又跑着OSPF。结果OSPF把一条更优的路径通告给了核心交换机,导致部分流量走了内网绕了一圈才出去。排查时发现是管理距离没配好,OSPF的110比静态路由的1大,但OSPF学到的路由更精确(/24 vs /0),最长前缀匹配优先了。
路由协议分两大类:
- 距离矢量协议(RIP、EIGRP):只告诉邻居「我能到哪」,邻居再告诉下一个邻居。收敛慢,容易有环路。
- 链路状态协议(OSPF、IS-IS):每个路由器都知道整个网络的拓扑,自己算最短路径。收敛快,但消耗资源多。
我个人更偏爱OSPF。虽然配置比RIP复杂,但它的快速收敛和分层设计(区域0)在大规模网络中优势明显。我在一个省级教育网项目中,用OSPF划分了10个区域,骨干区域跑在核心路由器上,每个地市一个普通区域。运行了5年,没出过大的路由问题。
路由环路是网络工程师的噩梦。数据包在两个路由器之间来回跳,TTL不断减1,直到变成0被丢弃。怎么防?
- 最大跳数限制:RIP的16跳就是不可达。
- 水平分割:从某个接口学到的路由,不再从同一个接口通告出去。
- 毒性逆转:把坏路由标记为不可达,通告给邻居。
- 触发更新:拓扑变化时立即通告,不等定期更新。
嗯,说到环路,我想起一个真实案例。某公司网络用了RIP,两个路由器之间有一条主链路和一条备份链路。主链路断了之后,备份链路顶上,但RIP收敛慢,导致两个路由器互相把对方当成下一跳,形成了环路。最后是TTL耗尽才把包丢掉。后来我给他们换了OSPF,再也没出过类似问题。
这一章的内容就到这里。IP头部结构是基础中的基础,IPv6是未来趋势,子网划分和CIDR是网络设计的必修课,路由选择原理决定了网络能不能正常工作。把这些吃透了,网络层就算入门了。