Keyboard shortcuts

Press ← or → to navigate between chapters

Press ? to show this help

Press Esc to hide this help

协议分层与封装

复习

  • 以太网:规定了有线局域网的帧格式与接入方式
  • 交换机:通过转发表把帧定向送到目的端口
  • 无线网络:无线接入点协调设备发送,应对隐藏节点

TL;DR

  • 分层把通信问题拆成可协作的职责
  • 封装让每层为数据加上自己的控制信息
  • 每层只需遵守与邻层的接口,复杂系统才能演进

正文

  一路走来,我们已经攒下了不少零件:信号、帧、MAC 地址、交换机、校验……它们各自解决一个小问题。可如果每个应用都要自己从头实现这一整套,那也太累了。

  于是自然的想法是:把它们按职责分层,每层只做自己那一份事。

一层一层,各管一段

  比较经典的分层大致是这样:

  • 物理层负责传信号
  • 链路层在本地交付帧
  • 网络层负责跨网络寻路
  • 传输层把数据交给正确的程序
  • 应用层描述具体的服务

  每层都对上层提供一组接口,对下层提出一些要求。它不关心里面具体怎么实现,只关心“我交给你,你能替我办成”。这正是我们反复用到的那句话:加一层,把复杂留给自己,把简单留给别人。

封装:每层都加个信封

  分层怎么真正落地?靠封装(encapsulation)。

  发送时,应用数据先被加上传输层首部,再加上网络层首部,最后加上链路层首部,像套娃一样一层层包起来;接收时再按相反的顺序,一层层拆开。

  每一层的首部,都只装着这一层需要的信息:传输层关心“给哪个程序”,网络层关心“去哪个网络”,链路层关心“这一跳交给谁”。各取所需,互不越界。

为什么分层能扛住演进

  分层的最大好处,是让变化被限制在局部。想换一种链路(比如从有线换成无线),只要链路层的接口不变,上层几乎不必改动;想加一种新应用,也不必重写底层的信号与帧。

  这正是复杂网络还能持续演进的原因。后面我们会看到,网络层的地址怎么设计、路由怎么找、IP 和 MAC 又怎样配合——它们都建立在这套分层与封装的地基上。

思考题 1

为什么网络层数据每经过一跳,链路层帧通常要重新包装?

思考题 2

分层和封装,各自解决了什么问题?它们是一回事吗?

小结

知识点

  • 分层隔开职责,封装携带每层所需的控制信息
  • 每层只需遵守与邻层的接口
  • 分层把变化限制在局部,便于系统演进

参考资料

  1. Wikipedia(zh):OSI模型:把网络通信划分为多层的参考模型
  2. Wikipedia(zh):网络协议:通信双方共同遵守的规则约定

思考题答案(仅供参考)

思考题 1

  下一段链路可能使用不同介质和不同的 MAC 地址,旧的帧只适用于上一段本地交付。所以每经过一跳,链路层帧都要按当前链路重新包装,而网络层的数据包地址保持不变,负责端到端的方向。

思考题 2

  不是一回事。分层解决的是“把大问题拆成小职责”,让各层独立;封装解决的是“每层的信息怎么安放”,让数据带着必要的控制信息逐层流转。分层是组织结构,封装是数据形态,两者配合才能让整套协议运转起来。

协议

  本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。

封面图

设计师 | 南国微雪