3、网络层核心协议:IP协议头部结构详解、IPv4地址分类与子网划分、IPv6基础

网络层是整个TCP/IP体系的灵魂。而IP协议,就是这灵魂的骨架。今天咱们就把它拆开看看,里面到底长什么样。

3.1 IP协议头部结构详解

IP头部,说白了就是包裹在最外面的那个信封。信封上写明了从哪来、到哪去、怎么走。我刚开始学的时候,总觉得这20个字节没啥好看的。后来在项目里抓包排查丢包问题,才发现每一个字段都可能成为瓶颈。

标准的IPv4头部固定20字节,加上选项最多60字节。咱们先看固定部分:

字段 长度(bit) 作用
版本号 4 IPv4填4,IPv6填6
首部长度 4 以4字节为单位,最小5,最大15
服务类型(ToS) 8 现在演变为DSCP,用于QoS
总长度 16 整个IP包的长度,最大65535字节
标识符 16 分片时用于重组
标志位 3 DF(不分片)、MF(更多分片)
片偏移 13 分片在原包中的位置
生存时间(TTL) 8 每经过一跳减1,为0时丢弃
协议号 8 标识上层协议,6=TCP,17=UDP
首部校验和 16 只校验头部,不校验数据
源IP地址 32 发送方IP
目的IP地址 32 接收方IP

核心要点:TTL字段是防环的关键。我曾经在数据中心里遇到过一台交换机配置错误,导致路由环路。要不是TTL归零后设备主动丢包,整个网络可能都被广播风暴冲垮了。

个人习惯:排查网络问题时,我第一件事就是看IP头部的TTL值。如果TTL不是常见的64、128、255,说明中间可能经过了NAT或者隧道封装。

3.2 IPv4地址分类与子网划分

IPv4地址是32位的,通常写成点分十进制。但早期设计时,人们把地址分成了A、B、C、D、E五类。说实话,这种分类方式现在基本被CIDR取代了,但理解它有助于你搞懂子网划分的来龙去脉。

3.2.1 传统分类

类别 首字节范围 默认子网掩码 可用主机数
A类 1 - 126 255.0.0.0 16,777,214
B类 128 - 191 255.255.0.0 65,534
C类 192 - 223 255.255.255.0 254
D类 224 - 239 组播地址 —
E类 240 - 255 保留 —

你想想看,一个A类网络有1600多万个主机地址,谁用得了?而C类只有254个,稍微大点的公司就不够用。这就是为什么后来要搞子网划分。

3.2.2 子网划分实战

子网划分,说白了就是把一个大的网络切成多个小的网络。核心操作就是向主机位借位,变成网络位。

举个例子:给你一个C类网络 192.168.1.0/24,需要划分成4个子网。

原网络:192.168.1.0/24
子网掩码:255.255.255.0
二进制:11111111.11111111.11111111.00000000

借2位给网络位:
新掩码:255.255.255.192
二进制:11111111.11111111.11111111.11000000

4个子网:
子网0:192.168.1.0/26    可用范围:192.168.1.1 - 192.168.1.62
子网1:192.168.1.64/26   可用范围:192.168.1.65 - 192.168.1.126
子网2:192.168.1.128/26  可用范围:192.168.1.129 - 192.168.1.190
子网3:192.168.1.192/26  可用范围:192.168.1.193 - 192.168.1.254

避坑指南:我曾经在配置交换机管理地址时,把子网掩码写成了255.255.255.0,但实际网络是/26的。结果管理地址跟业务地址不在同一个子网,设备死活ping不通。排查了半小时才发现是掩码写错了。记住:子网掩码决定了广播域的范围。

3.2.3 CIDR与VLSM

CIDR(无类域间路由)的出现,彻底打破了ABC类的限制。它用前缀长度来表示网络位,比如192.168.1.0/24。VLSM(可变长子网掩码)则允许在一个主网络中使用不同长度的子网掩码。

我个人习惯用CIDR来规划地址。举个例子:

需求:一个公司有3个部门
- 研发部:100台主机
- 市场部:50台主机
- 行政部:20台主机

分配方案:
研发部:192.168.1.0/25   (128个地址)
市场部:192.168.1.128/26 (64个地址)
行政部:192.168.1.192/27 (32个地址)

这样分配,地址利用率高,而且每个子网都有余量用于扩展。

3.3 IPv6基础

IPv4地址枯竭这事儿,喊了快20年了。现在终于到了不得不面对的时候。IPv6用128位地址,号称可以为地球上的每一粒沙子分配一个IP地址。

3.3.1 IPv6地址表示

IPv6地址是128位的,写成8组16进制数,每组4个字符,用冒号分隔。

完整格式:2001:0db8:85a3:0000:0000:8a2e:0370:7334
简化规则:
1. 每组前面的0可以省略
2. 连续的0可以用::代替(只能使用一次)

简化后:2001:db8:85a3::8a2e:370:7334

小技巧:我在配置IPv6地址时,经常用双冒号来简化书写。但要注意,双冒号只能出现一次,否则设备不知道到底省略了多少个0。

3.3.2 IPv6地址分类

类型 前缀 用途
全局单播地址 2000::/3 公网通信,相当于IPv4的公网地址
链路本地地址 fe80::/10 同一链路内通信,自动配置
唯一本地地址 fc00::/7 相当于IPv4的私有地址
组播地址 ff00::/8 一对多通信
任播地址 — 多个接口共享一个地址,最近者响应

3.3.3 IPv6头部简化

IPv6的头部比IPv4简单得多。固定部分只有40字节,而且没有校验和、没有分片相关字段(分片功能移到了扩展头部)。

IPv6固定头部(40字节):
- 版本号(4bit):固定为6
- 流量类别(8bit):相当于IPv4的ToS
- 流标签(20bit):用于QoS
- 有效载荷长度(16bit):数据部分长度
- 下一个头部(8bit):相当于IPv4的协议号
- 跳数限制(8bit):相当于IPv4的TTL
- 源地址(128bit)
- 目的地址(128bit)

核心变化:IPv6去掉了校验和,因为链路层和传输层已经做了校验。去掉了分片字段,因为分片由源端负责。这些改动让路由器处理IPv6包时更快,转发效率更高。

3.3.4 IPv6过渡技术

从IPv4到IPv6不是一蹴而就的。目前主流的过渡技术有三种:

  • 双栈:设备同时运行IPv4和IPv6协议栈。这是最常用的方式。
  • 隧道:把IPv6包封装在IPv4包里传输。比如6to4、Teredo。
  • NAT64:在IPv6网络和IPv4网络之间做地址转换。

我记得有一次帮客户做IPv6改造,他们内部网络全是IPv6,但需要访问一个只支持IPv4的老系统。最后就是用NAT64解决的。说白了,过渡技术就是给新旧协议之间搭一座桥。

3.4 本章知识体系

下面这张图把本章的核心知识点串起来了。你可以看到IP头部、地址分类、子网划分、IPv6之间的逻辑关系。

网络层核心协议知识体系 网络层核心协议 IPv4头部结构 IPv4地址与子网 IPv6基础 固定20字节 TTL防环 分片与重组 A/B/C/D/E类 子网掩码 CIDR/VLSM 128位地址 简化头部 过渡技术 IPv4与IPv6将在未来很长一段时间内共存 双栈和过渡技术是网络工程师的必备技能

这张图把本章的三个核心模块串在了一起。IPv4头部是基础,地址分类和子网划分是实战技能,IPv6是未来方向。三者缺一不可。