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协议 IP头部结构 IPv4 vs IPv6 路由原理 TTL / 分片字段 / 协议号 源/目的IP地址(32位) 头部校验和(仅校验头部) IPv4:32位 / 点分十进制 IPv6:128位 / 冒号十六进制 子网划分:借位 / 掩码计算 路由表:目的/下一跳/出接口 最长前缀匹配原则 静态路由 vs 动态路由 核心逻辑:IP头部决定「数据包长什么样」 子网划分决定「网络怎么分段」→ 路由决定「数据包怎么走」

嗯,到这里网络层的核心内容就讲完了。IP头部结构是基础中的基础,IPv4和IPv6的差异要理解设计思路,子网划分是网络工程师的必备技能,路由原理决定了数据包能不能到达目的地。这些知识点在抓包分析、网络排障、协议开发中都会反复用到。