💬 :如果你在阅读过程中有任何疑问或想要进一步探讨的内容,欢迎在评论区畅所欲言!我们一起学习、共同成长~!
👍 :如果你觉得这篇文章还不错,不妨顺手点个赞、加入收藏,并分享给更多的朋友噢~!
引言:《 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 位首部长度)"的混合方案分离:
- 先读前20 字节,提取 4 位首部长度 → 得到报头大小;
- 若报头大小 > 20 字节,继续读选项字段;
- 剩下全是有效载荷。
📌联动: 《 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 报头,靠三个分片字段协同:
- 16 位标识:同源同组分片 id 相同 → 用于聚合;
- 3 位标志:DF=1 禁分片;MF=1 表示 "后面还有分片",最后一个分片 MF=0;
- 13 位片偏移:相对原始数据开头的偏移,片偏移 = 原始数据字节偏移数 ÷ 8→ 除最后一片外,每片长度必须是 8 的整数倍。
笔试原题(必会):IP 层要发 4500 字节数据(IP 头 20 字节,无选项),按 MTU=1500 分片:
| 分片 | 单片总字节 | 标识 | 标志 | 单片原始数据字节(=总字节 - IP 头) | 原始数据字节偏移数 | 片偏移 |
|---|---|---|---|---|---|---|
| 1 | 1500 | 123 | MF=1 | 1480 | 1480 | 0 |
| 2 | 1500 | 123 | MF=1 | 1480 | 2960 | 1480/8=185 |
| 3 | 1500 | 123 | MF=1 | 1480 | 4440 | 2960/8=370 |
| 4 | 80 | 123 | MF=1 | 60 | 4500 | 4440/8=555 |
组装规则(只发生在目的端 IP 层)
- 首片:片偏移 = 0;末片:MF = 0;
- 下一片偏移 = 当前片偏移 + 当前片数据字节数 ÷ 8;
- 组装到 MF=0 的片为止。也就是只有片偏移 = 0 且 MF=0 的报文才是未分片的独立报文(首片和末片是同一片就是未分片)。
⚠️三个高频易错:
- 分片可发生在源主机,也可发生在中途路由器(不同网络 MTU 不同,进入更小 MTU 网络时路由器再分片);
- 组装只在目的端 IP 层,中间路由器只转发不组装;
- 两端传输层看到的是完整报文,所以传输层感知不到分片;传输层报头只出现在第一个分片里,后续分片可能没有 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 类 | 0 | 0.0.0.0 ~ 127.255.255.255 |
| B 类 | 10 | 128.0.0.0 ~ 191.255.255.255 |
| C 类 | 110 | 192.0.0.0 ~ 223.255.255.255 |
| D 类 | 1110 | 224.0.0.0 ~ 239.255.255.255 |
| E 类 | 1111 | 240.0.0.0 ~ 247.255.255.255 |
- 判断类别就看前几位比特中第一个 0 出现的位置。
3.3 CIDR 与子网掩码【必考核心】
考察形式:笔试计算题高频(牛客题霸同型原题)、手写按位与、一面问答("子网掩码是干什么的")。
传统五类 IP 地址固定网络位长度(即“/数字”),浪费地址,因此诞生了CIDR(无类别域间路由),用子网掩码(32 位二进制,前面连续 1 对应网络号,后面连续 0 对应主机号)自由指定网络位长度,按需划分子网。
核心运算(必会):网络号 = IP 地址 & 子网掩码(二进制按位与)
前 28 位是网络号的子网掩码(即“/28”)为例,
| IP | 140.252.20.68 | 10001100.11111100.00010100.01000100 |
|---|---|---|
| 子网掩码 | 255.255.255.240 | 11111111.11111111.11111111.11110000 前 28 位连续 1 是网络号,后 4 位连续 0 是主机号 |
| 网络号 | 140.252.20.64 | 10001100.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 章) |
| IPv6 | 128 位(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 不能直接上公网(高频追问):
- 私网 IP 无法唯一标识公网主机(不同局域网可重复);
- 正因为可重复,才能缓解 IP 不足;
- 数据必经运营商设备,也不可能绕开。
两个局域网的主机不能不跨公网通信(高频易错):私网 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 | 子网掩码 |
| Flags | U= 条目有效;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 最短路算法。