ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

Linux 网络(07):网络层 — IP 协议

Linux 网络(07):网络层 — IP 协议

💬 :如果你在阅读过程中有任何疑问或想要进一步探讨的内容,欢迎在评论区畅所欲言!我们一起学习、共同成长~!

👍 :如果你觉得这篇文章还不错,不妨顺手点个赞、加入收藏,并分享给更多的朋友噢~!


引言:《 Linux 网络(01):网络基础概念 》建立了分层认知:传输层、网络层位于内核态,网络层职责是 "地址管理与路由选择";《 Linux 网络(05):传输层协议 UDP 》《 Linux 网络(06):传输层协议 TCP 》我们吃透了传输层两大协议。但 "数据到底怎么从一台主机跨网络送到另一台主机"—— 网络层(IP 协议)理论还没系统补上,本章正是网络层第一篇:IP 协议。后续篇章(ICMP、ARP、路由进阶)都在本章骨架上展开。


1. 网络层概述

1.1 网络层解决什么问题【必考核心】

考察形式:笔试选择(各层职责)、一面问答("网络层是干什么的")、二面追问("传输层和网络层的区别")。

📌联动:《 Linux 网络(01):网络基础概念 》3.3 TCP/IP 五层(或四层)模型

网络层要解决的问题是:地址管理与路由选择,就是将数据从一台主机跨网络送到另一台主机。

我们对比网络层和已经学过的传输层、数据链路层,分清解决范围和职责:

层解决范围一句话
传输层(TCP/UDP)进程到进程端到端(主机 A 的某进程 → 主机 B 的某进程)
网络层(IP)主机到主机跨网络路由,IP 地址端到端不变
数据链路层(MAC 帧)相邻节点到相邻节点一跳之内的传输(源 MAC → 目的 MAC)

💡核心认知:数据不是从一方的传输层 "直接飞" 到对方传输层,而是逐层封装向下、经网络传输、再逐层解包向上。TCP 提供的是 "传输策略",真正负责把数据在网络中传输的是 IP 和数据链路层——相当于,两栋楼四楼的人互相送东西(数据),TCP 给出“要送到、丢了重传”的策略,下A楼(逐层向下封装)➡ 问路(IP 层路由选择)➡ 上B楼(逐层向上解包)

可靠性分工:网络层有 "把数据送到对方主机的能力",但不保证每次成功;上层 TCP 靠确认应答 + 重传兜底,最终实现可靠传输。前提是网络层要有送到的能力—— 连能力都没有,TCP 再重传也白搭。

1.2 基本概念:主机、路由器、节点【必考核心】

考察形式:笔试选择(设备职责)、场景题(数据包到达路由器后干什么)。

我们先来认识网络传输过程中的三类核心角色:

概念定义面试注意点
主机配有 IP 地址的设备现代笔记本也做路由控制(查路由表决定发谁),不是 "只收发不路由"
路由器配有 IP 地址、能进行路由控制每个接口一个 IP,维护路由表,跨网段转发
节点主机和路由器的统称判断题常考

🔨路径选择(路由的本质):数据包本身 "不认识路",只能一跳一跳 "问路" —— 每个路由器查看包的目的 IP,查自己的路由表,告诉它下一跳往哪走。路由表就是路由器的 "认路经验"。


2. IP 协议格式

建立了网络层的宏观认知后,我们深入到 IP 报文本身,从报头结构、分用逻辑到分片机制,逐层拆解 IP 协议的工作细节。

2.1 报头字段总览【必考核心】

考察形式:笔试选择(字段位宽 / 位置)、代码补全(位段结构体)、一面问答("IP 首部多大"20 ~ 60 字节)。

IP 报头 =基本报头(20 字节,必有) + 选项字段(0~40 字节,可有可无),IP 报头字段如下:

