首页 > 其他分享 >《计算机网络微课堂》3-2 封装成帧

《计算机网络微课堂》3-2 封装成帧

时间:2024-05-26 15:11:49浏览次数:26  
标签:定界 定界符 封装 比特 比特流 计算机网络 成帧 数据 链路层

‍‍所谓封装成帧就是指数据链路层给上层交付下来的协议数据单元,添加帧头和帧尾,‍‍使之成为帧。

例如下图所示在帧头和帧尾中包含有重要的控制信息,例如‍‍这是以太网版本 2 的 MAC 帧格式,这是上层交付下来的协议数据单元,这是帧头,‍‍这是帧尾,这是点对点协议 PPP 的帧格式,这是上层交付下来的协议数据单元,这是帧头,‍‍这是帧尾。

发送方的数据链入层将上层交付下来的协议数据单元封装成帧后,还要通过物理层‍‍将构成帧的个比特转换成电信号,发送到传输媒体。‍‍那么接收方的数据链路层‍‍如何从物理层交付的比特流中提取出一个个的帧呢?例如‍‍这一串比特流是一个帧吗?这一串比特流是一个帧吗?实际上‍‍帧头和帧尾的作用之一就是帧定界。

例如这是 PPP 帧的格式,在其帧头和帧尾中‍‍各包含有一个长度为 1 字节的标志字段,其作用就是帧定界。假设发送方发送的是 PPP 帧,‍‍比特流中红色部分是帧定界标志,那么接收方的数据链路层就可以依据帧定界标志,‍‍从物理层交付的比特流中提取出一个个的帧

需要说明的是‍‍,并不是每一种数据链路层协议的帧都包含有帧定界标志。‍‍

例如这是以太网版本 2 的 MAC 帧格式,‍‍在其帧头和帧尾中并没有包含帧定界标志。那么接收方又是如何从物理层交付的比特流中‍‍提取出一个个的以太网帧?实际上以太网的数据链路层封装好 MAC 帧后将其交付给物理层,‍‍物理层会在 MAC 帧前面添加八字节的前导码,然后再将比特流转换成电信号发送‍‍。前导码中的前 7 个字节为‍‍前同步码,作用是使接收方的时钟同步,之后的 1 字节为帧开始定界符,‍‍表明其后面紧跟着的就是 MAC 帧。‍‍

另外以太网还规定了帧间间隔时间为‍‍96 比特的发送时间,因此 MAC 帧并不需要帧结束定界符,需要说明的是‍‍帧间间隔还有其他作用。‍‍我们在后续课程中再进行介绍。


接下来我们介绍透明传输的问题,‍‍透明传输是指数据链路层对上层交付的传输数据并没有任何限制,就好像数据链路层不存在一样。‍‍我们来举例说明,这是发送方数据链路层收到其上层交付的协议数据单元,给其添加帧头‍‍和帧尾,使其成为帧。‍‍为了简单起见,我们只画出了帧头和帧尾中的帧定界标志,‍‍帧定界标志也就是一个特定数值。

请大家思考一下,如果在上层交付的协议数据单元中,‍‍恰好也包含了这个特定数值,接收方还能正确接收该帧吗?‍‍回答是否定的。如图所示,接收方在收到第一个帧定界标志时,认为这是帧的开始,‍‍这并没有错误。‍‍当接收方再次接收到帧定界标志时,会误认为帧结束了

如果数据链路层不采取其他措施,来避免接收方对帧是否结束的误判,就不能称为透明传输。‍‍也就是说数据链入层对上层交付的协议数据单元有限制,其内容不能包含帧定界符,‍‍很显然这样的数据链路层没有什么使用价值。

实际上各种数据链路层协议一定会想办法来解决这个问题。‍‍例如在发送帧之前,‍‍对帧的数据部分进行扫描,每出现一个帧定界符,就在其前面插入一个转义字符,‍‍接收方数据链路层在物理层交付的比特流装提取帧,遇到第一个帧定界符时,认为这是帧的开始。‍‍当遇到转义字符时就知道其后面的一字节内容虽然与帧定界符相同,但它是数据,‍‍而不是帧定界符。

剔除转义字符后,将其后面的内容作为数据继续提取,‍‍对于这个转义字符也是相同的处理。‍‍当再次提取到帧定界符时,表明这是帧的结束。‍‍

请大家再来思考一下这种情况。在上层交付给数据链路层的协议数据单元中,既包含了帧定界符,‍‍又包含了转义字符,应该怎么处理?

方法仍然是在发送帧之前对帧的数据部分进行扫描,‍‍每出现一个帧定界符或转义字符,‍‍就在其前面插入一个转义字符,需要说明的是转义字符是一种特殊的控制字符,‍‍其长度为一个字节,10 进制值为 27,而并不是 E、S 以及 C 这三个字符。‍‍我们刚刚介绍的是面向字节的物理链路,是用字节填充或称字符填充的方法‍‍来实现透明传输。‍‍

对于面向比特的电路,应该使用比特填充的方法来实现透明传输。例如‍‍这是某个点对点协议的帧,‍‍这是帧的数据部分,这是帧的尾部。

为了简单起见,在帧手部和尾部中‍‍仅给出了帧定界标志,而未给出其他控制字段,而帧的数据部分出现了两个帧定界标志,‍‍但它们实际上是数据,而不是帧定界。‍‍在发送前可以采用 0 比特填充法,‍‍对数据部分进行扫描,每 5 个连续的比特 1 后面就插入 1 个比特 0,‍‍这样就确保了帧定界在整个帧中的唯一性,也就可以实现透明传输。接收方的数据链路层,‍‍从物理层交付的比特流中提取帧时,将帧的数据部分中的每 5 个连续的比特 1 后面的比特 0 剔除即可。‍‍

