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` 为链路层 |