字段位宽核心作用
版本号4 位IPv4 填 4
首部长度4 位⚠️ 首部长度以 4 字节为单位(不是字节为单位!),最大 60 字节填 15,无选项时填 5
服务类型(TOS)8 位3 位优先权(已弃用)+ 4 位 TOS + 1 位保留;TOS 四选一:最小延时 / 最大吞吐 / 最高可靠 / 最小成本(ssh 要最小延时,ftp 要最大吞吐)
总长度16 位IP 报头 + 有效载荷的总字节数(区分各报文的关键,最大 65535)
标识(id)16 位唯一标识主机发送的报文;同一数据分片后所有分片 id 相同
标志3 位第 1 位保留;第 2 位 DF(禁止分片,超 MTU 直接丢弃);第 3 位 MF(更多分片,最后一个分片置 0)
片偏移13 位⚠️ 分片相对原数据开头的偏移,实际偏移字节数 = 该值 × 8
生存时间(TTL)8 位最大跳数,默认 64,每过一个路由器减 1,减到 0 丢弃(防路由循环)
协议8 位上层协议类型,分用关键:6=TCP、17=UDP、1=ICMP(📌联动 05 的 1.2.3)
首部检验和16 位仅覆盖 IP 首部,校验失败直接丢弃
源 / 目的 IP各 32 位端到端地址,全程不变(📌联动 01 的 4.3.2 地址变化规律)
选项字段≤40 字节时间戳、记录路由等

🔨 IP 报头在内核中本质是一个C 位段结构体(和 TCP 报头同理):定义一个结构体变量填充各属性字段,再拷贝到数据首部。

2.2 报头与有效载荷的分离【必考核心】

考察形式:二面追问("IP 怎么知道哪部分是头、哪部分是数据")。

IP 用"定长报头(前 20 字节固定)+ 自描述字段(4 位首部长度)"的混合方案分离:

  1. 先读前20 字节,提取 4 位首部长度 → 得到报头大小;
  2. 若报头大小 > 20 字节,继续读选项字段;
  3. 剩下全是有效载荷。

📌联动: 《 Linux 网络(06):传输层协议 TCP 》2.2 报头与有效载荷的分离 —— UDP 用定长(8 字节);TCP 也用"定长报头(前 20 字节固定)+ 自描述字段(4 位首部长度)"方案。

2.3 分用:交给上层哪个协议【必考核心】

考察形式:一面问答("IP 层怎么知道交给 TCP 还是 UDP")、笔试选择。

报头与载荷分离后,下一步就是将载荷准确交付给对应的上层协议。IP 层用协议号分用,和传输层的端口分用逻辑异曲同工。

📌联动:《 Linux 网络(01):网络基础概念 》 4.2.2 分用

IP层 解包后依据报头8 位协议字段决定有效载荷交给谁:协议号填 6 交给传输层的 TCP,填 17 交给 UDP,填 1 交给 ICMP。接收端 IP 层按该字段分用。

2.4 分片与组装【必考核心 | 高频易错】

考察形式:笔试计算题(分片表格)高频、场景排障(大包传不出去)、二面追问("为什么不建议分片""MSS 和 MTU 的关系 ")。

IP 数据报在数据链路层封装成帧,帧有最大传输单元限制,超限制需要先对 IP 数据报分片再封装成帧传输。(📌联动:《Linux 网络(01):网络基础概念》4.2.1 封装)

2.4.1 MTU 与 MSS

要理解分片的原理,首先要理解两个关键概念。

①MTU(最大传输单元)=数据链路层一 MAC 帧最多承载的载荷字节数。以太网默认 MTU = 1500 字节(IP 报头 + IP 载荷),ifconfig 指令输出中的 mtu 1500 即此值:

②可以从更上一层设限来避免 IP 分片,段在网络层封装成数据报——MSS(最大报文段长度)=TCP 层约定的单段最大数据载荷,目的是让 TCP 段封装成 IP 数据报后 ≤ MTU,避免 IP 分片。 MSS 不包含 TCP 头和 IP 头,常规 MSS 值 1460 = 1500 − 20(IP 头)− 20(TCP 头)。

2.4.2 分片过程(笔试计算题高频)

IP 数据报超过 MTU 就必须分片:每个分片都封装独立 IP 报头,靠三个分片字段协同:

  1. 16 位标识:同源同组分片 id 相同 → 用于聚合;
  2. 3 位标志:DF=1 禁分片;MF=1 表示 "后面还有分片",最后一个分片 MF=0;
  3. 13 位片偏移:相对原始数据开头的偏移,片偏移 = 原始数据字节偏移数 ÷ 8→ 除最后一片外,每片长度必须是 8 的整数倍。

笔试原题(必会):IP 层要发 4500 字节数据(IP 头 20 字节,无选项),按 MTU=1500 分片:

