分层、封装与协议¶
为什么需要分层¶
假设浏览器必须同时知道网页语义、拥塞窗口、全球路由表、无线重传和网卡电气信号,任何一次硬件更新都会迫使浏览器重写。分层的动机,就是把变化限制在局部:上层只依赖下层承诺的服务,不依赖其全部实现细节。
这里要区分三个词:
- 协议:同一层的通信实体遵循的消息格式、顺序和动作规则。
- 服务:下层向上层提供的能力,例如“尽力交付数据报”或“可靠有序字节流”。
- 接口:上层使用服务的具体入口,例如 Socket API。
协议像两家快递网点之间的作业规范,服务像它们向顾客承诺的寄送能力,接口则是下单柜台。顾客不必知道每个中转站如何排班,但必须知道服务是否保价、是否限重。
TCP/IP 与 OSI 模型¶
OSI 七层模型提供细致的概念词汇,互联网工程更常用四层或五层 TCP/IP 模型:
| TCP/IP 五层 | 代表协议或技术 | 核心职责 | 常见数据单位 |
|---|---|---|---|
| 应用层 | HTTP、DNS、SMTP | 定义应用消息语义 | 报文 |
| 传输层 | TCP、UDP、QUIC | 进程到进程的交付 | 段或数据报 |
| 网络层 | IPv4、IPv6、ICMP | 跨网络寻址与转发 | IP 数据报 |
| 链路层 | Ethernet、Wi-Fi | 同一链路上的一跳交付 | 帧 |
| 物理层 | 光纤、双绞线、无线电 | 传输比特信号 | 比特 |
OSI 的会话层和表示层功能没有消失,而是常由应用库承担,例如 TLS 的编码与加密、RPC 框架的序列化。模型是理解工具,不是要求现实系统严格分成五个软件模块。
最小完整例子:发送一个 HTTP 请求¶
浏览器准备发送:
在一个简化的 HTTP/1.1 over TCP 场景中,发送端依次做:
这个过程叫封装。接收端根据首部中的类型字段逐层交付:以太网帧指出上层是 IPv4 或 IPv6,IP 首部指出上层是 TCP,TCP 的目的端口帮助操作系统找到服务器进程。这个反向过程叫解封装与解复用。
若暂不考虑可选字段,IPv4 首部通常至少 20 字节,TCP 首部通常至少 20 字节。应用只发送几十字节时,控制信息占比很高;发送大文件时,这些固定开销的占比下降。这说明分层带来模块化,也带来额外字节和处理成本。
每一跳都会发生什么¶
端系统通常处理完整协议栈;普通路由器主要查看链路层与网络层:
- 路由器从入链路收到一个帧并验证链路层信息。
- 去掉入链路帧首尾部,读取 IP 目的地址。
- 查询转发表,选择出接口和下一跳。
- 为出链路重新封装新的链路层帧。
因此,端到端 IP 数据报在途中原则上保持其网络层身份,但每一跳的链路层帧会变化。源主机看到的目的 MAC 往往只是默认网关的 MAC,而不是远端服务器网卡的 MAC。
标识符为什么有多套¶
| 标识符 | 作用范围 | 回答的问题 |
|---|---|---|
| 域名 | 应用与人类可读命名 | 想访问哪个服务名称 |
| IP 地址 | 跨网络 | 目标接口位于哪个网络 |
| 端口号 | 单台主机 | 交给哪个进程或 Socket |
| MAC 地址 | 本地链路 | 这一跳交给哪个网卡 |
它们不是重复设计,而是在不同范围内完成不同的解复用。DNS 把域名映射到 IP;ARP 或 IPv6 邻居发现把本地下一跳 IP 解析为链路层地址。
分层的收益与代价¶
收益包括:
- 可以独立替换链路技术,HTTP 不必关心底层是 Wi-Fi 还是光纤。
- 统一的 IP 层把异构网络连接成“网络的网络”。
- 故障可分层定位,应用错误不必先怀疑电气信号。
- 标准接口允许不同厂商实现互操作。
代价包括:
- 多层首部、重复校验和数据复制增加开销。
- 严格分层可能隐藏有用信息。例如应用若完全不知道网络状况,就难以自适应码率。
- 现实协议常跨层优化。QUIC 在用户态把可靠传输、安全握手和多路复用结合起来,就是对传统边界的一次重组。
历史与直觉¶
电话网更强调连接建立和网络内部状态;互联网的端到端思想倾向于把复杂可靠性放在端系统,让核心网络保持相对简单。这个选择使新应用可以在不改造所有路由器的情况下部署,但也意味着端系统必须面对丢包、乱序和安全等问题。
自测
访问异地服务器时,为什么以太网帧里的目的 MAC 通常不是服务器的 MAC?
因为 MAC 地址只服务于当前链路。源主机先把帧交给本地默认网关;路由器每经过一跳都会用新链路的地址重新封装。