认识数据链路层(二)

二、链路层的三个基本问题

DLL协议有很多种,但三个基本问题相同

  1. 封装成帧
  2. 透明传输
  3. 差错检测

1、 封装成帧

何为封装成帧

封装成帧 (framing)就是在一段数据的前后分别添加首部和尾部,然后就构成了一个帧。确定帧的界限。
首部和尾部的一个重要作用就是进行帧定界

在这里插入图片描述
为了让计算机能准确识别出帧的首尾,需要对帧的首部和尾部进行特殊的标识,第一种方法是采用控制字符的方法来进行帧定界,如使用控制字符SOH标识帧的首部(其二进制为00000001),EOT标识帧的尾部(其二进制为00000100)

SOH表示start of head;EOT表示end of tail

用控制字符进行帧定界

在这里插入图片描述

帧定界符的作用

判定帧是否完整

这样,当每次扫描二进制编码为00000001时代表是一个帧的首部,而扫描到00000100则为一个帧的尾部。当数据在传输中出现差错时,帧定界符的作用更加明显,如果没有连续出现的帧起始和结束标志就可以认为是一个错误的帧

引入控制字符后出现的问题

虽然引入了SOH和EOT后,完成了帧定界的工作,但会引入一个新的问题,因为我们无法保证帧的数据部分不出现SOH和EOT的情况,一旦出现,会引发帧定界出错的情况

在这里插入图片描述

2、透明传输

所谓的透明传输就是无论帧的数据部分有没有出现帧定界符,我们总能正确地识别出一个完整的帧

采用字节填充法实现透明传输
  1. 发送端的数据链路层在数据中出现控制字符“SOH”或“EOT”的前面插入一个转义字符“ESC”(其十六进制编码是 1B,二进制编码为00011011);

  2. 如果转义字符也出现数据当中,那么应在转义字符前面插入一个转义字符。当接收端收到连续的两个转义字符时,就删除其中前面的一个。

在这里插入图片描述

接收端如何处理接收到的帧

(1)首先进行帧定界,找到第一个SOH,并且其前面没有ESC,则为帧的起始;找到最后一个EOT,并且其前面没有ESC,则为帧的结束;

(2)扫描帧的数据部分,碰到SOH或EOT前面有ESC,则将ESC删去;碰到两个ESC则删去一个,保留一个

3、差错检测

为什么会产生差错?

  • 在传输过程中可能会产生比特差错:1 可能会变成 0 而 0 也可能变成 1。
  • 在一段时间内,传输错误的比特占所传输比特总数的比率称为误码率 BER (Bit Error Rate)。
  • 误码率与信噪比有很大的关系。反比
  • 为了保证数据传输的可靠性,在计算机网络传输数据时,必须采用各种差错检测措施。
差错检测与差错控制的关系

两者是截然不同的概念,差错检测的功能比差错控制要弱很多,差错检测仅仅是判断一个数据是否有错误,而不能判断是哪一位出了错误

  • 差错检测:奇偶校验码
  • 差错控制:海明码
数据链路层的差错检测方法
奇偶检验方法

奇偶检验的工作原理是在一个二进制数据流的后面增加一位奇偶检验位,保证数据流1的个数为奇数

奇偶检验实例:

原始的数据为“0011011”,一共7位,并且1的个数为偶数,那么经过添加奇偶检验位后,数据变为“00110111”
如果接收端扫描数据发现1的个数不是奇数个,则认为收到的数据有误;如果是奇数个则代表正确。

奇偶检验方法的缺点:
  • 上面的例子中,如果收到的数据是“11011100”,也发现不了错误
  • 奇偶检验是一种非常简单和检测精度是非常有限的方法
    原因在于:用于作检验位的位数只有一位,太少了,如果要更精确,用于检验的位数要更多。

差错检测一般会在原始数据的后面添加一些冗余位,这些冗余位可以协助来判定收到的数据是否正确。

循环冗余检验的原理
  • 在数据链路层传送的帧中,广泛使用了循环冗余检验 CRC(Cyclic Redundancy Check) 的检错技术。
  • 在发送端,先把数据划分为组。假定每组 k 个比特。
  • CRC的基本思路是在k位数据的后面加上n位冗余位,一共k+n位数据发送,这n位冗余位是通过模2除法
CRC计算举例:

假设要传送的数据是101001,一共6位,采用的除数为1101(一般会事先给定),求冗余码

  • 步骤1、得到被除数
  • 步骤2、得到除数
  • 步骤3、被除数模2除以除数得到余数
被除数

由原始要传送的数据后面添加n位0组成,n的值就是除数的位数减1,如,除数为1101,那么n=3
被除数为101001000

除数

会直接给定,有两种表示形式,一种是最直接的二进制表示方法,
如本例中的1101,另外一种是多项式表示方法,如1101可以表示为p(x)=x3+x2+1

二进制与多项式的转换示例:

  • p(x)=x4+x2+x的二进制形式为什么?
    10110
  • 11010的多项式形式是什么?
    p(x)=x4+x3+x
余数

被除数采用“模2除法”除以除数得到,其位数为n位,n的值也是除数的位数减1得到,
如本例中余数的位数应该是3

除数非常关键
除数决定了在原始数据后面添加几个0形成被除数
也决定了余数的位数

模2除法