分片单片总字节标识标志单片原始数据字节(=总字节 - IP 头)原始数据字节偏移数片偏移
11500123MF=1148014800
21500123MF=1148029601480/8=185
31500123MF=1148044402960/8=370
480

123

MF=16045004440/8=555

组装规则(只发生在目的端 IP 层)
  • 首片:片偏移 = 0;末片:MF = 0;
  • 下一片偏移 = 当前片偏移 + 当前片数据字节数 ÷ 8;
  • 组装到 MF=0 的片为止。也就是只有片偏移 = 0 且 MF=0 的报文才是未分片的独立报文(首片和末片是同一片就是未分片)。

⚠️三个高频易错:

  1. 分片可发生在源主机,也可发生在中途路由器(不同网络 MTU 不同,进入更小 MTU 网络时路由器再分片);
  2. 组装只在目的端 IP 层,中间路由器只转发不组装;
  3. 两端传输层看到的是完整报文,所以传输层感知不到分片;传输层报头只出现在第一个分片里,后续分片可能没有 TCP/UDP 头。

2.4.3 为什么不建议分片【高频易错】

不分片:收到 1 个报文即视为收到。

分片后:所有分片全部到达并组装成功才算收到,任何一个分片丢失视为整组丢弃。

  • 💡 丢包概率放大:分片后整体丢包率 ≈ 不分片时单包丢包率 ✖ 分片数。
  • ❗ 分片增加重传成本:传输层感知不到分片,丢分片导致收不到应答就整体重传。

那如何避免分片呢?—— 如 2.4.1 所说,TCP 控制单次交付不超过 MSS,从源头降低分片可能性;但进入 MTU 更小的网络仍可能被路由器分片。

2.5 TTL 与 traceroute【必考核心 | 高频追问】

考察形式:笔试选择(TTL 作用)、面试问答(traceroute 原理,2024-2026 大厂面经高频追问)、场景排障(路由环路)。

2.1 报头字段总览 提到字段“生存时间(TTL)”,这里详细说一下。

  • TTL(8 位)=报文最大跳数,默认 64(常见 64 或 128);每过一个路由器 TTL 减 1,减到 0 直接丢弃报文,防止路由环路导致报文在网络中无限循环——因此TTL 反复减到 0 时,说明路由配错形成了环路。

TTL 衍生出网络排障中常用的 traceroute 工具,如下——

  • traceroute 原理(必背):源主机依次发送 TTL=1、TTL=2、TTL=3…… 的数据包。 TTL=1 的包到第一个路由器,TTL 归零被丢弃,路由器向源主机回 ICMP 超时消息,源主机拿到第一跳路由器地址; TTL=2 的包穿过第一个路由器,到第二个路由器时 TTL 归零,再返回超时消息;不断加大 TTL,依次拿到每一跳路由器地址,拼出整条路径。

3. 网段划分

搞懂了单份 IP 报文的传输逻辑后,我们把视角放大到整个网络体系。思考一下,如何提高路由效率?先找目标网络再找目标主机,网段划分一次排除一整网段的主机。

3.1 IP 地址的构成:网络号 + 主机号【必考核心】

考察形式:笔试选择(/24 含义)、一面问答("同一网段怎么判断")、计算题。

  • 同一网段内:网络号相同、主机号必须不同;
  • 不同网段:网络号必须不同、主机号可以相同。

3.2 五类 IP 地址划分【高频易错(笔试偶见)】

考察形式:笔试选择(某 IP 属于哪类)、判断题。近年校招笔试频率下降,仍需掌握首比特规律。

类别首比特取值范围
A 类00.0.0.0 ~ 127.255.255.255
B 类10128.0.0.0 ~ 191.255.255.255
C 类110192.0.0.0 ~ 223.255.255.255
D 类1110224.0.0.0 ~ 239.255.255.255
E 类1111240.0.0.0 ~ 247.255.255.255
  • 判断类别就看前几位比特中第一个 0 出现的位置。

3.3 CIDR 与子网掩码【必考核心】

考察形式:笔试计算题高频(牛客题霸同型原题)、手写按位与、一面问答("子网掩码是干什么的")。

传统五类 IP 地址固定网络位长度(即“/数字”),浪费地址,因此诞生了CIDR(无类别域间路由),用子网掩码(32 位二进制,前面连续 1 对应网络号,后面连续 0 对应主机号)自由指定网络位长度,按需划分子网。

