自定义指令中如何避免数据和帧头一致_数据链路层

前言

在主文章里,我们已经了解到数据链路层主要解决的是数据在链路上的传输问题。
具体来说,第一,数据在传输过程中可能会引发差错。第二,用户需要数据链路层保证数据的完整性和正确性。第三,为了解决前两个问题,数据链路层必须有目的地在用来运输地数据上,添加一些额外信息。
从而,数据链路层的主要任务就变成了:
1、数据的差错检测
2、数据的可靠运输
3、对数据进行封装

一、对数据的封装

在接收到数据并开始传输之前,链路层会在数据的头部和尾部分别加上一些额外的数据,这些额外的数据分别被称作“帧头”和“帧尾”。习惯上,我们帧头、帧尾和数据统称为“”。所以数据链路层实际传输的是帧。

帧头和帧尾主要起到两个作用:界定数据的边界,以及提供某些协议所需要的信息。我们现在来简单讨论一下这两个作用。

因为链路层所接收到的数据会有不同的长度,所以有必要在帧头和帧尾里面加入一些特定的信息,让接收方可以明了一段数据是从什么地方开始,从什么地方结束的。至于具体的加入方法,有很多。例如,可以在帧头和帧尾的特定位置加入某些特定的数值。当接收方接收到这些数值时,就会自动分辨帧头和帧尾。但是值得注意的是,例子中所提到的方法只是其中一种方法,具体的实现方式很可能是多种多样的。所以不应该局限了自己的眼界。

帧头和帧尾的第二个作用,就是增加一些必要的信息。例如,链路层的某些协议可能会要求链路层在帧尾中加入一些效验码。当接收方接收到帧时,它会检测效验码中的数值,若数值与预计的不相同,则说明该帧已经出现了数据差错。

要注意,链路层在封装上帧头和帧尾时,必须注意一些相关事项。

例如,现在我们假设某一些网络的链路层封装方式和我们上上一个例子所说的一样,帧头和帧尾中加入了一些特定的数值来让接收方明了帧头和帧尾的位置。但是你却不能够保证这些数值不会被包含在数据里,毕竟计算机的数据都是二进制的形式。万一数据中出现了相同的数值,接收方很可能就会错判帧头和帧尾的位置,从而导致错误。

这引入了“透明传输”的概念:数据链路层的任何行为,不应该对它所接受到的数据本身产生限制

另一方面,从资源的利用率出发,每一个数据的长度都应该适中。太短的话,则使得数据中的帧头帧尾密度过大,浪费了有效资源。太长的话,又会导致信息差错的过多累计。为了解决这个问题,我们需要相应的数据链路层协议规定链路层在传输时的“最大传输单元( MTU )”,告知链路层数据传输的最大长度。接下来,链路层就可以依据这个标准,将过长的数据划分为较短的数据。


二、差错检测

数据在传输的过程中,可能会出现数据的差错。0 可能会变成 1,1 可能会变成 0。

为了让接收方能够检测到数据是否产生了差错,我们有必要研究差错检测技术。一般,我们检测差错所采取的方式,就是利用“差错检测码”来进行检测。这里介绍一种简单的差错检测方法——“奇偶校检位”。

一个帧必然是由二进制的 0 和 1 构成的。那么一个帧必然含有偶数个 1 或者奇数个 1。如果发送方在发送数据时,能够将帧的“奇偶信息”蕴含在帧里面,那么接收方就可以根据接收到的帧中的 1 的奇偶性,来判断数据是否发生了差错。

具体的实现方式,我们可以在帧的尾部加入一个数位。该数位可以为 1,也可以为 0。这样的话,我们就可以通过改变该数位的值,来改变整个帧中 1 的奇偶。如此这般,我们只需要在一开始就让接收方和发送方约定好,要么只发送奇数的 1,要么只发送偶数的 1。现在我们假设约定好了只发送奇数的 1。那么在发送之前,如果要发送的帧中含有奇数个 1,我们就可以将该数位赋值为 0。如果要发送的帧含有偶数个 1,我们就可以将该数位赋值为 1。从而使得帧永远含有奇数个 1。

但是这种检验方式可能会导致一个问题,那就是如果数据中有 2 的倍数个数位同时发生差错的话,帧的奇偶性就不会改变。那样的话,接收方就不能判别差错。


三、可靠传输

传输服务可以简单地分为“可靠型”和“不可靠型”。不可靠型会将所有有差错的帧全部丢失,且不会将丢失的帧用新的完整的帧补上。可靠型则需要保证接收方可以收到完整的、正确的信息。

