计算机网络-数据链路层-多图

计算机网络体系结构

常见的三种网络分层结构

OSI: 国际标准化组织提出的网络层次结构
TCP/IP: 我们现在用的最多的网络层次结构
五层原理: 这是方便我们学习计算机网络而划分的,将物理层和数据链路层分离了出来

为什么有多种不同网络层次划分

OSI七层网络模型是国际标准化组织提出的,但是在OSI七层网络提出前TCP/IP网络模型已经被大规模使用了,成为了因特网事实上的网络模型(使用了TCP/IP模型的网络就是因特网,因特网是世界上最大的互联网)

ps: 下面介绍的内容都是基于 五层原理体系图
在这里插入图片描述

网络分层

计算机网络被分为不同的层级,各个层之间互相配合工作,下层向上层提供透明服务,换句话说,上层不必要知道下层的存在,也不需要知道下层如何工作,各个层都只要做好自己的工作

数据链路层概述

什么是链路?

传统的链路指的是一个节点到相邻节点的物理线路,而且中间没有任何交换设备

那什么是数据链路?

其实就是在链路上传输数据,变为可传输数据的链路。想要在链路上传输数据就需要使用协议来控制这些数据的传输,如果把实现这些协议的软件和硬件加在链路上就成了数据连接

小问题: 为什么要使用协议才能在链路上传输数据? 相信聪明的你一定会在本文中找到答案

在下面我们只需要关心数据链路层
在这里插入图片描述

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

想要实现数据链路层面临着三个最基本的问题

封装成帧

上层把数据交给下层,交到数据链路层的时候,数据链路层把数据添加帧头帧尾就叫做封装成帧
在这里插入图片描述

差错检测

数据在传输过程中可能会出现差错,比如 0 变成了 1 或者 1 变成了 0 等等
如何知道数据在传输过程中是否出现差错?该怎么检测?

可添加一个检错码进行校验

在这里插入图片描述

可靠传输

在数据链路层同样也面临着可靠传输的问题,在不同的网络中数据链路层可以实现或不实现可靠传输,比如在以太网中数据链路层向上层提供的不可靠传输,而在802.11无线局域网中则是提供可靠传输

如果不提供可靠传输则数据链路层收到有差错的包仅仅只是将其丢掉其他什么也不做
如果提供的可靠传输则需要想办法实现发送方发送什么接收方就接收到什么

封装成帧

添加帧头帧尾这一操作是封装成帧
在这里插入图片描述

在网络中传输数据我们都是以bit流进行传输数据

在下图所示的传输过程中很容易就能看出问题所在,接收方如何区别并提取帧?
在这里插入图片描述

要解决接收方不能区分帧的问题,那么发送方和接收方要使用相同的协议来约定如何发送数据,接收方才能知道如何提取出正确的数据

在以太网中物理层通过在帧前面加上8字节的前导码来解决该问题
并且每个帧间隔96bit时间(发送96个bit所需要的时间)
在这里插入图片描述

前七个字节是用来同步时钟用的(有兴趣的可以查阅其他更多资料),后面那个是帧开始定界符
这样接收方在接收到帧后就知道该帧从哪里开始到哪里结束,从而就能正确的接收该帧

然而这样就真的能正确的提取帧了吗?

透明传输

在以太网中每个帧前面都有前导码,而前导码中包含了帧开始定界符方便接收方知道帧的开头

然后关键也在帧开始定界符这里,如果上层传下来的数据中也包含帧开始定界符,这必然会导致接收方提供错误的帧。
而从另外一个角度来看发送方想要让接收方正确的提取帧那么交给数据链路层的数据中不能包含帧开始定界符,也就是上层知道了下层的存在并且对传输的数据有要求,那么就没有实现透明传输。

在PPP协议中每个帧都包含帧开始定界符和帧结束定界符(都固定为7E),如果不解决透明传输的问题那么在该网络下数据部分就不能包含7E

在这里插入图片描述

如何解决该问题?

想要解决该问题那么就需要在传输数据之前对上层交给数据链路层的数据进行扫描,如果包含定界符将其进行转义,这样接收方就能识别正确的定界符

针对不同链路采用不同的填充方法

先介绍一下这两种不同的链路的区别
在这里插入图片描述

面向字节的异步链路

采用字节填充法

发送方将要发送的数据部分里包含的定界符前插入转义字符,接收方在接收时每收到一个转义字符就知道后面的一个字节作为普通数据处理

注意图上面红色的字,已经说明怎么进行转义的了

在这里插入图片描述

面向同步的比特链路

采用 比特零填充法

  1. 发送方对其要发送的数据进行扫描
  2. 数据部分每出现连续的5个1就向其后面插入一个0
  3. 接收方每接收到连续的5个1就去掉后面的一个0
  4. 如果五个连续的1后面没有0可去掉则代表是帧定界符
  5. 包括帧尾的FCS

在这里插入图片描述

差错检测

其实在上边已经大概说了一下,就是通过帧中的检测码进行检测,有特定的算法,有兴趣的可以查下相关资料

可靠传输的基本概念