核心运算(必会):网络号 = IP 地址 & 子网掩码(二进制按位与)

前 28 位是网络号的子网掩码(即“/28”)为例,

IP140.252.20.6810001100.11111100.00010100.01000100
子网掩码255.255.255.240

11111111.11111111.11111111.11110000

前 28 位连续 1 是网络号,后 4 位连续 0 是主机号

网络号140.252.20.6410001100.11111100.00010100.01000000

网段可以反复划分:网段越小,容纳主机越少,主机位位数越少。比如 /28,IP 地址的 4 位主机号取值 (0000, 1111),子网范围 (140.252.20.64, 140.252.20.79);主机位缩为 2 位时,子网范围 (140.252.20.64, 140.252.20.67)。

3.4 特殊 IP 地址【高频易错】

考察形式:笔试选择(哪些 IP 不能做主机地址)、计算题(某子网可用主机数)。

特殊地址含义
主机位全 0网络号,代表这个局域网(不能做主机地址)
主机位全 1广播地址,给同链路所有主机发数据(不能做主机地址)
127.*本机环回(loopback),通常是 127.0.0.1

✅可用主机数 = 2^ 主机位数 − 2(减网络号、广播地址)。

笔试计算题:主机 IP 192.168.1.66/26,求:网络号、广播地址、可用主机数?

思路:

子网掩码 11111111.11111111.11111111.11000000,主机号 66 的二进制 01000010,按位与得网络号 192.168.1.64;

将该主机 IP 192.168.1.66 主机位全置 1 ,得广播地址 192.168.1.127;

可用主机 == 62 台。

环回原理【进阶拔高】:loopback 环回,本机发往本机的 IP 包不走物理网卡,IP 输出后直接送入本机 IP 输入队列,完整走一遍协议栈封装和解封装流程,用于测试本机网络功能是否正常。

3.5 DHCP:IP 的动态管理【冷门了解】

  • 作用:给子网内新增主机自动分配 IP,回收断开主机的 IP,集中管理(大型局域网常见);
  • 细节:基于UDP的应用层协议(📌联动 05 的 3.7 基于 UDP 的协议);一般路由器都带 DHCP 功能。
  • 近年极少考察,仅理论拓展:记住 "路由器≈DHCP 服务器、动态分配 IP" 即可。

4. IP 地址的数量限制

4.1 为什么 43 亿IPv4不够用【冷门了解】

IPv4 共 2³² ≈ 43 亿地址,但:特殊地址不可用、一台主机可能多个 IP、70 亿人口、联网设备爆发式增长、路由器等设备也占地址。CIDR 只提高利用率,没增加 IP 地址绝对上限。

4.2 三种方式解决 IP 不足【必考核心】

考察形式:笔试选择("下列哪个是解决 IP 不足的方式")、一面问答("IPv6 和 IPv4 区别")。

方案要点考频
动态分配 IP(DHCP)只给接入设备分配,同一设备每次接入 IP 可能不同冷门了解
NAT私网 IP 共用公网 IP,还顺带隐藏内网主机、防外部攻击⭐必考(详见第 5 章)
IPv6128 位(16 字节)地址,缓解枯竭⭐必考:不是 IPv4 的升级版,互不相干、互不兼容,目前未普及 IPv6

5. 私网 IP 和公网 IP

5.1 私有 IP 范围(RFC 1918)【必考核心】

考察形式:笔试选择("哪个是私网 IP")、一面问答("什么是私有 IP")

私有网段地址数
10.*(前 8 位网络号)16,777,216
172.16.* ~ 172.31.*(前 12 位网络号)1,048,576
192.168.*(前 16 位网络号)65,536

其余为公网 IP。私网 IP 只用于局域网内部通信,不能直接出现在公网上(不同局域网 IP 可重复,无法全局唯一标识主机)。

我们可以在 CentOS7 服务器查看 IP :

为什么私网 IP 不能直接上公网(高频追问):

  1. 私网 IP 无法唯一标识公网主机(不同局域网可重复);
  2. 正因为可重复,才能缓解 IP 不足;
  3. 数据必经运营商设备,也不可能绕开。

