Linux Day24——TCP/IP分层与封装


type: learning-note

title: Linux:TCP/IP 分层与封装

date: 2026-10-21

description: 为什么要分层、TCP/IP 四层各管什么、OSI 七层与四层对应、封装链(数据→段→包→帧)、逐跳与端到端(帧每跳换、IP 目标不变)、本机 ip addr/link 输出认层


2026-10-21 学习笔记

> 📌 GitHub:https://github.com/AR-firefly

笔记区

核心观点

**为什么要分层**

  • 分层解决两个问题:**出故障能分段定位**(不是整条链路瞎试),**换掉一段技术不用推倒重来**(Wi-Fi 换以太网,上面的 HTTP 一行不改)。

  • Linux Journey 原文(`osi-model.md`):「开放系统互连模型是一个七层参考框架。它为工程师提供共同词汇,用于定位职责、接口和故障;它并不是每种实现的字面描述。」

**四个基础名词**

| 名词 | 全称 | 干什么 |

| ---------- | ------------------------------------------- | -------------------------------------------------------------- |

| **IP** | Internet Protocol,网际协议 | 给机器编地址、跨网络找路;**尽力而为**,不保证送到、不保证顺序 |

| **TCP** | Transmission Control Protocol,传输控制协议 | 两端可靠有序地送到:编号、确认、丢了重发、按序重组 |

| **以太网** | Ethernet(ether 以太 + net 网) | 局域网**有线**连接的标准:帧格式、MAC 地址、线缆、速率 |

| **路由器** | --- | 按路由表在 IP 网络之间转发数据包的设备 |

「MAC 给的是运输的人,IP 给的是具体的目标,路由器是翻译 IP 和配运输者(MAC)」不过路由器翻译的是**下一跳的 IP**,不是最终目标的 IP------最终目标的 MAC 在本地链路根本看不见。

**TCP/IP 四层各管什么**

| 层 | 管什么 | 住在这层的协议 / 设备 |

| ---------- | -------------------------------- | ------------------------------------- |

| **应用层** | 程序和程序之间"消息怎么说" | HTTP、DNS、SSH |

| **传输层** | 两个程序之间把数据**送到、送全** | TCP(可靠有序)、UDP(快但不管丢) |

| **网际层** | 给机器编地址 + **跨网络找路** | IP、路由器 |

| **链路层** | **本地这一段路**怎么送 | 以太网、Wi-Fi、MAC 地址、交换机、网卡 |

  • 最该分清的一对:**网际层 = 导航**(跨网络到最终目标),**链路层 = 送快递**(本地这一跳交给谁)。MAC 不管路,它只是这一段的交接人。

  • `协议` = 双方共同遵守的约定,不是法律------**没有第三方执法**,靠两端各自实现同一套规则。

**OSI 七层与 TCP/IP 四层的对应**

| # | 层 | 一句话 | 并入 TCP/IP |

| --- | ---------- | ------------------------- | ----------- |

| 1 | 物理层 | 信号、线缆、比特 | 链路层 |

| 2 | 数据链路层 | 本地帧、MAC、交换机 | 链路层 |

| 3 | 网络层 | IP 地址、路由器、跨网转发 | 网际层 |

| 4 | 传输层 | TCP / UDP、端口 | 传输层 |

| 5 | 会话层 | 管这次对话的开始与结束 | 应用层 |

| 6 | 表示层 | 数据格式、编码、加密 | 应用层 |

| 7 | 应用层 | HTTP、DNS、SSH | 应用层 |

  • 口诀:**物数网传会表应**;合并口诀:**上三合应用,下二合链路**。

  • 七层不是"七种原因",是**七个环节**------原因可以有一万种,但每个都能归到某一层。

  • 映射是**近似比较**,不是精确规定:Linux Journey 原文「这些映射只是近似比较,不能证明某个协议栈直接按照另一个模型实现」;实例:HTTPS 里的 TLS 加密横跨应用和传输之间,不老实待在任何一层。

  • OSI 是**理论参考框架**,TCP/IP 是**实际在用的模型**。

**封装:数据往下走,每层加什么**

| 步骤 | 哪一层 | 加了什么 | 产物名字 |

