当前位置: 首页 > news >正文

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

文章主题

  • 导读
  • 一、定义
  • 二、字符计数法
    • 2.1 定义
    • 2.2 局限性
  • 三、字节填充法
    • 3.1 定义
    • 3.2 字节填充
  • 四、零比特填充法
    • 4.1 定义
    • 4.2 零比特填充
  • 五、违规编码法
  • 结语

组帧

导读

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

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

今天,我们将深入探讨数据链路层的一个基础且至关重要的技术——组帧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标准

技术价值

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

互动与分享

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

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

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

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

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

http://www.dtcms.com/a/606019.html

相关文章:

  • 第一次搭建个人主页+GitHub部署全记录:HTML/CSS/JS前端实现+留言板踩坑
  • 中山中小企业网站建设做电商运营需要具备什么能力
  • 音视频课程上传、加密与播放技术详解:知识付费系统源码开发实践
  • 专业做网站的域名官网
  • 网站响应式图片切换代码网站升级建设中
  • 理解 CSS 层叠上下文与 z-index — 从一个真实案例出发
  • 盘一盘Redis的底层数据结构
  • C++_chapter15_C++重要知识点_lambda,initializer_list
  • Collections工具类
  • 国家建设执业注册中心网站字体怎么安装到电脑wordpress
  • Android16 EDLA 开机向导的锁屏设置页面,HDMI out 鼠标不显示问题分析解决
  • 基于yolov8的SAR影像目标检测系统,支持图像、视频和摄像实时检测【pytorch框架、python源码】
  • 网站做直播功能需要注册吗腾讯广告投放平台官网
  • 网站空间 阿里云北京金山办公软件股份有限公司官网
  • 大丰有做网站的爱客crm官网
  • KingBase通过exp脚本实现数据库自动备份
  • DeepSeek的入门和使用
  • 视觉进阶篇—— PyTorch 安装
  • net开发网站站长素材音效
  • 登录场景下短信验证码功能的设计与实现(Vue 2 + Element UI + Axios附完整代码)
  • SpringBoot-36-开发实战JPA的使用(一对多)@OneToMany+@ManyToOne
  • 云桌面办公系统详解:开启灵活、安全、高效的工作新纪元
  • 尚硅谷 SpringCloud03 Sentinel服务保护(限流 熔断降级)-安装启动sentinel-请求限流-限流异常处理
  • 地产网站建设wordpress建站好么
  • EVM(以太坊虚拟机)及其运行机制详解
  • 跨境电商支付全链路解析
  • Qt+C++ 混合开发架构设计:QML 与 C++ 高效通信的解耦方案及设计模式
  • 网站项目实施方案聊城手机网站建设公司
  • Rust开发之Trait 定义通用行为——实现形状面积计算系统
  • The JAVA_HOME environment variable is not defined correctly 解决方案