两个局域网的主机不能不跨公网通信(高频易错):私网 IP 可能相同,把目的 IP 填成和自己相同 → 操作系统认为是发给自己的,根本不会外发。聊天数据都是经公网服务器中转的。

5.2 LAN 口 / WAN 口与 NAT【必考核心】

考察形式:一面问答("NAT 是什么"" 为什么内网设备能共用一个公网 IP")、二面追问(NAT 原理、内网穿透)。

了解了私网地址的范围后,我们以家用路由器场景为例,看看私网地址如何通过 NAT 技术转换为公网地址,实现多设备共享公网 IP 上网。

  • LAN 口(子网 IP,如 192.168.1.1/24):连本地网络
  • WAN 口(外网 IP):连上游网络
  • 路由器层级:家用路由器 → 运营商路由器 → … → 最外层 WAN 口是公网 IP。每个家用路由器又是上一级路由器的子网节点,不同路由器子网 IP 可以相同(都是 192.168.1.1),子网内主机 IP 不能重复。
  • NAT(网络地址转换):子网内主机出外网时,路由器把 IP 报头源 IP 逐级替换为 WAN 口 IP,最终变成公网 IP;回包按映射表还原转发给内网主机。家用路由器实际是NAPT/PAT(同时转换地址 + 端口),让多台内网设备共用一个公网 IP。

为什么给运营商交钱:网络基础设施(基站、骨干路由器、光缆)是运营商搭建的,数据必须经过运营商网络才能到达服务器 —— 交网费≈买入网许可。


6. 路由

路由转发不是一步直达的,而是采用逐跳转发的模式。

6.1 一跳一跳 "问路"【必考核心】

考察形式:笔试选择(一跳定义)、一面问答("路由过程是怎样的")。

📌联动:《Linux 网络(01):网络基础概念》4.3.2 地址变化规律

数据路由是Hop by Hop 问路:到达路由器 → 查看目的 IP → 查路由表 → 决定下一跳(直接发给目标主机,还是发给下一个路由器)→ 反复直到目标。

⚠️"一跳" 定义(高频易错):一跳 =数据链路层中的一个区间,以太网中指从源 MAC 地址到目的 MAC 地址之间的帧传输区间。MAC 地址每跳一变,IP 地址端到端不变—— 路由改的是 MAC,不改 IP。

6.2 路由表与 route 命令【必考核心 | 实操必备】

考察形式:场景排障(ping 不通查路由表)、一面问答("路由表怎么匹配")。

每个路由器 / 主机内部维护路由表,route -n查看(CentOS7):

列含义
Destination目的网络地址
Gateway下一跳地址
Genmask子网掩码
FlagsU= 条目有效;G= 下一跳是路由器(无 G 表示目的网络与本机接口直接相连,不用路由器转发)
Iface发送接口

✅匹配过程:目的 IP 依次与每条路由的Genmask 按位与→ 结果等于该条Destination则匹配,从Iface发出;都不匹配 → 走default(缺省路由),交给下一跳路由器继续问路(default行 Flags 通常是 UG)。先找目标网络,再在目标网络里找目标主机。

6.3 转发过程实例【必考核心】

考察形式:笔试 / 场景题("目的地址 192.168.56.3 从哪个接口发出")——PDF 原例,必会:

例 1:目的 192.168.56.3 → 与第一行掩码 255.255.255.0 按位与得 192.168.56.0 ≠ 第一行 192.168.10.0;与第二行按位与得 192.168.56.0 = 第二行 Destination →从 eth1 发出。且 192.168.56.0/24 与 eth1 直连,直接发给目的主机,不经路由器。

例 2:目的 202.10.1.2 → 与前三行都不匹配 →走 default:从 eth0 发出,交给 192.168.10.1 路由器,由它继续按自己的路由表决策。

💡 面试答法:"路由匹配 = 最长前缀匹配思想的简化版"—— 逐条按位与比对,命中直连路由直接发,否则走缺省路由逐跳转发。

6.4 路由表生成算法【冷门了解】

近年极少考察,仅理论拓展:能说出 "静态 / 动态的分类 + Dijkstra 是最短路径算法" 即可。

  • 静态路由:管理员手工配置;
  • 动态路由:算法自动生成、自适应调整;
  • 代表性算法:距离向量算法(如 RIP)、LS 算法(如 OSPF)、Dijkstra 最短路算法。
RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进