数据在传输过程中可能会出现差错
上面已经说过了如果向其上层提供的是不可靠传输那么直接将该帧丢弃其他什么也不做
如果提供的是可靠传输那么就要想办法实现发送方发送什么接收方就接收到什么
可靠传输可以在网络中的任何一层中实现例如传输层的TCP协议
在这里插入图片描述
实际上上图中接收方完全可以发送一条消息告知发送方它刚刚发送的数据有问题
但是如果该条通知的消息也出现误码该怎么办?
在这里插入图片描述

以下协议不局限于数据链路层

停止等待协议

主机A向主机B发送数据,如果主机B正确的接收到该数据则发送一个ACK,如果该数据产生误码则发送一个NAK,主机A在未接收到主机B的ACK来之前不能发送其他数据
在这里插入图片描述
然而上述过程存在许多致命的缺点

在这里插入图片描述
如果主机A发送的数据在网络传输的过程中丢失了,这时候主机B没有接收到任何数据,自然也不会发送任何ACK或NAK。
所以给主机A添加一个超时重传的功能,如果在指定时间内没有接收到ACK则会造成超时重传
该时间一般略大于传输的往返时间

在这里插入图片描述

再来看一个区别数据重复的问题

在这里插入图片描述

主机A给主机B发送消息,主机B也正确的接收到了,但是在给主机A传出ACK的过程中ACK丢失了,导致主机A超时重传,这时候主机B收到了重复的数据,主机B如何区分这些数据?

给每个数据都编号,由于停止等待协议在没有接收到ACK之前不能发送下一个数据包所以编号只使用一个bit就够了即 0 1

在这里插入图片描述
数据包有序号了那么回复的ACK需要需要有序号呢?

看这么一个问题

在这里插入图片描述
导致该问题的原因就是发送方无法分别哪个ACK是哪个数据包的
所以要解决该问题需要给ACK也加上序号

在这里插入图片描述
。。。。。。。我不想写了。。。。。还有好多。。。。。。啊啊啊啊啊啊啊啊啊

回退N帧协议

停止等待协议缺点
使用停止等待协议时 发送方每发送一帧都要等待接收方回复一个ACK才能发送下一帧数据,因此信道利用率极低

流水线传输

想要提升信道利用率可以使用流水线的传输方式

发送方一次性发送多个帧,如下图所示

在这里插入图片描述

回退N帧协议

回退N帧协议是基于流水线传输的

发送端和接收端都采用滑动窗口,在发送端称为发送窗口 接收端为接收窗口并且接收窗口只能为1(对于回退N帧而言)

假设给3个比特位用来给数据包进行编号,发送窗口为4 发送方每次发送4个数据包,即每次都会将窗口内的数据发送出去

接收方依次接收数据包后窗口向后移动并返回一个ACK

在这里插入图片描述

接收端在接收到ACK之后也要将窗口向后移动,并将已发送的数据在缓存删除

在这里插入图片描述

接收端不必每接收到一个数据包后就发送一个ACK,接收端可以接收多个数据包后再发送一个ACk,或自己也要数据要发送时捎带发送ACK

在这里插入图片描述

缺点

这种协议也有其缺点

来看下面这种情况

在这里插入图片描述

在网络传输时数据包0由于某种原因而丢失了,在到达接收端时只有了 数据包1、2、3 可此时接收端的窗口停留在 0 的位置,由于其序号比匹配,接收端就会将其进行丢弃 造成发送发超时重传,而数据包1、2、3明明是没有必要进行重传的,这无疑消耗了更多的网络资源


使用这种协议还有一种限制,发送发如果采用N为比特进行编码,则窗口不能大于2^N - 1 ,上面的例子中 采用 3 位比特进行编码,那么窗口不能大于 2^3 - 1 = 7,

如果大于 7 会出现什么样的效果?

下面这个例子 窗口大小采用 8 (3位比特最大也只能是8) ,从而造成接收端接收了重复数据

如果窗口大于 2^N - 1 则会造成接收端无法识别重复数据

在这里插入图片描述

选择重传协议

在选择重传协议中,接收端的窗口大小不在是1一般和发送窗口一样大,并且不能累计确认,如果一个未按序到达的数据包只要该编号在接收窗口中接收端就会将其接收并缓存起来,并回复一个ACK,对于每个数据包都有一个相应的ACK。

发送端会对每个数据包单独启动一个超时计时器,如果未在指定时间内接收到该数据包就会造成超时重传,但只会重传超时的数据包,并不会将发送窗口内的所有数据包都重传,除非该窗口内的数据包都超时。

如果接收端返回的ACK丢失,会造成发送端超时重传,如下图所示,ACK 3丢失,但是接收端已经正确接收到该数据包了,并且窗口已经向后滑动了,此时接收端接收到窗口左边的数据就会返回一个ACK,但是并不是左边所有的数据包都会返回ACK,而是当前窗口的下界值(窗口里最下的那个编号)减去当前窗口大小,如果在收到这个区间内的包就会返回一个ACK,如图是下界值是 4窗口大小也是4,4-4=0,所以收到0-3号包都会返回一个ACK

在这里插入图片描述

选择重传协议和回退N帧协议最大的不一样是在选择重传协议中接收端的接收窗口不在是1,并且不能使用累计确认

至此。。。。。。 终于写完了。。。啊啊啊啊啊啊 再也不想写了。。。。。。

好了关于数据链路层以及数据链路层面临的三个基本问题还有其解决方案都已经介绍完了

有什么补充的我想到再来补充。。。。。。。。。。 拜拜 好累

  • 14
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值