Layering 思考记录
背景
在学习 Computer Network 时接触到网络分层模型:
flowchart TD App["Application Layer"] --> Trans["Transport Layer"] --> Net["Network Layer"] --> Link["Link Layer"] --> Phys["Physical Layer"]
同时在其他领域也发现类似结构:
操作系统:
flowchart TD App["Application"] -->|System Call Interface| Kernel["Kernel"] Kernel --> Hardware["Hardware"]
编程语言:
flowchart TD App["Application Code"] --> Runtime["Runtime"] Runtime --> Code["Machine Code"] Code --> HW["Hardware"]
因此产生疑问:
为什么计算机系统喜欢分层?
Q1:为什么需要分层?
初始疑问
为什么不直接让应用程序访问底层?
例如:
应用程序直接操作:
- 网卡
- CPU
- 内存
- 磁盘
是否更直接?
思考过程
如果没有分层:
flowchart TD App["Application"] --> HW["Hardware"]
应用程序需要了解:
- 硬件细节
- 通信协议
- 资源管理方式
导致:
- 复杂度巨大
- 不同硬件无法兼容
- 修改成本高
结论
分层通过增加抽象边界降低复杂度。
flowchart TD App["Application"] -->|Layer Interface| Lower["Lower Layer"]
Q2:分层和抽象是什么关系?
疑问
分层是不是另一种抽象?
思考
抽象:
关注:
隐藏什么细节?
例如:
Socket 隐藏 TCP/IP 实现。
分层:
关注:
如何组织多个抽象?
例如:
flowchart TD App["Application"] --> Trans["Transport"] --> Net["Network"] --> Link["Link"]
每一层:
- 使用下一层服务
- 向上一层提供接口
结论
关系:
flowchart TD Abs["Abstraction (抽象)"] --> IF["Interface (接口)"] IF --> Lay["Layering (分层)"]
抽象产生层。
接口连接层。
Q3:为什么每层只关心自己的职责?
疑问
为什么 TCP 不需要知道网卡如何工作?
为什么应用程序不用知道 IP 如何路由?
思考
每层都有自己的责任:
Application:
用户需求
Transport:
进程间通信
Network:
主机间通信
Link:
链路传输
结论
分层原则:
每一层只依赖下一层提供的服务,而不关心具体实现。
Q4:分层是否完全隔离?
疑问
既然分层隐藏细节,上层是否永远不用了解底层?
思考
正常情况:
flowchart TD App["Application"] -->|Interface| Impl["Implementation"]
但是:
性能问题时:
- 延迟
- 内存
- 网络质量
需要了解底层行为。
例如:
开发高性能网络程序时,需要理解:
- TCP 拥塞控制
- 内核缓冲区
- 网络延迟
结论
抽象不是消除底层。
而是默认隐藏底层。
必要时可以穿透抽象。
Q5:为什么网络模型不是严格物理结构?
疑问
Internet 是否真的按照:
flowchart TD App["Application"] --> Trans["Transport"] --> Net["Network"] --> Link["Link"]
分开实现?
思考
现实设备可能同时包含:
- 路由功能
- 防火墙
- NAT
- AP
硬件边界和模型边界不同。
结论
分层描述的是:
功能角色
=
逻辑结构
不是:
物理设备结构
Q6:分层有什么优点?
1. 降低复杂度
每层只处理自己的问题。
2. 易于替换实现
例如:
flowchart TD App["Application"] -->|Socket Interface| TCP["TCP"]
可以替换:
flowchart TD TCP["TCP"] -.->|替换为| UDP["UDP"]
上层接口不变。
3. 促进标准化
不同厂商实现只需要遵守接口。
最终理解
分层(Layering):
将复杂系统拆分为多个具有明确职责的抽象层,每层通过接口与其他层交互,从而降低复杂度并支持独立演进。
核心模型
flowchart TD LN["Layer N (上层)"] -->|Interface| LN1["Layer N-1 (中间层)"] LN1 -->|Interface| LN2["Layer N-2 (下层)"]
每层:
- 提供服务
- 使用服务
- 隐藏实现