| ---- | ------ | --------------------------------------- | -------------------- |

| ① | 应用层 | 原始数据(如 HTTP 请求) | 数据 |

| ② | 传输层 | TCP 头:源端口、目的端口、序号 | **段**(segment) |

| ③ | 网际层 | IP 头:源 IP、目的 IP | **数据包**(packet) |

| ④ | 链路层 | 帧头 + 帧尾:源 MAC、目的 MAC、校验尾巴 | **帧**(frame) |

  • Linux Journey 原文(`tcp-ip-model.md`):「应用程序数据向下移动时,每一层都会添加其作用范围所需的信息。在接收端,各层验证并移除自己的封装,再将数据向上传递。」

  • **往下加、往上剥**。剥的顺序必须相反,因为**头是加在最前面的**------最后一个加的在最外层,只能从最外层开始撕。

  • `载荷`(payload)= 这一层头之外包着的里面那块内容。信封正面是头,信封里的信是载荷。**了解**

  • `标头`(header)= 每层加在数据前面的那段"说明"。

**逐跳 vs 端到端:帧每跳换、IP 目标不变**

  • Linux Journey 原文(`link-layer.md`):「发送方把 IP 数据包装入发送到下一跳的帧。路由器验证并移除传入帧、处理 IP 标头、选择传出路由,再为该链路构建新帧。接收方逆向移除封装,将传输层载荷送到适当的套接字。」

  • **帧头逐跳换,IP 目标不变;端口和应用只在两头认得。**

  • 为什么待遇不同:看这个地址**能管多远**------

| 地址 | 有效范围 | 结果 |

| ---- | ---------------- | ---------- |

| MAC | 一条本地链路 | 每一跳都换 |

| IP | 整个网络(跨网) | 一路不变 |

  • MAC 和 IP 是**两套独立的地址**,不是包含 / 派生关系:IP 由网络配置给(会变),MAC 由网卡出厂烧入(换网卡才换)。一台机器可以没配 IP 也有 MAC。

  • 每一跳实际发生的事:**路由表**看 IP 目标定"下一跳是谁" → **ARP** 把下一跳 IP 翻成 MAC → 链路层把帧交给这个 MAC。

  • `端到端`(end-to-end)= 只在收发两端生效,中间路由器不参与。`逐跳`(hop-by-hop)= 每一站都重新处理一遍。

关键方法/流程

**本机怎么看"网络层地址"和"链路层地址"**

  • `ip -br addr`:看**地址**(网络层)。`-br` = brief 简写,一行一个接口;`addr` = address。

  • `ip -br link`:看**网卡本身**(链路层):MAC、状态、MTU。

  • 输出每列:`接口名 状态 地址...`------接口名是**第一列**那个短名字(`eth0` / `lo`),不是后面那串地址。

  • `lo` = loopback 回环网卡,`127.0.0.1` 永远指向本机自己,不出网卡。

  • `网卡`(Network Interface Card,网络接口卡)= 负责收发帧的部件,是链路层的进出口;每块网卡有出厂 MAC。

基础知识加餐

**硬件三件套 + 一个存储**

| 名字 | 全称 | 干什么 | 关键差别 |

| -------- | ------------------------------------ | -------------------------------------------------------------------------- | ---------------------------- |

| **CPU** | Central Processing Unit,中央处理器 | 计算机的**执行者**,所有运算在这做;核心少、每个强,擅长"一步接一步"的逻辑 | 串行 / 通用 |

| **GPU** | Graphics Processing Unit,图形处理器 | 成千上万个小核心,擅长"一次处理很多同样的活"(并行);AI 训练 / 推理的主力 | 并行 / 专用;AIDC 最贵的资源 |

| **内存** | RAM,Random Access Memory | 程序运行时的工作台 | **快,断电清空** |

| **硬盘** | SSD / HDD | 长期存放文件与系统 | **慢但大,断电不丢** |

  • 内存 vs 硬盘的判据:**断电谁丢**。内存丢,硬盘不丢;内存快而小,硬盘慢而大。

**系统软件三个词**

| 名字 | 是什么 | 例子 / 怎么认 |

| -------------------------- | ---------------------------------------------------------------------------------- | ---------------------- |

