【计算机网络篇】数据链路层(2)封装成帧和透明传输

2024-03-23 13:44

本文主要是介绍【计算机网络篇】数据链路层(2)封装成帧和透明传输,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

  • 🥚封装成帧和透明传输
    • 🎈封装成帧
    • 🎈透明传输
      • 🗒️面向字节的物理链路使用字节填充的方法实现透明传输。
      • 🗒️面向比特的物理链路使用比特填充的方法实现透明传输。
    • 🛸练习

在这里插入图片描述

🥚封装成帧和透明传输

🎈封装成帧

是指数据链路层给上层交付下来的协议数据单元PDU添加一个首部和一个尾部,使之成为帧在这里插入图片描述
帧的首部和尾部包含一些重要的控制信息,如下图

以太网的V2的MAC帧在这里插入图片描述
首部包含:目的地址,源地址,类型这3个字段
尾部包含:帧检查序列FCS字段,

点对点协议PPP的帧格式在这里插入图片描述
首部包含:标志,地址,控制,协议4个字段
尾部包含:帧检验序列FCS,标志2个字段

数据链路层将封装好的帧向下交付给物理层,物理层将其看作是比特流,并转换成相应的电信号发送给接收方。


为了提高数据链路层传输帧的效率,应当使帧的数据荷载的长度尽可能地大于数据链路层首部和尾部的长度
考虑到对缓存空间的需求以及差错控制等诸多因素,每一种数据链路层协议都规定了帧的数据载荷的长度上限,即最大传送单元(Maximum Transfer Unit,MTU)。例如,以太网的MTU为1500个字节在这里插入图片描述

🎈透明传输

是指数据链路层对上层交付下来的协议数据单元PDU没有任何限制,就好像数据链路层不存在一样

🗒️面向字节的物理链路使用字节填充的方法实现透明传输。

如下图
发送方的网络层交付给数据链路层的网络层协议数据单元,数据链路层为其添加一个首部和一个尾部使之封装成帧 ,为了简单起见,我们只画出了帧首部和尾部中的帧定界符,使用flag表示。
在这里插入图片描述

帧定界符是一个特殊数值。那么,如果在上层交付给数据链路层的协议数据单元中恰好也包含了这个特殊数值,接收方还能从接收到的比特流中正确提取出该帧吗,答案是不能
在这里插入图片描述
如下图,接收方在收到第一个帧定界符的时候,认为这是帧的开始
在这里插入图片描述
当接收方再次收到帧定界符时,会误认为帧结束了在这里插入图片描述
如果数据链路层不采取措施解决该问题,就不能称之为透明传输。因为数据链路层会对上层交付的协议数据单元有限制,其内容不能包含帧定界符,很显然,这样子的数据链路层没有什么应用价值。如果能够采取措施,使得数据链路层对上层交付的协议数据单元的内容没有任何限制,就好像数据链路层不存在一样,就称其为透明传输


实际上,各种数据链路层协议一定会想办法来实现透明传输

