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时,子网划分的题目做得我头皮发麻。后来总结了一个笨办法:

  1. 确定需要的子网数量,算出需要借多少位。
  2. 确定每个子网需要的主机数量,算出主机位够不够。
  3. 写出新的子网掩码。
  4. 列出每个子网的网络地址、广播地址和可用主机范围。

举个例子:把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年,没出过大的路由问题。

路由选择核心逻辑 数据包到达 查路由表(最长前缀匹配) 匹配成功 → 转发 匹配失败 → 丢弃/ICMP 更新TTL、校验和 从出接口发出 丢弃并发送ICMP不可达 路由选择核心:最长前缀匹配 → 管理距离 → 度量值 直连路由优先于静态路由,静态路由优先于动态路由协议

路由环路是网络工程师的噩梦。数据包在两个路由器之间来回跳,TTL不断减1,直到变成0被丢弃。怎么防?

  • 最大跳数限制:RIP的16跳就是不可达。
  • 水平分割:从某个接口学到的路由,不再从同一个接口通告出去。
  • 毒性逆转:把坏路由标记为不可达,通告给邻居。
  • 触发更新:拓扑变化时立即通告,不等定期更新。

嗯,说到环路,我想起一个真实案例。某公司网络用了RIP,两个路由器之间有一条主链路和一条备份链路。主链路断了之后,备份链路顶上,但RIP收敛慢,导致两个路由器互相把对方当成下一跳,形成了环路。最后是TTL耗尽才把包丢掉。后来我给他们换了OSPF,再也没出过类似问题。

这一章的内容就到这里。IP头部结构是基础中的基础,IPv6是未来趋势,子网划分和CIDR是网络设计的必修课,路由选择原理决定了网络能不能正常工作。把这些吃透了,网络层就算入门了。