数据链路层—三个基本问题

本文主要介绍数据链路层传输数据需要注意的最基本的三个问题

  当我们需要传输数据的时候,我们应该这考虑:首先,将数据封装成帧(帧是数据链路层的基本单位),考虑去怎么封装,才能让接受端识别一个完整的帧,同时接收端让所有数据都能顺利传输,而不应该受到限制导致某些数据不能传输。接着,发送端发送完数据,经过信道,有时候因为外部原因而导致帧出现变化,也就是数据发生了变化,那么这个时候我们应该怎么样去进行检测错误和处理。本文梳理出这三个基本问题出来,然后对每个问题进行详细地讨论。
1、封装成帧
这里的成帧方法参考Andrew S.Tanenbaum & David J.Wetherall著的《计算机网络》中所提到的4中方法:
(1)字节计数法
(2)字节(字符)填充法
(3)比特填充法
(4)物理层编码违禁法
第一种方法是字节计数法,具体是,利用头部的一个字段来标识该帧中的字符数。但是这个方法有一个问题,如果用来标识该帧字符数的字段在传输过程中发生了错误,那么从这个字段到后面的帧都会被弄混乱。正是由于这个原因,这个方法很少被使用,这里只是提出来让大家了解下
第二种,字节(字符填充法),网络层上的IP数据报传递给数据链路层,就变成了帧的数据部分,在数据部分的前面和后面添加首部和尾部,就构成了一个完整的帧。(我们所说的帧的长度,就是数据部分+首部+尾部的长度)。那么我们为什么要添加首部和尾部呢,其主要目的就是帧定界,确定这个帧的界限。由于首部和尾部不是我们想要的数据部分,所以为了提高传输效率,我们应该尽可能地让数据部分大于首部和尾部。同时,协议也定义了最大数据部分长度——最大传送单位MTU(Maximum Transfer Unit)。在字节填充法中,帧定界使用的是特殊的帧定界符。一个SOH(Start Of Header)作为帧的开头,另外一个是EOT(End Of Transmission),作为帧的结尾。这里所提到的SOH和EOT都只是这两个控制字符的名称,而不是S、O、H(或者是E、O、T)三个字符。SOH的十六进制编码是01(二进制编码是00000001),EOT的十六进制编码是04(二进制编码是00000100)。了解了首尾的两个标记之后,我们可以想到的是,在IP数据报(也就是帧的数据部分)可能会存在和SOH和EOT相同格式的数据,那么这个时候就会出现问题,接受方就会错误地将和SOH以及EOT格式相同的数据当做帧定界面。要解决这个问题,就在与SOH和EOT相同格式的数据前面加上一个转义字符“ESC”(其十六进制编码是1B,二进制是00011011),同样,如果转义字符要是出现在了数据中,那么就在转义字符前面再加一个转义字符。接收方在接受的时候将第一个转义字符给删除掉就好了。
第三种,比特填充法,这种方法是在第二种方法的思想上做了优化,第三种方法考虑到第二种方法的缺点,也就是只能使用8比特的字节作为帧的界定符。在比特填充法中,每个帧的开始和结束由一个特殊的比特模式(被称为FLAG)来标记,01111110(十六进制就是0x7E)。然后在IP数据报(也就是帧的数据部分),每当遇到了5个1就在后面填充一个比特0。可想而知,这样的话,那么数据中就不可能存在和FLAG同样的格式。这种方法是为HDLC(高级数据链路控制)协议开发的,USB(通用串行总线)采用了比特填充技术。
第四种,是在物理层思考,找到一种捷径来处理问题,在比特编码成信号的通常包括一些冗余的比特,是用来帮助接收器同步接受的。那么这些冗余的数据是不会出现在常规数据中的。第四种方法就是利用这些冗余的比特来表示帧的开始和结束。
然后,很多数据链路层的协议为了安全起见,并不是单纯使用了其中一种方法,我们可以看出来,除了第一种,其他的方法都是有各自的优点的,所以协议都是综合了这。以太网和802.11(无线网络)使用了共同的分界模式,也就是使用了一个规定好的比特模式来作为帧的开始,这个比特模式被称为前导码(preamble)

2、透明成帧

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值