vault backup: 2026-05-24 00:01:12

This commit is contained in:
hhs
2026-05-24 00:01:12 +08:00
parent dda0d6927c
commit b58793f9b0
7 changed files with 1616 additions and 1 deletions
@@ -103,6 +103,26 @@ flowchart TD
style P fill:#B0C4DE
```
> [!QUESTION] 为什么是五层,不是三层或八层?
> 分层的本质是**职责分离**——每一层只关心自己该做的事,通过标准接口向上层提供服务。层数太少(如三层)会导致单层职责过重,排查问题困难;层数太多则引入不必要的抽象开销。五层是一个兼顾教学清晰度和工程实用性的"甜蜜点"。
### 三层模型横向对比
下面的表格将三种模型放在同一张表里,方便你快速查清某一层在不同模型中的对应关系:
| 功能域 | OSI 层 | 五层模型 | TCP/IP 层 | 典型协议/技术 | 封装单元 |
|--------|--------|----------|-----------|---------------|----------|
| 应用逻辑 | 7 应用层 | 应用层 | 应用层 | HTTP, DNS, SMTP, SSH | Data |
| 数据表示 | 6 表示层 | ↗ | ↗ | TLS/SSL, JPEG, ASN.1 | Data |
| 会话管理 | 5 会话层 | ↗ | ↗ | NetBIOS, RTP, SIP | Data |
| 端到端传输 | 4 传输层 | 传输层 | 传输层 | TCP, UDP, SCTP | Segment |
| 路由寻址 | 3 网络层 | 网络层 | 网络层 | IP, ICMP, ARP | Packet |
| 帧传输 | 2 数据链路层 | 链路层 | 网络接口层 | Ethernet, Wi-Fi, PPP | Frame |
| 物理信号 | 1 物理层 | ↗ | ↗ | 光纤, 双绞线, 无线电 | Bit |
> [!tip] ↗ 符号的含义
> 上表中 ↗ 表示"向上合并"——五层模型把 OSI 的表示层、会话层并入应用层;TCP/IP 模型进一步把数据链路层、物理层合并为网络接口层。**合并不等于消除**,这些功能仍然存在,只是不再单独成层。
## 数据包逐层穿越过程
以你发送一封电子邮件为例:
@@ -132,6 +152,46 @@ sequenceDiagram
> [!tip] 封装 = 套娃;解封装 = 剥壳
> 每一层只知道自己那一层的 header 是什么格式,对其他层的内容一无所知。这就是**层间透明**原则。
> [!QUESTION] 如果每一层都要加头部,开销岂不是很大?
> 没错。一个 1 字节的应用层数据,经过 TCP/IP/以太网三层封装后,可能膨胀到 50+ 字节(TCP 头 20B + IP 头 20B + 以太网帧头帧尾 18B)。这就是为什么对小数据量、低延迟场景,业界会选择 **UDP**(头部仅 8 字节)甚至 **QUIC**(合并传输层与加密层)来减少开销。
## 分层在代码中的体现
理解分层模型,不只是为了面试,它直接影响你在编程中需要关心什么、不需要关心什么:
```go
package main
import (
"fmt"
"net"
)
func main() {
// 传输层:你只需告诉 OS "用 TCP 连这个地址"
// IP 路由、以太网帧封装、物理信号 —— 全部由内核和网卡处理
conn, err := net.Dial("tcp", "example.com:80")
if err != nil {
panic(err)
}
defer conn.Close()
// 应用层:你手动构造 HTTP 请求(Data 层的内容)
request := "GET / HTTP/1.1\r\nHost: example.com\r\n\r\n"
conn.Write([]byte(request))
// 读取应用层响应 —— 下面的 Segment/Packet/Frame 已被内核剥壳
buf := make([]byte, 4096)
n, _ := conn.Read(buf)
fmt.Println(string(buf[:n]))
}
```
这段代码里,程序员只和**应用层**(HTTP 报文)与**传输层**(`Dial("tcp", ...)`)打交道。网络层以下的路由、帧封装、电信号转换完全由操作系统和硬件代劳——这就是分层带来的**抽象红利**。
> [!QUESTION] 如果没有分层会怎样?
> 想象一下:每次发 HTTP 请求,你都要手动计算 IP 校验和、填写 MAC 地址、调制电信号……代码量和出错率会指数级上升。分层让我们可以**只关注自己那一层**,其余的交给下层实现。
## 关联笔记
- [[hhs/NETWORK/02-以太网帧结构]] — 链路层帧的详细结构