接下来我们来做一个有关 0 比特填充的练习题,这是计算机专业考研全国统考‍‍计算机网络部分,2013 年的题 37。

题目中所给的高级数据链路控制协议 HDLC‍‍采用帧头和帧尾中的标志字段作为帧定界,旗帜为 01111110。‍‍Hdlc 为了实现透明传输,采用 0 比特填充法,也就是每 5 个连续 1 后面插入 1 个比特 0‍‍ 如下所示。因此选项 A 正确

最后还要提醒大家,为了提高帧的传输效率,‍‍应当使帧的数据部分的长度尽可能大一些。‍‍如图所示帧的数据部分的长度‍‍应远大于帧头和帧尾的程度,这样才能提高帧的传输效率。因为仅层数据链路层来看,‍‍帧的数据部分才是帧正要传输的数据,帧头和帧尾是为了实现数据链路层功能而额外添加的。‍‍当然了,考虑到差错控制等多种因素,每一种数据链路层协议都规定了帧的数据部分的长度上限,‍‍称为最大传送单元 MTU:

小结:

标签:定界,定界符,封装,比特,比特流,计算机网络,成帧,数据,链路层
From: https://www.cnblogs.com/PeterJXL/p/18213706

相关文章

  • 《计算机网络微课堂》3-5 点对点协议PPP
    本节课我们介绍点对点协议PPP。‍点对点协议,PPP是目前使用最广泛的点对点数据链路层协议。请大家想想看,‍‍一般的因特网用户是如何接入到因特网的,通常都是要通过连接到某个因特网服务提供者ISP,‍‍例如中国电信、中国联通、中国移动这三大运营商才能接入因特网。‍‍这些I......
  • 《计算机网络微课堂》3-6 媒体接入控制
    本节课我们介绍媒体接入控制的基本概念。3.6.1媒体接入控制的基本概念如图所示,这是一根同轴电缆,有多台主机连接到这根同轴电缆上,他们共享这跟传输媒体‍‍,形成了一个总线型的局域网。​​各主机竞争使用总线,随机的在信道上发送数据,如果恰巧有两个‍‍或更多的站点在同一时刻......
  • 计算机网络微课堂-课程概述
    ​​‍‍课程介绍本专栏主要是B站课程《计算机网络微课堂》的文字版,作者是湖南科技大学的老师。B站地址:https://www.bilibili.com/video/BV1c4411d7jb该课程好评如潮,包含理论课,实验课,考研真题分析课,在B站上播放量第一:​​‍‍部分......
  • c语言函数宏的封装方式有哪几种?
    在c语言开发中,出了使用函数封装代码之外,也经常使用宏来封装一些重要或简洁的代码。宏在c开发有三种:预定义宏,不带参宏,和带参数宏。通常,带参数宏也叫函数宏,函数宏,即包含多条语句的宏定义,其通常为某一被频繁调用的功能的语句封装,且不想通过函数方式封装来降低额外的弹栈压栈开销,在实......
  • Vue3实战笔记(45)—VUE3封装一些echarts常用的组件,附源码
    文章目录前言一、柱状图框选二、折线图堆叠总结前言日前使用hooks的方式封装组件,在我使用复杂的图标时候遇到了些问题,预想在onMounted中初始化echarts,在使用hooks的时候,组件没有渲染完,使用实例会出现各种各样的问题,并且在hooks中使用一些外部属性也属实遇到了些麻烦......
  • React后台管理(九)-- 页面开发前准备---Outlet布局组件封装
    文章目录前言一、组件源码+解析如下二、页面使用方式三、效果展示总结前言本文主要讲Outlet子路由渲染区域—>结构布局的封装。其中涉及的全局搜索hook函数,后面会单独拎出来讲,这期可先忽略,关注布局即可。一、组件源码+解析如下//@/layout/list/index.jsximport......
  • Vue3实战笔记(43)—Vue3组合式API下封装可复用ECharts图表组件
    文章目录前言一、封装echart图标钩子二、使用步骤总结前言接上文,已经安装好了ECharts,开始封装组件方便使用。一、封装echart图标钩子首先应用我们之前学习的钩子方式,在hooks目录下创建一个名为useECharts.js的文件,用于封装ECharts的逻辑:import{ref,onMo......
  • 计算机网络之应用层知识点总结
    6.1网络应用模型(1)应用层概述(2)网络应用模型的介绍客户/服务器(C/S)模型P2P模型6.2域名解析系统DNS(1)DNS系统介绍(2)域名(3)域名服务器(4)域名解析过程6.3文件传输协议FTP(1)文件传输协议的介绍(2)FTP服务器和用户端(3)FTP工作原理6.4电子邮件(1)电子邮件系统概......
  • Go实战全家桶之八:统一ES服务接口之通用查询嵌套查询之封装与增删改API
    开源 goweb:https://gitee.com/ichub/goweb/settings#index需求UML代码位置测试用例:func(this*TestPageEsRequestSuite)Test002_NestBoolQuery(){varreq1=Default()req1.EsShould().EsMatch("dept_name","olivere")req1.EsTerm(&q......
  • uniapp快速分享知识点,请求简单封装 登陆 ,支付 , 分享 , 短信,
    第一部份requrety请求封装 备注:关于环境配置ui选择插件安装在我的另一个帐号中前几天也经写了,这个博客就不用在写一遍了另一博客地址:https://www.cnblogs.com/ZzwWan/p/18202502module.exports=(vm)=>{//初始化请求配置uni.$u.http.setConfig((config)=>{......