
🔥小叶-duck:个人主页
❄️个人专栏:《Data-Structure-Learning》《C++入门到进阶&自我学习过程记录》
《Linux系统从入门到实践》《Linux网络从入门到实践》
✨未择之路,不须回头
已择之路,纵是荆棘遍野,亦作花海遨游
目录
[1.1 网络层的定义与核心功能](#1.1 网络层的定义与核心功能)
[1.2 基本概念与预备知识](#1.2 基本概念与预备知识)
[二、IP 协议核心概念](#二、IP 协议核心概念)
[2.1 长距离传输的本质](#2.1 长距离传输的本质)
[2.2 IP 地址存在的意义](#2.2 IP 地址存在的意义)
[2.3 TCP 与 IP 的分工协作](#2.3 TCP 与 IP 的分工协作)
[2.4 IP 地址的本质与结构](#2.4 IP 地址的本质与结构)
[三、IP 协议头格式详解](#三、IP 协议头格式详解)
[3.1 基础信息字段](#3.1 基础信息字段)
[3.1.1 4 位版本号(Version)](#3.1.1 4 位版本号(Version))
[3.1.2 4 位首部长度(Header Length)](#3.1.2 4 位首部长度(Header Length))
[3.1.3 8 位服务类型(TOS)](#3.1.3 8 位服务类型(TOS))
[3.1.4 16 位总长度(Total Length)](#3.1.4 16 位总长度(Total Length))
[3.1.5 解包问题:为什么同时需要 4 位首部长度和 16 位总长度?](#3.1.5 解包问题:为什么同时需要 4 位首部长度和 16 位总长度?)
[3.1.6 分用问题:8 位协议号的作用](#3.1.6 分用问题:8 位协议号的作用)
[3.2 分片相关字段(简单介绍)](#3.2 分片相关字段(简单介绍))
[3.2.1 16 位标识(Identification)](#3.2.1 16 位标识(Identification))
[3.2.2 3 位标志(Flags)](#3.2.2 3 位标志(Flags))
[3.2.3 13 位片偏移(Fragment Offset)](#3.2.3 13 位片偏移(Fragment Offset))
[3.3 控制与校验字段](#3.3 控制与校验字段)
[3.3.1 8 位生存时间(TTL,Time To Live)](#3.3.1 8 位生存时间(TTL,Time To Live))
[3.3.2 8 位协议号(Protocol)](#3.3.2 8 位协议号(Protocol))
[3.3.3 16 位首部检验和(Header Checksum)](#3.3.3 16 位首部检验和(Header Checksum))
[3.4 地址字段](#3.4 地址字段)
[3.5 选项字段(Options)](#3.5 选项字段(Options))
前言
前面的系列文章,我们完整拆解了 TCP 协议整套机制,从 TCP 报头标志位、三次握手与四次挥手、滑动窗口、流量控制、拥塞控制,一直到 TCP 粘包问题、TCP 与 UDP 的对比,深入到 Linux 内核套接字数据结构理解 TCP 连接的本质。TCP 作为传输层协议,负责端到端的数据可靠交付,但它无法完成跨网段、跨路由器的远距离转发。
想要理解 TCP 报文如何跨越多个路由器,从源主机送达远端目标主机,就必须向下一层,学习网络层 IP 协议。本篇作为 IP 协议专题的第一篇,从网络层基础概念入手,介绍 IP 地址的意义与结构,再重点对 IPv4 协议头每一个字段进行详细解析,同时探讨解包、分用这两个核心问题,为后续学习 IP 分片、路由转发、NAT 等网络层核心原理打好基础。
一、网络层基础
1.1 网络层的定义与核心功能
网络层也叫互联网层或网际层,是 TCP/IP 四层模型中承上启下的关键一层。它的核心功能,就是在复杂网络环境中,为数据包确定合适的传输路径。
在 TCP/IP 模型里,应用层定义用户数据的格式与语义;传输层负责在两台主机的进程之间,建立端到端连接;而网络层负责将数据包,从源主机经过多个中间路由器,转发到目标主机。
1.2 基本概念与预备知识
- 节点:主机和路由器的统称
- 主机:配有 IP 地址,也需要进行路由控制的设备,例如电脑、手机
- 路由器:既配有 IP 地址,又能执行路由控制的设备,可以理解成网络里的中转站
报文在网络传输的本质是一跳一跳接力转发。同一局域网内,同网段主机可以直接通信;跨网络的远距离传输,必须依靠多个子网内的路由器接力转发,才能抵达目标主机。
当主机发送数据包时,会根据目标 IP 地址与本机路由表,确定下一跳交给哪一台路由器。主机选择哪一个路由器转发报文,是由目标 IP 地址和路由算法共同决定的。
二、IP 协议核心概念
2.1 长距离传输的本质
互联网 并不是一个单一的大型局域网,而是由无数子网通过路由器相互连接而成 。数据从源主机送往目标主机,本质就是一跳一跳,依靠路由器在不同子网之间接力转发。
同一局域网内,同网段主机可以直接通信;跨网段远距离传输,必须经过多台路由器接力转发才能抵达目标主机。
举个例子:你在北京的家里给上海的朋友发消息,数据会先从你的电脑发到家里的路由器,然后到小区的路由器,再到运营商的骨干路由器,经过多个路由器转发后,最终到达上海朋友的路由器,再到他的电脑。

2.2 IP 地址存在的意义
IP 地址的根本意义,是提供跨网络传输数据包的能力,能够把数据从 A 主机跨网络送到 B 主机。
这里需要注意,拥有这个能力不等于传输一定成功 ,只是具备很高概率完成交付。就像学生拥有数学考满分的能力,不等于每次考试都能拿到满分。
IP 协议提供跨网络传输的基础能力,但想要实现可靠传输,还需要上层 TCP 协议配合。

2.3 TCP 与 IP 的分工协作
可以用一个形象的比喻理解 TCP 和 IP 的分工:
- **IP:**相当于具备数学考满分能力的张三,本身拥有把数据从 A 主机跨网络送到 B 主机的能力;
- **TCP:**相当于张三的校长老舅,提供各类保障策略,包含确认应答、超时重传、拥塞控制等机制,保证不管是用什么手段都要让张三最终可以拿到满分。
- **报文:**就是张三本人;
- **路由器:**沿途帮助张三前往考场的人。
IP 负责把数据包从一个网络送到另一个网络;TCP 负责保障数据包传输过程不丢失、不错乱、不重复。
TCP+IP 二者组合,才真正实现可靠的跨网络数据传输。

2.4 IP 地址的本质与结构
IP 地址 本质是一个 4 字节(32 位)数字 ,日常使用点分十进制xx.yy.zz.mm 的形式展示。
我们可以用学号类比 IP 地址:
- 学号 = 学院 + 专业 + 班级 + 个人编号
- IP 地址 = 目标网络 + 目标主机
就像凭借学号可以逐层定位到学生:保安→学院→专业→班级→宿管→个人;
依靠 IP 地址也可以逐层定位目标主机:路由器→目标网络→目标主机。
真正支撑报文路由查找的,是 IP 地址里的目标网络字段。类似唐僧取经时,沿途的人只关心目的地是 "西天"(目标网络),不会关心去西天里具体哪一座寺庙、找哪一位 "进程"。只有到达目标子网之后,才会继续定位具体主机与上层进程。
核心:IP 地址是结构化数字,依靠网络号完成跨网段路由,主机号用于子网内定位主机。
三、IP 协议头格式详解
IP 协议头是 IP 报文的控制部分,和前面在传输层讲解的 TCP 协议一样,标准长度为 20 字节,如果有选项字段,最长可达 60 字节。
IP 协议头就好比报文的快递单,记录了数据传输需要的全部关键信息,读懂 IP 头部各个字段,是理解 IP 协议转发、分片的核心。

3.1 基础信息字段
3.1.1 4 位版本号(Version)
标识 IP 协议版本。IPv4 该字段值为 4;IPv6 该字段值为 6。 IPv4 与 IPv6 协议互相不兼容,IPv6 使用 128 位地址,解决 IPv4 地址枯竭问题,当前互联网主流仍然是 IPv4。
3.1.2 4 位首部长度(Header Length)
代表 IP 头部占多少个 32 位字(4 字节)。4 位最多表示 15,所以 IP 头部最大长度 15 × 4 = 60 字节。
- 无选项的标准 IP 头部:首部长度 = 5,也就是 20 字节
- 携带选项的 IP 头部:首部长度大于 5,上限为 15
这个字段作用是让接收方区分 IP 头部与后面的数据载荷。 有效载荷长度计算公式:有效载荷长度 = 总长度 − 首部长度 × 4
3.1.3 8 位服务类型(TOS)
用来指定 IP 报文的传输优先级与服务质量。包含 3 位已弃用的优先级字段、4 位 TOS 功能字段、1 位保留位(固定为 0)。 4 个 TOS 属性互斥,一次只能选择一项:
- **最小延时:**适合 SSH、Telnet 这类交互式应用
- **最大吞吐量:**适合 FTP 文件传输场景
- **最高可靠性:**对数据完整性要求高的业务
- **最小成本:**普通数据传输业务
不同 TOS 配置,会影响路由器选择转发路径。
3.1.4 16 位总长度(Total Length)
代表整个 IP 数据报(头部 + 数据载荷)的总字节数。一共 16 位,所以 IP 报文最大长度 65535 字节。
3.1.5 解包问题:为什么同时需要 4 位首部长度和 16 位总长度?
我们之前学习 TCP 头部时,4 位首部长度用来区分头部与应用数据,IP 的首部长度字段作用与之类似,单位同样为 4 字节,依靠它可以剥离 IP 头部。
这里会产生疑问:既然首部长度可以剥离 IP 头部,为什么还需要总长度字段?
在 Linux 内核中报文使用sk_buff结构来承载,缓冲区除了上层业务数据之外,还会附带一些内核内部属性字段,这些额外内容并不是上层协议需要的数据。如果只依靠首部长度剥离头部,无法确定上层有效载荷真实的结束位置。
总长度字段标记整个 IP 报文的字节范围,内核根据总长度,就可以精准截取真正属于 IP 报文的数据,把缓冲区尾部多余的内核属性信息剔除,完成 IP 报文的解包。
3.1.6 分用问题:8 位协议号的作用
当接收端完成 IP 头部剥离,拿到 IP 承载的载荷数据后,需要知道把这一段数据交给传输层哪一个协议模块处理。
8 位协议号 就承担了分用的功能:标识载荷是 TCP、UDP、ICMP 或是其他协议的数据,内核根据这个字段,把载荷分发给对应的上层协议模块,实现多路复用里接收端的分用。
例如:
- 如果协议号是 6,就将有效载荷交给 TCP 协议处理
- 如果协议号是 17,就将有效载荷交给 UDP 协议处理
- 如果协议号是 1,就将有效载荷交给 ICMP 协议处理

3.2 分片相关字段(简单介绍)
这里仅做粗浅介绍,IP 分片与重组的完整原理、分片规则、组装逻辑,留到后续专门讲解 IP 层分片和组装小节再详细展开。
当 IP 报文长度超过链路层 MTU 最大传输单元时,IP 协议会把报文切分成多个分片传输,下面三个字段用于分片与重组。
3.2.1 16 位标识(Identification)
唯一标识主机发出的每一个原始 IP 报文。如果原始报文被切分为多个分片,所有分片的标识字段完全相同。接收主机依靠这个标识,判断哪些分片属于同一个原始报文,完成重组。
3.2.2 3 位标志(Flags)
用来控制 IP 分片行为:
- 第 1 位:保留位,暂不使用
- 第 2 位:禁止分片位 DF。DF=1 代表不允许分片;报文超过 MTU 时直接丢弃报文,并返回 ICMP 差错报文
- 第 3 位:更多分片位 MF。MF=1 代表后面还有分片;MF=0 代表当前是最后一个分片
3.2.3 13 位片偏移(Fragment Offset)
表示当前分片的数据,相对于原始报文数据部分的偏移位置。实际偏移字节数 = 片偏移值 × 8。 除最后一个分片外,其余分片的数据长度必须是 8 字节的整数倍,才能保证偏移量对齐。 示例:片偏移等于 100,实际代表这个分片的数据从原始报文第 800 字节位置开始。
3.3 控制与校验字段
3.3.1 8 位生存时间(TTL,Time To Live)
代表报文在网络中最多能够经过的路由器跳数。
- 初始值常见为 64,不同操作系统会有差异
- 报文每经过一台路由器,TTL 减 1
- TTL 减到 0 时 ,路由器丢弃报文 ,并向源主机发送 ICMP 超时报文
核心作用:防止路由环路 。
如果没有 TTL,陷入环路的报文会无限转发,持续消耗网络资源。
我们可以使用 ping 命令直接观察 TTL 数值。
bash
C:\Users\whb>ping www.baidu.com
正在Ping www.a.shifen.com[183.2.172.177]具有32字节的数据:
来自183.2.172.177的回复:字节=32时间=35msTTL=52
3.3.2 8 位协议号(Protocol)
标识 IP 报文载荷属于哪一层上层协议,接收方依靠该字段把载荷交给对应协议处理。 常见协议号:
- 1:ICMP,互联网控制消息协议,ping、traceroute 网络诊断工具使用
- 2:IGMP,互联网组管理协议,用于 IP 多播管理
- 6:TCP,传输控制协议,面向连接可靠传输
- 17:UDP,用户数据报协议,无连接不可靠传输
- 47:GRE,通用路由封装,多用于 VPN
- 50:ESP,IPSec 安全封装载荷,加密使用
- 51:AH,IPSec 认证头,完整性校验
- 89:OSPF,开放式最短路径优先,路由协议
3.3.3 16 位首部检验和(Header Checksum)
采用 CRC 算法校验 IP 头部,检测传输过程中 IP 头部是否损坏。发送端计算校验值填入,接收端重新计算比对。校验不一致则直接丢弃报文。
重要: 仅校验 IP 头部,不校验后面的数据部分,数据完整性校验交给上层 TCP/UDP 完成。
3.4 地址字段
- 32 位源 IP 地址:报文发送方的 IP 地址
- 32 位目的 IP 地址:报文接收方的 IP 地址
这两个字段是 IP 头部最核心部分,决定数据包从哪里来、要转发到哪里。
3.5 选项字段(Options)
可选字段,最长 40 字节。用于拓展额外功能,例如记录路由、时间戳、安全选项等。绝大多数普通 IP 报文不会启用选项字段。
核心考点总结:
- 网络层的核心作用是路由转发,长距离传输的本质是子网间的一跳一跳转发
- TCP 与 IP 的关系:IP 提供基础传输能力,TCP 提供端到端的可靠性保障
- IP 地址的结构化设计:网络号用于跨子网路由,主机号用于子网内寻址
- IP 协议头各字段的作用,特别是 TTL、协议号、首部长度和分片相关字段
- TTL 的核心作用是防止路由循环,每经过一个路由器值减 1
- 8 位协议字段的常见值(TCP=6,UDP=17,ICMP=1)
- IP 分片机制的原理:标识、标志、片偏移三个字段的协同工作
结束语
本篇我们完成了网络层基础概念的学习,梳理了 IP 协议的核心作用,并且逐字段解析了 IPv4 协议头部,理解了首部长度、总长度、协议号等字段如何解决报文解包与上层分用的核心问题。分片相关字段仅做了初步介绍,分片重组的完整逻辑、路由表查找、公网网络拓扑等内容,会在后续 IP 协议系列文章继续展开。
传输层 TCP 负责端到端的可靠传输,而网络层 IP 承担跨网段寻址与报文转发的职责,二者配合才能完成完整的数据通信。掌握 IP 头部各个字段的含义,是理解路由转发、IP 分片、NAT 等底层原理的前提。下一篇我们将继续深入 IP 协议,探索 IP 网段划分、子网掩码与路由转发机制。