| **内核**(kernel) | 操作系统最核心的那层:管硬件、调度进程、管内存和文件;用户程序靠"系统调用"请它干活 | 一个核心程序 |

| **发行版**(distribution) | 内核 + 一堆软件 + 包管理器 = 一套能直接装的系统 | Ubuntu、Debian、CentOS |

| **Shell** | 解释命令的程序:敲的 `ls`、`cd` 由它读懂并执行 | 最常见的是 `bash` |

  • 三组易混:

  • **内核 vs 发行版**:内核是"核心程序"(一个);发行版是"打包好的整套"(内核 + 软件 + 安装方式)。

  • **Shell vs 终端**:终端是**窗口**;Shell 是窗口里**解释命令的那个程序**。敲 `ls` 的顺序是:终端收字 → bash 读懂 → 内核执行 → CPU 算 → 结果回来。

  • **Shell vs 内核**:Shell 是"翻译官"(把命令翻译给系统),内核是"干活的"(真正操作硬件)。

**SSH**

  • `SSH`(Secure Shell,安全外壳)= **远程登录另一台机器**,全程加密。以后连服务器、连实验室机器都用它。

**环境变量 / PATH**

  • **环境变量** = 系统里存的一堆设置项,形式是 `名字=值`。

  • **PATH** 是其中最重要的一个:告诉 Shell"敲命令时去哪些目录里找这个程序"。

  • 敲 `ls` 时,Shell 按 PATH 列出的目录依次找,找到 `/usr/bin/ls` 就执行;全找不到就报 `command not found`。

  • **`\` 符号\*\*:在 Shell 里表示"\*\*取这个变量的值\*\*";\`PATH` = 把 PATH 的内容取出来。

  • 判据:PATH 里 `/mnt/c/...` 开头的是 **Windows** 挂进来的(WSL 把 C 盘挂在 `/mnt/c`);`/usr`、`/bin`、`/sbin`、`/snap` 开头的是 **Linux 自己的**。

**客户端 / 服务器**

  • **客户端** = 主动发起请求的一方;**服务器** = 等着被请求、提供服务的一方。

  • 例:浏览器(客户端)→ 网站(服务器);SSH 客户端 → 远端的 sshd(SSH 服务)。

**两个锚点(了解层,用到再展开)**

  • `ARP`(Address Resolution Protocol,地址解析协议):把**下一跳的 IP** 翻成它的 MAC------块 4 第 2 天展开。

  • `载荷`(payload):这一层头之外包着的里面那块内容;信封正面是头,信封里的信是载荷。

实战记录

  • **看地址**:

```

$ ip -br addr

lo UNKNOWN 127.0.0.1/8 10.255.255.254/32 ::1/128

eth0 UP 172.17.158.107/20 fe80::215:5dff:fead:4b9e/64

```

`eth0` 的**网络层地址有两条**:`172.17.158.107/20`(IPv4)和 `fe80::215:5dff:fead:4b9e/64`(IPv6)。

  • **看 MAC**:

```

$ ip -br link

lo UNKNOWN 00:00:00:00:00:00 <LOOPBACK,UP,LOWER_UP>

eth0 UP 00:15:5d:ad:4b:9e <BROADCAST,MULTICAST,UP,LOWER_UP>

```

`eth0` 的 MAC = `00:15:5d:ad:4b:9e`。**`ip -br addr` 看不到 MAC**------MAC 是网卡的属性,归 `link` 管,不归 `addr` 管。

  • **看 PATH**:

```

echo PATH

/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:...

/mnt/c/Windows/system32:/mnt/c/Program Files/...:/snap/bin

```

整串是一堆目录用冒号隔开。判据:`/mnt/c/...` 开头的来自 **Windows**(WSL 挂在 `/mnt/c`),`/usr`、`/bin`、`/sbin`、`/snap` 开头的才是 **Linux 自己的**。


线索区(学完后合上材料,自问自答)

**Q: 为什么要分层?不分层会撞哪三个麻烦?**

A: 出故障能分段定位、换一段技术不用推倒重来、不用每加一个应用就重写"怎么送出去"。不分层就是整条链路瞎试。

**Q: TCP/IP 四层从下到上各管什么?HTTP / SSH / DNS / TCP 各归哪层?**

