【计算机网络】[特殊字符] 408高频考点 | 数据链路层组帧:从字符计数到违规编码,一文学透四大实现方法

文章主题

导读

大家好,很高兴又和大家见面啦!!!

在上一篇内容中,我们初步探索了数据链路层的基本功能和核心作用 。数据链路层作为网络体系结构中的关键一环,不仅负责将物理层提供的原始比特流组织成有意义的传输单元,还要确保数据在相邻节点间高效、可靠地传输

今天,我们将深入探讨数据链路层的一个基础且至关重要的技术------组帧Framing)。

简单来说,组帧就是为网络层下发的数据包"穿上外衣",添加必要的首部和尾部,形成数据链路层能够识别和处理的传输单元。这个过程之所以必不可少,是因为它解决了通信中的一个根本问题:

  • 接收方如何从连续的比特流中准确地判断一个数据帧从哪里开始,到哪里结束(即帧定界),并确保无论数据内容如何,都能被无误地传输(即透明传输)。

理解了组帧,你就能明白数据链路层是如何为上层提供一条看似无差错的数据通道的。现在,让我们一同揭开这项关键技术的面纱。

一、定义

组帧Framing )是指将来自网络层的分组(数据报)添加首部和尾部,封装成一个帧的过程。这个帧是数据链路层的数据传输单元。

在通信的过程中,发送方会依据一定的规则将网络层递交的分组封装成帧,并以其为传输单位进行传输。这是为了保证在出错时只需要重发错的帧,而不必重发全部数据,从而提高传输效率。

组帧主要解决帧定界帧同步透明传输等问题。实现组帧的方法通常有以下4种:

  • 字符计数法
  • 字节填充法
  • 零比特填充法
  • 违规编码法

接下来我们来逐一了解这四种组帧法;

二、字符计数法

2.1 定义

字符计数法 是指在帧首部使用一个计数字段来记录该帧所含的字节数(包括计数字段自身所占用的1字节)。
组帧 计数字段 0000 0111 数据部分 0000 0000 0000 0001 0000 0010 0000 0011 0000 0100 0000 0101

就如上图所示的组帧,其数据部分总共有 6 个字节的数据,但是通过字符计数法进行组帧时,该计数字段所记录的字节数为 7。这是因为字符计数法中的计数字段所记录的帧的总字节数为:

帧的总字节数 = 计数字段的 1 字节 + 数据部分的总字节数 帧的总字节数 = 计数字段的1字节 + 数据部分的总字节数 帧的总字节数=计数字段的1字节+数据部分的总字节数

当接受方读取帧首部的字节字数值时,就知道后面跟随的字节数,从而确定帧结束位置。因为在传输过程中,帧与帧之间时连续传输,所以也能确定下一帧的开始位置。

2.2 局限性

当我们使用该方法进行组帧时,就需要面临一个最大的问题:

  • 当计数字段出错时,就会造成灾难性的后果

这是因为在字符计数法中,计数字段除了记录该帧的字节总数,同时他还是帧边界划分的依据:
组帧 计数字段 5 数据部分 4 5 6 7 组帧 计数字段 5 数据部分 0 1 2 3

当计数字段出错时,接收方就无法准确判断帧的结束位置以及下一帧的起始位置:
组帧 计数字段 5 数据部分 4 5 6 7 组帧 计数字段 3 数据部分 0 1 2 3

就如上图所示,当第一帧中的计数字段因为错误而导致其记录的字节数从 5 变成 3 时,原先作为数据的字节,就会被误识别为计数字段。因此该组帧方法的健壮性是比较差的。

三、字节填充法

3.1 定义

字节填充法 是指使用特定字节来定界一帧的开始与结束
组帧 SOH:0000 0001 数据部分 EOT:0000 0100

如上所示,控制字符 SOH (Start Of Header ) 放在帧的最前面,表示帧的开始;控制字符 EOT (End Of Transmission) 放在帧的最后面,表示帧的结束。

不管是 SOH 还是 EOT ,其都有特定的二进制序列:

  • SOH = 0000 0001
  • EOT = 0000 0100

因此当接收方识别到 0000 0001 时,就找到了该帧的开头;当识别到 0000 0100 时,就找到了帧的结尾;

3.2 字节填充

正因为 SOHEOT 有特定的二进制序列,那么当数据部分中同时存在该序列时,就会导致接收方识别错误;

为了防止帧的数据部分中存在的 SOHEOT 不被识别为帧的首尾定界符 ,因此发送方会在数据部分的特殊字符前填充一个转义字符 ESC (Escape Character) 来加以区分,以实现数据的透明传输。

SOHEOT 一样,ESC 同样有特定的二进制序列:

  • ESC = 0001 1011

接收方在数据部分识别到该序列时,就知道后面紧跟的特殊字符为数据信息,而不是控制信息。

同理,当数据部分本身就含有该序列时,发送方也会在该序列前再加一个转义字符:
组帧 SOH 数据部分 ESC SOH ESC ESC ESC EOT EOT

