跳转至

分层、封装与协议

为什么需要分层

假设浏览器必须同时知道网页语义、拥塞窗口、全球路由表、无线重传和网卡电气信号,任何一次硬件更新都会迫使浏览器重写。分层的动机,就是把变化限制在局部:上层只依赖下层承诺的服务,不依赖其全部实现细节。

这里要区分三个词:

  • 协议:同一层的通信实体遵循的消息格式、顺序和动作规则。
  • 服务:下层向上层提供的能力,例如“尽力交付数据报”或“可靠有序字节流”。
  • 接口:上层使用服务的具体入口,例如 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 请求

浏览器准备发送:

GET /index.html HTTP/1.1
Host: example.com

在一个简化的 HTTP/1.1 over TCP 场景中,发送端依次做:

HTTP 报文
  -> 加 TCP 首部:源/目的端口、序号、确认等
  -> 加 IP 首部:源/目的 IP、跳数限制等
  -> 加以太网首尾部:源/目的 MAC、类型、校验等
  -> 编码成物理信号

这个过程叫封装。接收端根据首部中的类型字段逐层交付:以太网帧指出上层是 IPv4 或 IPv6,IP 首部指出上层是 TCP,TCP 的目的端口帮助操作系统找到服务器进程。这个反向过程叫解封装解复用

若暂不考虑可选字段,IPv4 首部通常至少 20 字节,TCP 首部通常至少 20 字节。应用只发送几十字节时,控制信息占比很高;发送大文件时,这些固定开销的占比下降。这说明分层带来模块化,也带来额外字节和处理成本。

每一跳都会发生什么

端系统通常处理完整协议栈;普通路由器主要查看链路层与网络层:

  1. 路由器从入链路收到一个帧并验证链路层信息。
  2. 去掉入链路帧首尾部,读取 IP 目的地址。
  3. 查询转发表,选择出接口和下一跳。
  4. 为出链路重新封装新的链路层帧。

因此,端到端 IP 数据报在途中原则上保持其网络层身份,但每一跳的链路层帧会变化。源主机看到的目的 MAC 往往只是默认网关的 MAC,而不是远端服务器网卡的 MAC。

标识符为什么有多套

标识符 作用范围 回答的问题
域名 应用与人类可读命名 想访问哪个服务名称
IP 地址 跨网络 目标接口位于哪个网络
端口号 单台主机 交给哪个进程或 Socket
MAC 地址 本地链路 这一跳交给哪个网卡

它们不是重复设计,而是在不同范围内完成不同的解复用。DNS 把域名映射到 IP;ARP 或 IPv6 邻居发现把本地下一跳 IP 解析为链路层地址。

分层的收益与代价

收益包括:

  • 可以独立替换链路技术,HTTP 不必关心底层是 Wi-Fi 还是光纤。
  • 统一的 IP 层把异构网络连接成“网络的网络”。
  • 故障可分层定位,应用错误不必先怀疑电气信号。
  • 标准接口允许不同厂商实现互操作。

代价包括:

  • 多层首部、重复校验和数据复制增加开销。
  • 严格分层可能隐藏有用信息。例如应用若完全不知道网络状况,就难以自适应码率。
  • 现实协议常跨层优化。QUIC 在用户态把可靠传输、安全握手和多路复用结合起来,就是对传统边界的一次重组。

历史与直觉

电话网更强调连接建立和网络内部状态;互联网的端到端思想倾向于把复杂可靠性放在端系统,让核心网络保持相对简单。这个选择使新应用可以在不改造所有路由器的情况下部署,但也意味着端系统必须面对丢包、乱序和安全等问题。

自测

访问异地服务器时,为什么以太网帧里的目的 MAC 通常不是服务器的 MAC?

因为 MAC 地址只服务于当前链路。源主机先把帧交给本地默认网关;路由器每经过一跳都会用新链路的地址重新封装。