例如:在把帧交付给物理层之前,对帧的数据载荷进行扫描,每出现一个帧定界符,就在其前面插入一个转义字符。(转义字符是一种特殊的控制字符,其长度是一个字节,十进制为27,而并不是E,S,C这3个字符在这里插入图片描述
接收方的数据链路层在物理层交付的比特流中提取帧,遇到第一个帧定界符的时候,认为这是帧的开始,当遇到转移字符时就知道了其后面的1个字节的内容,虽然与帧定界符相同,但是它是数据而不是帧定界符。
在这里插入图片描述
移除转移字符后,将其后面的内容作为数据继续提取
在这里插入图片描述
在这里插入图片描述
当再次提前到帧定界符的时候,表明这是帧的结束在这里插入图片描述


还有一种情况,就是在上层交付给数据链路层的协议数据单元中,既包含了帧定界符,又包含了转义字符
这种情况应该如何处理呢
在这里插入图片描述

方法仍然是:在把帧交给物理层之前,对帧的数据载荷进行扫描,每出现一个帧定界符或转义字符,就在其前面插入一个转义字符
在这里插入图片描述

🗒️面向比特的物理链路使用比特填充的方法实现透明传输。

我们来举例说明,如下图
设某个数据链路层协议采用8个比特构成的特定位串0111 1110作为帧定界符
在这里插入图片描述

这是发送方的数据链路层封装成的一个帧,然而,在该帧的数据载荷部分,恰好包含有作为帧定界符的特定位串,发送方的数据链路层在将该帧交付给物理层进行发送之前,会扫描帧的时间载荷。只要出现5个连续的比特1,就在其后添加一个比特0
经过这种比特0填充后的数据载荷,就可以确保其不会包含帧定界符。
在这里插入图片描述

接收方的数据链路层在把数据载荷向上交给网络层之前,对数据载荷进行扫描,没当发现5个连续的比特1时,就把其后面的比特0删除,这样子就可以还原出原始的数据载荷

如下图,发送方给接收方连续发送了2个帧,每个帧的首部和尾部都有标志字段,我们称为帧定界符。接收方的数据链路层根据帧定界符,就能从一连串的比特流中,识别出一个个的帧

注意:上面介绍的字符填充法和比特填充法只是实现透明传输的一般原理性方法,各种数据链路层协议,都有其实现透明传输的具体方法,其中,有的是基于字符填充法或比特填充法,而有点没有使用这2种方法

🛸练习

在这里插入图片描述

这篇关于【计算机网络篇】数据链路层(2)封装成帧和透明传输的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/838471

相关文章

Qt中实现多线程导出数据功能的四种方式小结

《Qt中实现多线程导出数据功能的四种方式小结》在以往的项目开发中,在很多地方用到了多线程,本文将记录下在Qt开发中用到的多线程技术实现方法,以导出指定范围的数字到txt文件为例,展示多线程不同的实现方... 目录前言导出文件的示例工具类QThreadQObject的moveToThread方法实现多线程QC

SpringBoot集成EasyExcel实现百万级别的数据导入导出实践指南

《SpringBoot集成EasyExcel实现百万级别的数据导入导出实践指南》本文将基于开源项目springboot-easyexcel-batch进行解析与扩展,手把手教大家如何在SpringBo... 目录项目结构概览核心依赖百万级导出实战场景核心代码效果百万级导入实战场景监听器和Service(核心

使用Python开发一个Ditto剪贴板数据导出工具

《使用Python开发一个Ditto剪贴板数据导出工具》在日常工作中,我们经常需要处理大量的剪贴板数据,下面将介绍如何使用Python的wxPython库开发一个图形化工具,实现从Ditto数据库中读... 目录前言运行结果项目需求分析技术选型核心功能实现1. Ditto数据库结构分析2. 数据库自动定位3

pandas数据的合并concat()和merge()方式

《pandas数据的合并concat()和merge()方式》Pandas中concat沿轴合并数据框(行或列),merge基于键连接(内/外/左/右),concat用于纵向或横向拼接,merge用于... 目录concat() 轴向连接合并(1) join='outer',axis=0(2)join='o

批量导入txt数据到的redis过程

《批量导入txt数据到的redis过程》用户通过将Redis命令逐行写入txt文件,利用管道模式运行客户端,成功执行批量删除以Product*匹配的Key操作,提高了数据清理效率... 目录批量导入txt数据到Redisjs把redis命令按一条 一行写到txt中管道命令运行redis客户端成功了批量删除k

SpringBoot多环境配置数据读取方式

《SpringBoot多环境配置数据读取方式》SpringBoot通过环境隔离机制,支持properties/yaml/yml多格式配置,结合@Value、Environment和@Configura... 目录一、多环境配置的核心思路二、3种配置文件格式详解2.1 properties格式(传统格式)1.

解决pandas无法读取csv文件数据的问题

《解决pandas无法读取csv文件数据的问题》本文讲述作者用Pandas读取CSV文件时因参数设置不当导致数据错位,通过调整delimiter和on_bad_lines参数最终解决问题,并强调正确参... 目录一、前言二、问题复现1. 问题2. 通过 on_bad_lines=‘warn’ 跳过异常数据3

C#监听txt文档获取新数据方式

《C#监听txt文档获取新数据方式》文章介绍通过监听txt文件获取最新数据,并实现开机自启动、禁用窗口关闭按钮、阻止Ctrl+C中断及防止程序退出等功能,代码整合于主函数中,供参考学习... 目录前言一、监听txt文档增加数据二、其他功能1. 设置开机自启动2. 禁止控制台窗口关闭按钮3. 阻止Ctrl +

java如何实现高并发场景下三级缓存的数据一致性

《java如何实现高并发场景下三级缓存的数据一致性》这篇文章主要为大家详细介绍了java如何实现高并发场景下三级缓存的数据一致性,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 下面代码是一个使用Java和Redisson实现的三级缓存服务,主要功能包括:1.缓存结构:本地缓存:使

在MySQL中实现冷热数据分离的方法及使用场景底层原理解析

《在MySQL中实现冷热数据分离的方法及使用场景底层原理解析》MySQL冷热数据分离通过分表/分区策略、数据归档和索引优化,将频繁访问的热数据与冷数据分开存储,提升查询效率并降低存储成本,适用于高并发... 目录实现冷热数据分离1. 分表策略2. 使用分区表3. 数据归档与迁移在mysql中实现冷热数据分