如上图所示,只要是出现在数据部分的特殊字符,在进行数据传输时,发送方都会在其特殊字符前再填充一个转义字符,用以告诉接收方当前的特殊字符为数据内容。

四、零比特填充法

4.1 定义

零比特填充法 指的是用一个特定的比特串 01111110 来标志一帧的开始与结束。
组帧 01111110 数据部分 01111110

如上图所示,该方法同样通过特殊的二进制序列来标志帧的开始和结束,正因如此,该方法同样存在与 字节填充法 相同的问题:

  • 数据部分包含该特殊序列

但是在 零比特填充法 中对该问题的处理与 字节填充法 的处理并不相同;

4.2 零比特填充

零比特填充法 中,为了使数据部分的二进制序列 01111110 不被识别为帧的首尾标志,发送方会在发送数据之前,先对其进行一次扫描,每当扫描到连续的 51 时,就会自动在其后填充一个 0
组帧 01111110 数据部分 0000 0000 0000 0000 0111 11 0 10 1111 1 0 101 01111110

如上图所示,当数据部分中存在连续的 51 时,就会在其后面填充一个 0 ,这样就可以保证数据部分不会出现连续的 61 ,自然也就规避了 0111 1110 的识别错误。

而接收方在接收数据时,每当在数据部分识别到了连续的 51 就会自动删除后面紧跟的 0 ,以恢复原始数据。

在数据链路层早期使用的 HDLC 协议和现在广泛使用的 PPP 协议均使用的是 零比特填充法

该方法很容易由硬件实现,其性能优于字节填充法

五、违规编码法

违规编码法 指的是通过违规编码序列来定界帧的起始与终止

该编码方法需要物理层的配合,如物理层采用的是 曼彻斯特编码 ,即每个码元中间都会发送电平的跳变:

  • 高电平跳变到低电平,即码元中间发生下跳时,表示数据比特 1
  • 低电平跳变到高电平,即码元中间发生上跳时,表示数据比特 0

而对于该编码法而言,当某个码元中间未发送跳变时,则该码元的编码方式是 违规的 ,此时我们将这种违规的编码插入到数据的开头与结尾,就可以作为帧的起始和终止。

局域网 IEEE 802 标准就采用了这种方法。

违规编码法不采用任何填充技术便能实现数据的透明传输,但只适用于采用冗余编码的特殊编码环境。

因为 字符计数法 中计数字段的脆弱性和 字节填充法 实现上的复杂性与不兼容性,所以目前常用的组帧方法是零比特填充法违规编码法

结语

通过本文的探讨,我们了解到组帧是数据链路层的一项核心任务,其目的是将网络层的数据包封装成帧,实现高效可靠的数据传输。

核心要点总结

🔷 组帧的核心价值

  • 为网络层数据包添加首部和尾部,形成传输单元

  • 实现错误时单帧重传,提升传输效率

  • 解决帧定界、帧同步与透明传输等关键问题

🔷 主流组帧方法比较

  • 零比特填充法:使用 01111110 定界,通过"遇5个 10"规则实现透明传输

    • ✅ 硬件实现简单,性能优越
    • ✅ 被HDLC、PPP等协议广泛采用
  • 违规编码法:利用物理层违规序列定界

    • ✅ 无需填充即可透明传输
    • ⚠️ 适用于特定编码环境(如IEEE 802标准

技术价值

掌握不同的组帧方法,特别是理解帧定界与透明传输的实现机制,是深入理解数据链路层工作原理的重要基础。

互动与分享

  • 点赞👍 - 您的认可是我持续创作的最大动力

  • 收藏⭐ - 方便随时回顾这些重要的基础概念

  • 转发↗️ - 分享给更多可能需要的朋友

  • 评论💬 - 欢迎留下您的宝贵意见或想讨论的话题

感谢您的耐心阅读! 关注博主,不错过更多技术干货。我们下一篇再见!

相关推荐
遇印记2 小时前
蓝桥java蜗牛
java·学习·蓝桥杯
格鸰爱童话2 小时前
next.js学习——react入门
学习·react.js·node.js
njsgcs2 小时前
tekla 使用笔记 切管 分割指定长度的管
笔记·tekla
B0URNE2 小时前
【Unity基础详解】Unity3D全程学习路线
学习·unity·游戏引擎
奋斗的牛马2 小时前
OFDM理解
网络·数据库·单片机·嵌入式硬件·fpga开发·信息与通信
忧郁的橙子.3 小时前
一、Rabbit MQ 初级
服务器·网络·数据库
蒙奇D索大4 小时前
【算法】 递归实战应用:从暴力迭代到快速幂的优化之路
笔记·考研·算法·改行学it
9ilk4 小时前
【仿RabbitMQ的发布订阅式消息队列】 ---- 功能测试联调
linux·服务器·c++·分布式·学习·rabbitmq
('-')4 小时前
《从根上理解MySQL》第一章学习笔记
笔记·学习·mysql