A: 链路(本地这一段)→ 网际(地址 + 跨网找路)→ 传输(送到送全)→ 应用(消息怎么说)。HTTP / SSH / DNS 归应用层,TCP 归传输层。

**Q: OSI 七层顺序是什么?哪几层被并入 TCP/IP 的哪层?**

A: 物数网传会表应。上三层(会话 / 表示 / 应用)合进应用层;下两层(物理 / 数据链路)合进链路层。映射是近似,不是精确规定。

**Q: 封装顺序是什么?每层加了什么头、加完叫什么?**

A: 应用数据 → 加 TCP 头(端口 / 序号)= 段 → 加 IP 头(源 / 目的 IP)= 数据包 → 加帧头帧尾(MAC / 校验尾巴)= 帧。

**Q: 数据经过路由器时,帧头里的 MAC 和 IP 里的目标地址各变不变?为什么?**

A: MAC 每跳换,IP 目标不变。因为 MAC 只管一条本地链路,出了这段就没意义;IP 是跨网络的最终目标,一路保留。

**Q: `ip -br addr` 和 `ip -br link` 各看什么?怎么认接口名和 MAC?**

A: `addr` 看网络层地址,`link` 看网卡(含 MAC)。两边的第一列都是接口名(`eth0` / `lo`);MAC 只在 `link` 里出现。

**Q: 敲一个命令报 `command not found`,第一件事看什么?**

A: 看 `echo PATH\` 里有没有那个命令所在的目录。PATH 是 Shell 找命令的目录清单,\`` 表示取这个变量的值。

**Q: 内存和硬盘的分工差在哪?**

A: 内存是运行时工作台------快、断电清空;硬盘长期存放------慢但大、断电不丢。判据是"断电谁丢"。

**Q: 内核和发行版差在哪?Shell 和终端差在哪?**

A: 内核是操作系统最核心那层(管硬件、调度);发行版是内核 + 软件 + 包管理器打包的一整套。终端是窗口,Shell 是窗口里解释命令的程序。


总结(50字以内,用自己的话概括今天学到了什么)

一条数据出门:应用说话、TCP 记账、IP 指路、网卡一段段送;出了事按层找,不整条链路瞎试。


复习卡片

| 概念 | 必学/了解 | 一句话 | 场景 |

| ---------------------- | --------- | -------------------------------------------------- | ---------------------- |

| 分层 | 必学 | 分段定位 + 换一段不推倒重来 | 排障先判断在哪一层 |

| 应用层 | 必学 | 程序之间消息怎么说(HTTP / DNS / SSH) | 认协议 |

| 传输层 | 必学 | 把数据送到、送全(TCP / UDP + 端口) | 判断丢没丢、顺序乱没乱 |

| 网际层 | 必学 | 编地址 + 跨网络找路(IP / 路由器) | 判断能不能跨网到 |

| 链路层 | 必学 | 本地这一段怎么送(以太网 / MAC / 交换机) | 判断网线 / 网卡这一跳 |

| OSI 七层 | 必学 | 物数网传会表应;理论参考框架 | 听懂"几层"的说法 |

| 上三合应用、下二合链路 | 必学 | 5/6/7 → 应用层,1/2 → 链路层 | 七层 ↔ 四层换算 |

| 封装 | 必学 | 往下走每层加自己的头 | 理解数据怎么变形 |

| 解封装 | 必学 | 往上走每层撕自己的头;顺序与封装相反 | 接收端还原 |

| 段 / 数据包 / 帧 | 必学 | 段=传输层,包=网际层,帧=链路层 | 名字跟着层走 |

| 标头(header) | 必学 | 每层加在数据前面的说明 | 读封装链 |

| MAC 地址 | 必学 | 链路层地址,只管一条本地链路,每跳换 | 认下一跳 |

| IP 地址 | 必学 | 网际层地址,跨网最终目标,一路不变 | 认终点 |

| 接口(interface) | 必学 | 网卡在系统里的名字(eth0 / lo),不是地址 | 读 ip 输出第一列 |

| 逐跳 / 端到端 | 了解 | 逐跳=每站重处理;端到端=只在两头生效 | 区分 MAC 与 IP |