一般来说,有线链路上的帧发生差错的可能性低,不需要要求数据链路层进行可靠传输( 我们之后会提到,有线链路的可靠传输已经可以通过更高层的网络协议实现了 )。但是无线网络容易受干扰,产生差错的可能性大,有必要进行可靠传输。

注意,本文所提到的“比特差错”只是众多传输差错中的一种。不同的网络层会有不同的传输差错,所以可靠运输的概念可以视情况运用在任何一个网络层次。

常用的可靠传输实现方式有:停止—等待协议( SW )、回退 N 帧协议( GBN )、选择重传协议( SR )

1、停止—等待协议

简单来说,停止—等待协议是这样一个过程。发送方向接收方发送一个帧,当接收方接收到帧时,会对帧进行差错检验。如果帧通过了差错检验,则发送方会向接收方发送反馈( ACK ),表示已经确认接收该帧。发送方接收到 ACK 之后就会继续发送下一个帧。反之,则丢弃该帧,并发送另外一种反馈( NAK ),表示该帧有误,已丢弃该帧。那么发送方接收到 NAK 之后,会重新发送该帧,直到接收方反馈 ACK 为止。

这个过程意味着发送方在发送帧之前,会先保留一个该帧的备份,直到确认帧已经被接收方接收了,才会删除备份,继续传输下一个帧。

理论是美好的,但是现实中总会出现一些意料之外的状况:

状况一:帧丢失。

假设在某次帧的传输中,整个帧因为某些原因直接丢失了。那么接收方因为没有接收到信息,就不会发送反馈信息。发送方因为没有接收到反馈信息,就会一直等待下去,直到接收到反馈信息为止。
为了防止这种意外发生,发送方在发送帧的同时,会开启一个“ 计时器”。之后,发送方会一直等待接收方的回信。若发送方迟迟没有回信,以至于计时器的数值超过了一个临界值。发送方就会直接判定为帧已经丢失,并重新发送被判定为丢失的帧。

状况二:反馈信息丢失。

不仅仅帧可能会丢失,接收方所发送的反馈信息也可能会丢失。若真出现了这样的情况,发送方就会误以为接收方并没有接收到相应的帧,然后发送一个已经发送过的帧。那么接收方在接收该帧的时候,可能会将该帧的数据和之前接收的帧的数据连接在一起,从而在解读时产生错误。又或者不会产生错误,但是浪费了有效资源。
为了防止这种事情发生,发送方会为每个帧分配一个序号。这样,接收方在接收新帧时,如果发现新帧的序号和自己之前所接收的帧的序号一致,则接收方会丢失新帧。

状况三:传输延迟

如果接收方的某一次反馈信息因为某些原因,比正常的传播时延要长。使得该反馈信息在传给发送方之前,发送方就已经判定帧已经丢失,并重新发送了原来的帧。而当该帧传输到一半时,反馈信息姗姗来迟,发送方接收到反馈信息,立马抛弃了才刚刚传到一半的帧,发送起了新的帧。这样会使得整个信息的传输变得乱套,信息的解读也无从下手。
为了防止这种事情发生,我们又该如何去解决呢?

现实中可能还会出现更多的状况,这里不再进行深入地讨论。

2、回退 N 帧协议

停止—等待协议要求发送方和接收方皆度过一段等待时期,这无疑是一种对资源的浪费。

为了减少这种浪费,一种改善的方法是,同时发送多个帧。在这种情况下,我们就只需要保证在第一个帧的反馈信息到来之前,发送完最后一个帧即可。通过这种协定,我们就可以尽量减少发送方和接收方的等待时间。

若发送的多个帧中,存在某个帧的数据存在差错,则为了防止数据错误,接收方将丢弃该帧,并拒绝接收该帧之后的所有帧。这意味着发送方需要将错误帧的原帧,以及之后的所有帧重新发送一遍。

d3f625fc09e598fab4a5827dba0a6ba9.png

3、选择重传协议

一种对回退 N 帧协议改善的方式是,通过某种实现方式,让接收方仅取消错误帧的接收,仍旧接收错误帧之后的所有帧,然后反馈发送方哪个帧出现了差错。发送方也仅会发送出了差错的帧。

然而该协议又可能会导致新的问题。如果接收方的缓存区不够大怎么办?针对新问题的解决又会导致新的协议。


返回原文

计算机网络

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值