《计算机网络》深入学:组帧

在计算机网络的世界里,物理层像是一个不知疲倦的搬运工,它只负责传输比特流(0 和 1),却并不关心这些比特代表什么意义。

数据链路层(Data Link Layer) 的核心任务之一,就是把这些散乱的比特流"打包"成一个个有意义的单元,这个单元就是帧(Frame) 。这个过程,我们称为组帧(Framing)封装成帧

这就好比寄快递:物理层是传送带,数据链路层则是把物品装进纸箱、封好胶带、贴上快递单的过程。只有装箱了,接收方才知道哪里是一件货物的开始,哪里是结束。

一、 为什么需要组帧?

组帧主要解决两个核心问题:

  1. 帧定界(Frame Delimitation)
    接收方如何从连续不断的比特流中区分出哪一段是第一帧,哪一段是第二帧?必须要有明确的界限。
  2. 透明传输(Transparent Transmission)
    这是组帧最难理解也最重要的概念。
    • 问题:如果数据中恰好出现了和"帧定界符"(比如结束标记)一模一样的比特组合,接收方会不会误以为帧传输结束了?
    • 目标:无论上层传下来什么样的数据(文本、图像、可执行文件),数据链路层都能原封不动地传输,不会被误判。

为了解决这两个问题,网络先驱们发明了四种经典的组帧方法。

二、 组帧的四种"招式"

1. 字符计数法 (Character Count)

这是最古老的方法。原理很简单:在帧的头部使用一个特定的字段,来记录这个帧一共有多少个字节。

  • 原理 :帧头第一个字节是 5,说明包括这个字节在内,本帧共有 5 个字节。接收方读到 5,就往后数 4 个字节,结束。
  • 致命缺陷 :如果这个"计数字节"在传输中出错了(例如 5 变成了 3),接收方就会弄错帧的结束位置,进而导致后面所有的帧都无法正确识别(同步丢失)。

由于其脆弱性,现代计算机网络已基本淘汰该方法。

2. 字符填充法 (Byte Stuffing / Character Stuffing)

这种方法常用于以字节为单位传输的协议(如 PPP 协议)。

  • 原理
    • 用特定的控制字符来定界。例如:SOH (Start of Header) 表示开始,EOT (End of Transmission) 表示结束。
  • 透明传输的实现
    • 如果数据中真的出现了 EOT 怎么办?
    • 发送方 :在数据中的控制字符(如 EOT 或转义字符本身 ESC)前面,插入一个转义字符 (ESC)
    • 接收方 :看到 ESC,就知道后面的那个字节是真数据,不是控制指令,把它留下来,把 ESC 删掉。

3. 零比特填充法 (Zero-Bit Stuffing) ------ ★ 重点

这是高级数据链路控制协议(HDLC)采用的方法,它不处理字节,而是处理比特流,非常灵活。

(1) 核心规则
  • 帧定界符(Flag) :使用一个特殊的比特模式 01111110(十六进制 7E)作为帧的开始和结束标记。
  • 发送方规则(5 "1" 填 0)
    只要在数据负载中扫描到连续的 5 个 1 ,立即在后面插入一个 0
    • 例如:数据 0111111 -> 发送 01111101
    • 目的:确保数据中永远不会出现连续的 6 个 1,从而与 Flag (01111110) 区分开。
  • 接收方规则(5 "1" 删 0)
    接收方检测数据流,当发现连续 5 个 1 时,检查下一位:
    • 如果是 0 :说明是填充的,删除该 0,保留数据。
    • 如果是 1 :说明是 Flag(01111110),或者是错误(01111111...)。

【例题 1】 假设网络层需要传输的二进制数据为:011011111101111100。采用零比特填充法进行组帧,请问发送到链路上的实际比特流是什么?