在做除法是不进位不借位,位置相同的比特如果值相同其差就是0,而值不同其差就是1

模2除法举例

在这里插入图片描述

帧检验序列 FCS
  • 求得的余数就是冗余码,又称帧检验序列(FCS,Frame Check Sequence)
  • 循环冗余检验 CRC 和帧检验序列 FCS并不等同。
    • CRC 是一种常用的检错方法,而 FCS 是添加在数据后面的冗余码
    • FCS 可以用 CRC 这种方法得出,但 CRC 并非用来获得 FCS 的唯一方法。
求得冗余码后要传送的数据

在发送端,真正要传送的数据是原始的数据后面加上冗余码,如原始的数据为101001,计算得到的冗余码为001,那么要传送的数据为101001001。

总结:如何计算CRC冗余码

简要步骤:

  • 除数(会给定,写成二进制形式,位数决定了冗余码的位数,如除数为n位,则余数为n-1位)
  • 被除数 由原始的数据加上n-1个0组成
  • 求余数 模2除法
接收端如何做?

接收端对收到的每一帧进行CRC检验,用收到的数据帧除以同样的除数(模2除法),根据如下情况处理:

  1. 若得出的余数R等于0,则判定这个帧没有差错,就接受(accept);
  2. 若余数 R不等于0,则判定这个帧有差错,就丢弃。

注意:

  • CRC并非100%可靠
    只要经过严格的挑选,并使用位数足够多的除数 P,那么出现检测不到的差错的概率就很小很小。

  • 仅用循环冗余检验 CRC 差错检测技术只能做到无差错接受(accept)。
    “无差错接受”是指:“凡是接受的帧(即不包括丢弃的帧),我们都能以非常接近于 1 的概率认为这些帧在传输过程中没有产生差错”。
    也就是说:“凡是接收端数据链路层接受的帧都没有传输差错”(有差错的帧就丢弃而不接受)。

4、差错控制

OSI要求DLL要做到“ 可靠传输 ”(即发送什么就收到什么)就必须再加上确认重传机制。

  • 确认就是如果接收到正确的帧
  • 重传就是如果帧出现了差错或者是到了规定的期限内还没有收到

注意:确认和重传机制是绝大多数协议采用的策略。

改正差错任务由上层协议完成

由于现在的通信线路的质量大大提高,引起差错的概率大大降低,因特网广泛使用的DLL协议都不使用确认和重传机制,即不要求DLL向上提供可靠传输的服务,往往由运输层的TCP协议完成,实践证明,可以提高通信效率。

点对点协议 PPP 的三个基本问题
  • 现在全世界使用得最多的数据链路层协议是点对点协议 PPP (Point-to-Point Protocol)。
  • 用户使用拨号电话线接入因特网时,一般都是使用 PPP 协议。
  • 宽带连接中的PPPOE

用户到 ISP 的链路使用 PPP 协议
在这里插入图片描述

1. PPP 协议应满足的需求

简单——这是首要的要求
封装成帧
透明性
多种网络层协议
多种类型链路
差错检测 检错不等于纠错
检测连接状态
最大传送单元
网络层地址协商
数据压缩协商

PPP协议也应该解决数据链路层的三个基本问题,其中,差错检测仍然采用的是CRC方法,不再介绍,我们重点介绍PPP协议如何解决封装成帧和透明传输的问题。

PPP 协议的帧格式

标志字段 F = 0x7E 1个字节
地址字段 A 只置为 0xFF 1个字节
控制字段 C 通常置为 0x03 1个字节
协议字段 2个字节
首部4个字节,尾部3个字节
PPP 是面向字节的,所有的 PPP 帧的长度都是整数字节。

在这里插入图片描述
从PPP帧的格式上来看,7E为帧的首尾标志。

练习:
如果PPP帧的信息部分是IP数据报,请问该PPP帧的有效数据率最多为多少?一个PPP帧最大为多少字节?
1500/(1500+5+3)*100%=99.47%
1500+5+3=1508字节

2. 透明传输问题
  • 为了解决PPP帧的信息部分也出现7E的情况,实现透明传输,分为两种情况进行处理,一种是当PPP用在异步传输时,就使用一种特殊的字节填充法
  • 另一种是当PPP 用在同步传输链路时,采用零比特填充方法。
字节填充
  • 将信息字段中出现的每一个 0x7E 字节转变成为 2 字节序列(0x7D, 0x5E)
  • 若信息字段中出现一个 0x7D 的字节, 则将其转变成为 2 字节序列(0x7D, 0x5D)
  • 若信息字段中出现 ASCII 码的控制字符(即数值小于 0x20 的字符),则在该字符前面要加入一个 0x7D 字节,同时将该字符的编码加以改变。

例如:
若信息字段中出现了ASCII码的控制字符0X03,转变为2字节序列(0X7D,0X23)

零比特填充

首先,我们将7E转成二进制为“01111110”,这个二进制序列中有一个明显的特征,就是有连续的6个1出现,为了保证信息字段不出现7E的情况,我们在数据出现5个连续1时强行在其后面插入一个0

发送端和接收端的处理

  • 发送端,当信息字段有连续5个1时,在后面插入一个0;
  • 接收端,当信息字段连续5个1后面有一个0时,则删去一个。
    在这里插入图片描述
  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值