《Linux 网络编程》深入理解 IP 协议(一):网络层基础与 IP 协议头详解

🔥小叶-duck个人主页

❄️个人专栏《Data-Structure-Learning》《C++入门到进阶&自我学习过程记录》

《Linux系统从入门到实践》《Linux网络从入门到实践》

《Qt 方寸极境》 《MySQL》

未择之路,不须回头
已择之路,纵是荆棘遍野,亦作花海遨游


目录

前言

一、网络层基础

[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 报文不会启用选项字段。

核心考点总结

  1. 网络层的核心作用是路由转发,长距离传输的本质是子网间的一跳一跳转发
  2. TCP 与 IP 的关系:IP 提供基础传输能力,TCP 提供端到端的可靠性保障
  3. IP 地址的结构化设计:网络号用于跨子网路由,主机号用于子网内寻址
  4. IP 协议头各字段的作用,特别是 TTL、协议号、首部长度和分片相关字段
  5. TTL 的核心作用是防止路由循环,每经过一个路由器值减 1
  6. 8 位协议字段的常见值(TCP=6,UDP=17,ICMP=1)
  7. IP 分片机制的原理:标识、标志、片偏移三个字段的协同工作

结束语

本篇我们完成了网络层基础概念的学习,梳理了 IP 协议的核心作用,并且逐字段解析了 IPv4 协议头部,理解了首部长度、总长度、协议号等字段如何解决报文解包与上层分用的核心问题。分片相关字段仅做了初步介绍,分片重组的完整逻辑、路由表查找、公网网络拓扑等内容,会在后续 IP 协议系列文章继续展开。

传输层 TCP 负责端到端的可靠传输,而网络层 IP 承担跨网段寻址与报文转发的职责,二者配合才能完成完整的数据通信。掌握 IP 头部各个字段的含义,是理解路由转发、IP 分片、NAT 等底层原理的前提。下一篇我们将继续深入 IP 协议,探索 IP 网段划分、子网掩码与路由转发机制。

相关推荐
ao-weilai1 小时前
Linux网络编程:Linux Socket TCP
linux·服务器·网络
是个西兰花1 小时前
UDP套接字编程
运维·服务器·网络
顶点多余1 小时前
9.16 面试总结
linux·面试·职场和发展
是店小二呀4 小时前
鸿蒙PC_Dart-Sass-ohos适配全记录
linux·运维·windows
菜根Sec5 小时前
没钱考网络安全证书了
网络·网络安全·信息安全·信息安全工程师·网络安全公司
充电zcx10 小时前
Linux:4:开发工具详解
linux·运维·服务器
筼筜10 小时前
【系统架构设计师】通信系统架构设计理论与实践
网络
小程序设计11 小时前
基于IPv6的校园网设计与过渡技术仿真
网络·安全
Lynne30913 小时前
工业网络,到底该集中还是自治?
网络·架构·数据