【解析】

  1. 先写出定界符(首尾):01111110 ... 01111110
  2. 扫描数据部分,寻找连续的 5 个 1:
    • 原数据:0110 11111 10 11111 00
    • 第一处:...0110 11111 1... -> 发现 5 个 1,后面是 1。根据规则,不管后面是啥,只要见 5 个 1 就填 0。
    • 第二处:...10 11111 00 -> 发现 5 个 1。
  3. 执行填充:
    • 第一处 11111 后加 0 -> 111110 1
    • 第二处 11111 后加 0 -> 111110 00
  4. 组合结果:
    01111110 0110 111110 10 111110 00 01111110

答案 :中间的数据部分变为 01101111101011111000

4. 违规编码法 (Physical Layer Coding Violation)

这种方法比较巧妙,它利用物理层编码的特性。

  • 背景 :在曼彻斯特编码(常用于以太网)中,每一个比特的中间都有一次电压跳变("高-低"代表 1,"低-高"代表 0)。
  • 原理
    曼彻斯特编码中,"高-高"和"低-低"电平是违规 的,物理层通常不会出现这种信号。
    既然不会出现在数据中,那我们就可以故意用"高-高"或"低-低"来定界!
  • 优点:不需要任何填充技术,效率很高。
  • 应用:IEEE 802 标准(如以太网)中广泛使用。

三、 知识点总结

为了方便记忆,我们将这四种方法整理如下表:

方法 核心手段 优点 缺点/局限 考研关注度
字符计数法 头部加长度字段 简单 错一位全盘皆输
字符填充法 特殊字符定界 + ESC转义 兼容性好 依赖字符集 (ASCII),处理复杂 ★★★
零比特填充法 Flag(7E) + 5个1填0 任意比特流传输,效率高 需硬件处理位流 ★★★★★
违规编码法 利用物理层非法电平 不需要填充,简单 只适用于特定物理层编码 ★★

避坑指南:

  1. MTU(最大传输单元)
    组帧时,帧的数据部分长度不能超过 MTU。这不仅仅是软件限制,更是底层硬件的要求。如果网络层数据包(IP Datagram)大于 MTU,就必须分片。
  2. 以太网的特殊性
    虽然教材上讲了四种方法,但以太网实际抓包时,你看不到"帧长度"字段(由前导码和帧间隙界定),也看不到复杂的位填充(因为它用了曼彻斯特编码或 4B/5B 编码等物理层特性)。但在做理论题时,零比特填充法是考察算法逻辑的首选。

结语

组帧是数据从抽象的比特流走向有组织的逻辑数据的第一步。理解了组帧,就理解了计算机网络中"分层"与"封装"的精髓------下一层为上一层服务,且对上一层的数据内容保持透明

相关推荐
Xの哲學16 小时前
Linux Select 工作原理深度剖析: 从设计思想到实现细节
linux·服务器·网络·算法·边缘计算
VekiSon16 小时前
综合项目实战——电子商城信息查询系统
linux·c语言·网络·http·html·tcp·sqlite3
档案宝档案管理17 小时前
权限分级+加密存储+操作追溯,筑牢会计档案安全防线
大数据·网络·人工智能·安全·档案·档案管理
携欢17 小时前
portswigger靶场之修改序列化数据类型通关秘籍
android·前端·网络·安全
yuanmenghao17 小时前
CAN系列 — (4) Radar Header 报文:为什么它是 MCU 感知周期的“锚点”
网络·单片机·自动驾驶·信息与通信
爱思德学术17 小时前
中国计算机学会(CCF)推荐学术会议-A(计算机网络):SIGCOMM 2026
计算机网络·信息与通信
Java后端的Ai之路17 小时前
【AutoDL算力平台】-MobaXterm 连接 AutoDL 并上传文件资源(图文 + 实操)
服务器·网络·mobaxterm·autodl算力平台
阿巴~阿巴~17 小时前
NAT技术:互联网连接的隐形桥梁
服务器·网络·网络协议·架构·智能路由器·nat·正反向代理
DevOps-IT17 小时前
HTTP状态码(常见 HTTP Status Code 查询)
运维·服务器·网络·网络协议·http