| FCS(帧校验序列) | 了解 | 帧尾校验和,能发现损坏,不修复 | 帧坏了能发现 |

| 前缀长度(/20、/64) | 不记 | 查 `man 8 ip-address` | --- |

| `ip` 子命令 | 不记 | `ip --help` / `man 8 ip-address` / `man 8 ip-link` | --- |

| 网卡(NIC) | 必学 | 收发帧的部件,链路层的进出口 | 读 `ip link` 时认它 |

| 环境变量 / PATH | 必学 | 系统设置项;PATH = Shell 找命令的目录清单 | `command not found` |

| CPU | 了解 | 少而强的核心,一步接一步执行 | 认硬件 |

| GPU | 了解 | 大量并行小核心,AI 训练 / 推理主力 | AIDC 的核心资源 |

| 内存 / 硬盘 | 了解 | 内存快、断电清空;硬盘慢、断电不丢 | 判断"断电丢不丢" |

| 内核(kernel) | 了解 | 操作系统最核心层:管硬件、调度、内存、文件 | 理解系统怎么运转 |

| 发行版(distro) | 了解 | 内核 + 软件 + 包管理器(Ubuntu / Debian / CentOS) | 认系统 |

| Shell / 终端 | 了解 | 终端是窗口;Shell 是解释命令的程序(bash) | 敲命令时 |

| SSH | 了解 | 远程登录另一台机器,全程加密 | 连服务器 |

| 客户端 / 服务器 | 了解 | 发起请求的一方 / 提供服务的一方 | 看网络角色 |

| ARP | 了解 | 把下一跳 IP 翻成 MAC(块 4 第 2 天展开) | 锚点 |

| 载荷(payload) | 了解 | 这一层头外面包着的里面那块内容 | 读封装链 |


流程附加段

旧知识回收

| 概念 | 一句话 | 出处 |

| ---------------- | ---------------------------------------------------------------------------- | ---------------- |

| 日志的两个用途 | 排障(为什么)/ 审计(谁做了什么);判据是**带着哪个问题**,不是正文写了什么 | 10-08 笔记线索区 |

| 日志可信三个前提 | 收集在跑 / 时间戳对 / 来源被包含;共同点:**日志里没有 ≠ 没发生** | 10-08 笔记 |

今日产出验收

| 产出 | 判定 | 证据 |

| ------------------------------- | --------- | ------------------------------------------------------------------------------------------- |

| 四层封装链(文字) | ✅ 做得出 | 「应用层,原始数据,数据,传输层,TCP头,段,网际层,IP头,数据包,链路层,帧头和帧尾,帧」 |

| 合上材料口述数据旅程 | ✅ 讲得清 | 点 4 练 ③ 盖住示例独立写出四步 + 字段 |

| 本机输出指认网络层 / 链路层地址 | ✅ 做得出 | `eth0` / `lo` 为接口名;`172.17.158.107/20` 为网络层;`00:15:5d:ad:4b:9e` 为链路层 |

相关推荐
该逃避避1 小时前
如何利用代理IP进行更好广告验证?
linux·服务器·网络
m0_617493941 小时前
昇腾 NPU Docker 部署实战:解决 stub library 报错并实现模型正常加载
运维·docker·容器
小羊没烦恼!1 小时前
.NET 11 Runtime Async 详解
java·运维·开发语言·javascript·python
水饺编程1 小时前
第2章:Linux 基础,重启命令
linux·c语言·汇编
金色熊族2 小时前
在Qt中使用asan检测内存泄漏(一)
linux·qt·asan
第404号工位2 小时前
“已彻底删除”的照片与文件到底去哪了?我用底层扇区扫描,扒出手机和电脑的幽灵数据
linux·python·架构
xianyuCcCcCCCcc2 小时前
Ceph 分布式存储:集群配置与存储池管理
运维·分布式·ceph
硅基手札3 小时前
SPI技术系列 12 · SPI 设备驱动实战
linux·驱动开发·单片机·嵌入式硬件·mcu·性能优化·系统架构
不悔哥3 小时前
ESP32上跑 Linux: 乐鑫给 ESP32-S31开放了官方 BSP
linux·嵌入式硬件·开源