计算机网络第三章:数据链路层
Posted 九死九歌
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了计算机网络第三章:数据链路层相关的知识,希望对你有一定的参考价值。
§3.1 数据链路层功能概述
1.节点:
计算机网络中的中的主机路由器等都可以叫节点。
2.链路:
网络中两个节点之间的物理通道,链路的传输介质主要有双绞线光纤和微波。分为有线链路、无线链路。
3.数据链路:
网络中两个节点之间的逻辑通道,把实现控制数据传输协议的硬件和软件加到链路上就构成了数据链路。
4.帧:
链路层的协议数据单元,封装网络层数据报。
5.链路与数据链路之间的区别:
链路是物理通道、而数据链路是逻辑通道。数据链路层负责通过一条链路从一个结点向另一个物理链路直接相连的相邻结点传送数据报。
6.数据链路层的功能:
数据链路层在物理层提供服务的基础上向网络层提供服务,其最基本的服务是将源自网络层来的数据可靠地传输到相邻节点的目标机网络层。其主要作用是加强物理层传输原始比特流的功能,将物理层提供的可能出错的物理连接改造成为逻辑上无差错的数据链路,使之对网络层表现为一条无差错的链路。
网络层是大老板、数据链路层是秘书、物理层是跑腿的。现在老板A要送文件给老板B,老板A就让秘书发文件,秘书把文件分成五段并标号,然后让跑腿的送文件,老板B的秘书一看文件不对,怎么只有三段,就得改正文件,保证让老板B拿到的是正确文件。
- 为网络层提供服务:
- 无确认无连接服务:适用于误码率低的通信。接收端收到信息不用发出响应。若物理层并没有成功传送数据,数据链路层也一声不吭悄悄地。
- 有确认无连接服务:收发双发无需建立连接,但数据成功发送到的话、接收端要发送响应。
- 有确认面向连接服务:收发双方建立连接。有连接必然有确认,所以不存在无确认有连接服务。
- 链路管理,即连接的建立、维持、释放(用于面向连接的服务)。
- 组帧:详见下一节讲解。
- 流量控制:接收端收不过来的话,就得让发送方慢点儿。这就叫流量控制。
- 差错控制:帧错 / 位错
§3.2 组装成帧和透明传输
一、封装成帧
1.概念:
封装成帧就是在一段数据的前后部分添加首部和尾部,这样就构成了一个帧。接收端在收到物理层上交的比特流后,就能根据首部和尾部的标记,从收到的比特流中识别帧的开始和结束。首部和尾部包含许多的控制信息,他们的一个重要作用:帧定界(确定帧的界限)。
2.帧同步:
接收方应当能从接收到的二进制比特流中区分出帧的起始和终止。
3.帧长:
如图所示
4.MTU:
即最大传输单元,帧的数据部分要不大于MTU。
5.组帧的四种方法:
- ① 字符计数法
- ② 字符(节)填充法
- ③ 零比特填充法
- ④ 违规编码法
二、透明传输
透明传输是指不管所传数据是什么样的比特组合,都应当能够在链路上传送。因此,链路层就“看不见”有什么妨碍数据传输的东西。
当所传数据中的比特组合恰巧与某一个控制信息完全一样时,就必须采取适当的措施,使收方不会将这样的数据误认为是某种控制信息。这样才能保证数据链路层的传输是透明的。
三、组帧的四种方式
1.字符计数法:
帧首部用一个计数字段(第一个字节,八位)来表明帧内的元素。
缺点:如果第一个字符发生失真编成了4,那后面就全乱了。所以这种方法其实也不常用。
2.字符填充法
当传送的帧是由文本文件组成时(文本文件的字符都是从键盘上输入的,都是ASClI码)。不管从键盘上输入什么字符都可以放在帧里传过去,即透明传输。
当传送的帧是由非ASClI码的文本文件组成时(二进制代码的程序或图像等就要采用字符填充方法实现透明传输。
字符填充具体实现方法是这样的,有三种字节,开始字节、结束字节、转义字节。如果刚好传送的正常数据和开始字节结束字节或者转义字节一样,那就在他前面插入一个转义字节。如图:
3.零比特传输法
标志字段01111110同时代表开始结束,并且严格遵守5110,即没出现五个连续的1,就在后面插入一个0,就算传输的数据中有01111110,那他也会变成011111010,不会与标志字段发生混淆。实现了透明传输。
4.违规编码法
用违法的编码方式来表示起始结束,例如曼彻斯特编码中,只能有 低-高、高-低 两种编码方式,那就用高-高和低-低表示起始结束。
5.总结:
由于字节计数法中Count字段的脆弱性(其值若有差错将导致灾难性后果)及字符填充实现上的复杂性和不兼容性,目前较普遍使用的帧同步法是零比特填充和违规编码法。
§3.3.1 差错控制(检错编码)
一、差错从何而来?
主要还是由噪声而来。而差错的分类可以根据成因分两种、根据形式也分两种。
1.根据成因分:
-
① 全局性:
- 由于线路本身电气特性所产生的随机噪声(热噪声),是信道固有的,随机存在的。
- 解决办法:提高信噪比来减少或避免干扰。(对传感器下手)
- 信道电流流过发生的呲呲声导致。
-
② 局部性:
- 由于外界特定的短暂原因所造成的冲击噪声,产生差错,这是主要原因。
- 解决办法:通常利用编码技术来解决。
- 熊孩子拿木头棍子敲网线
2.按形式分:
- 位错:1变0 0变1这种
- 帧错:例如 [#1] - [#2] - [#3] 发生帧错
- 丢失:收到 [#1] - [#3]
- 重复:收到 [#1] - [#2] - [#2] - [#3]
- 失序:收到 [#1] - [#3] - [#2]
二、数据链路层的差错控制
1.位错差错控制的方式:
假设主机A和主机B进行通信,信道上有20个路由器等链路层设备。在数据在第五个路由器上发生了位错,第五个路由器就不会发位错的数据,然后往回发,五四三二一往回发到主机A上告诉主机A数据错了让它重新发。
这比直接一股脑不管对错发到主机B上,然后发现错误又重新王芳一轮回要节省不少资源呢。
2.位错差错控制的编码方式:
- 纠错编码:
- 海明码
- 检错编码:
- 奇偶效验码
- 循环冗余码
3.物理层的编码和数据链路层的编码的不同点
数据链路层编码和物理层的数据编码与调制不同。物理层编码针对的是单个比特,解决传输过程中比特的同步等问题,如曼彻斯特编码。而数据链路层的编码针对的是一组比特,它通过冗余码的技术实现一组二进制比特串在传输过程是否出现了差错。
3.冗余编码:
在数据发送之前,先按某种关系附加上一定的冗余位,构成一个符合某一规则的码字后再发送。当要发送的有效数据变化时,相应的冗余位也随之变化,使码字遵从不变的规则。接收端根据收到码字是否仍符合原规则,从而判断是否出错。
我上淘宝买了五十颗糖,商家会把它打包起来,然后在上面写:“共计五十颗,没颗重2g,连带包装共计150g。”,这个就是冗余码。然后一路上会有一些相当于是路由器的官员,比如糖运到曹县了,曹县的负责官员就要称一下包裹,要是发现重量不对,与冗余码不符合,哦吼,原来是有一颗糖坏了。就让送货的把坏掉的扔了,没坏的继续送,并且再派一众人马去出发地商家,让商家的工作人员重新送一颗没坏的糖过来。不用说是我收到了糖,发现有一颗坏的,这时才给商家反馈。浪费时间浪费资源。
三、检错编码 — 奇偶效验码
1.概念:
奇偶校验码分为一位校验码和 n - 1 位信息元。其编码方式分为奇校验偶校验。奇校验是在数据前面加一位0或1,使1的个数为奇数。偶校验码就是加一位1的数量变偶数
对于奇(偶)校验只能检测出奇数个位==(1位错误、3位错误)==的比特错误,因而检错能力只有 50 %
2.例题:
如果一个字符S的ASCI编码从低到高依次为1100101,采用奇校验,在下述收到的传输后字符中,哪种错误不能检测?
A.11000011 B.11001010
C. 11001100 D.11010011
答案:D
解析:
显而易见的,S的正确奇校验码应该是11100101,四个答案都是错误的编码,但是错误的编码也有可能不会被找到对吧。ABC三项,1的个数均为4,是偶数,而奇校验需满足1的个数为奇数,那么ABC的错误必然能被检测出来。但是D中的1的个数是5个,是奇数,所以即便他是错的,数据链路层也看不来。就像是要买的五个十个糖,少了一颗糖,但放了一颗一样重的石头,冗余码也没用,只能默默认栽。
四、检错编码 — CRC循环冗余码
1.编码思想:
比如发送端要发送的发送数据是5,生成多项式是2,然后5 % 2 = 1,那么1就是冗余码 / FCS帧检测序列。5 + 1 是6,所以发送端不发5发6,接收端一看:哦吼,666,发的是6,这玩意儿是2的倍数,那就没得错了。
这个玩意儿有点麻烦,就不说他具体是怎么操作的了,直接上例题反而更好理解。
2.例题:
假如我们要发的数据是1101011011,采用CRC校验,生成多项式为10011。
10011表达成多项式应该是 x 4 + x + 1,阶数为4,那么我们就先用原始数据1101011011乘以2 4 也就是10000,得到的11010110110000,然后用这个11010110110000除以10011得到余数是1110,也就是说FCS就是1110,然后用11010110110000加上1110得到11010110111110即是要发送的数据。具体二进制除法要用到异或运算,如图(没必要怎么掌握,估计到时候数电要学二进制除法器)
然后对于接收端而言,他应该如何将11010110111110进行检错呢?很简单,判断11010110111110是不是生成多项式10011的倍数。
另外FCS的生成以及接收端CRC检验都是由硬件实现,处理很迅速,因此不会延误数据的传输。
为啥硬件就快,想想晚上睡觉前要关灯,你现在就在开关面前,直接按开关快还是掏出手机用智能开关装逼快。
3.总结:
在数据链路层仅仅使用循环冗余检验CRC差错检测技术,只能做到对帧的无差错接收,即“凡是接收端数据链路层接受的帧,我们都能以非常接近于1的概率认为这些帧在传输过程中没有产生差错”。接收端丢弃的帧虽然曾收到了,但是最终还是因为有差错被丢弃。“凡是接收端数据链路层接收的帧均无差错”。
这种传输方式仍然不能称作“可靠传输”,可靠传输是发送端数据链路层发什么,接收端数据链路层就收到什么。CRC检验虽然能实现无比特差错的传输,但这还不是可靠传输。
§3.3.2 差错控制(纠错编码)
1.海明码的特点:可以发现双比特错,纠正单比特错。
2.海明码的特点:动一发而牵全身。
3.海明码的工作原理:
一、确定校验码位数r
1.海明不等式:
2 r ≥ k + r + 1
r为冗余信息位,k为信息位。
2.海明不等式的应用
设要发送的数据为 D = 101101 ,数据的位数 k = 6 ,满足不等式的最小 r 为4,也就是说 D = 101101 的海明码应该有 6 + 4 = 10 位,其中原数据 6 位,校验码 4 位。
二、确定校验码和数据的位置
对于原始数据 D = 101101 ,已知应有四位校验码,设它们分别为P1 , P2 , P3 , P4;数据从左到右为D1 , D2 , D3 , D4 , D5 , D6
校验码Pn只能放在第 2 n,n ∈ N 位 上,将校验码填好后,再按顺序把原数据填好,填满这十位。
数据位 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 |
---|---|---|---|---|---|---|---|---|---|---|
代码 | P1 | P2 | D1 | P3 | D2 | D3 | D4 | P4 | D5 | D6 |
实际值 | ? | ? | 1 | ? | 0 | 1 | 1 | ? | 0 | 1 |
三、求出校验码的值
首先,我们上一步已经得到了数据 D = 101101中相关数据的位置,如下表所示。
数据位 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 |
---|---|---|---|---|---|---|---|---|---|---|
二进制 | 0001 | 0010 | 0011 | 0100 | 0101 | 0110 | 0111 | 1000 | 1001 | 1010 |
代码 | P1 | P2 | D1 | P3 | D2 | D3 | D4 | P4 | D5 | D6 |
实际值 | ? | ? | 1 | ? | 0 | 1 | 1 | ? | 0 | 1 |
如何计算P1:P1所在位数的二进制位是0001,从右往左第一位为1,而除P1 外,D1 , D2 , D4 , D5的所在位数的二进制位从右往左的第二位也为1,那就另P1 ⊕ D1 ⊕ D2 ⊕ D4 ⊕ D5 = 0,即可算出 P1 的值为0 。
如何计算P2:P2所在位的数的二进制位是0010,从左往右第二位是1,那就找他后面从左往右第二位也是1的,即D1 , D3 , D4 , D6,同样的令P2 ⊕ D1 ⊕ D3 ⊕ D4 ⊕ D6 = 0,即可得到P2 = 0 。
同样的方法可得:P3 ⊕ D2 ⊕ D3 ⊕ D4 = 0 => P3 = 0,P4 ⊕ D5 ⊕ D6 = 0 => P4 = 1 。
那么101101的海明码就为0010011101
上面那个表就可以写完整了:
数据位 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 |
---|---|---|---|---|---|---|---|---|---|---|
二进制 | 0001 | 0010 | 0011 | 0100 | 0101 | 0110 | 0111 | 1000 | 1001 | 1010 |
代码 | P1 | P2 | D1 | P3 | D2 | D3 | D4 | P4 | D5 | D6 |
实际值 | 0 | 0 | 1 | 0 | 0 | 1 | 1 | 1 | 0 | 1 |
(想出这个的科学家真的是太牛太厉害了)
上网查了一下,人家就是因为发明这个拿到了图灵奖。要多向牛人学习。没准将来我也能那个图领奖呢。狗屁个,拿个蓝桥杯三等奖都够呛了 😦,这是本人黑历史
(Richard W. Hamming,美国数学家,图灵奖得主,“汉明码”的发明人。)
四、检错并纠错
我们从上面几步得知原始数据 D = 101101 对应的十位海明码是0010011101,假如第五位发生错误,导致接收端收到的信息是0010111101,我们来探讨一下接收端到底是怎样检错纠错的。
数据位 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 |
---|---|---|---|---|---|---|---|---|---|---|
二进制 | 0001 | 0010 | 0011 | 0100 | 0101 | 0110 | 0111 | 1000 | 1001 | 1010 |
代码 | P1 | P2 | D1 | P3 | D2 | D3 | D4 | P4 | D5 | D6 |
正确值 | 0 | 0 | 1 | 0 | 0 | 1 | 1 | 1 | 0 | 1 |
错误值 | 0 | 0 | 1 | 0 | 1 | 1 | 1 | 1 | 0 | 1 |
首先我们根据海明公式可以判断出来第1 , 2 , 4 , 8 四位是校验码。然后我们开始计算。
P1 ⊕ D1 ⊕ D2 ⊕ D4 ⊕ D5 = 1 ······ ①
P2 ⊕ D1 ⊕ D3 ⊕ D4 ⊕ D6 = 0 ······ ②
P3 ⊕ D2 ⊕ D3 ⊕ D4 = 1·············· ③
P4 ⊕ D5 ⊕ D6 = 0 ····················· ④
我们把四个式子中格式为Dn的二进制位的集合分别设为A1 , A2 , A3 , A4四个集合。发生错误的二进制位设为X
由 ② ④ 得知:对于 ∀ 二进制位位N ∈ A2 ∪ A4, N没有发生错误。
由 ① ③ 得知:发生错误的二进制位 X ∈ A1 ∩ A3 ,A1 ∩ A2 = { D2 , D4 },而D4 ∈ A2 ∪ A4,D4 不可能发生错误,所以发生错误的就是D2,也就是第五位二进制位。
那么纠错后的海明码就应该是0010011101
五、本节思维导图
§3.4.1 流量控制与可靠传输机制
零、前言
这一节主要是大体的、笼统的介绍流量控制可靠传输相关的协议,不会展开的说,所以你会看到笔者究竟能有多敷衍。
不过后面几节会将这几个协议逐个细细地讲一下。
一、数据链路层的流量控制
1.概念:
较高的发送速度和较低的接收速度的不匹配,会造成传输出错,流量控制就是控制发送方发送速度的过程。是数据链路层的一项重要工作。
2.链路层流量控制和传输层流量控制的区别:
数据链路层的流量控制是点对点的,而传输层的流量控制是端到端的。
链路层流量控制手段:接收方接收不下就不回复确认。
传输层流量控制的手段:接收端给发送端一个窗口公告。
比如说是有人在笼子里养了一条狗娃子,给碗里盛了点狗粮,喂给狗娃子,狗娃子吃完了把空碗推开,这个空就是确认帧。如果狗娃子饱了,不吃了,就不会有空碗,也就是不会发送确认帧。
二、流量控制的方法
1.停止 — 等待协议:
每发送完一个帧就停止发送,等待对方的确认,在收到确认后再发送下一个帧。
因为存在等待的过程,所以这个协议是比较低效的。一般不使用。
(停止等待协议是一种特殊的滑动窗口协议)
2.滑动窗口协议:
如图,上面是发送端,下面是接收端,发送端发送窗口有N帧长,接收端接收窗口有M帧长,接收端每接收一帧,接收窗口就往前一位,然后向发送端发送确认信息,接收端收到后,接收窗口也会往前一位。
而停止 — 等待协议收一个确认一个就相当于是两个滑动窗口都只有一帧的滑动窗口协议。
3.三种协议的区别:
- 停止 — 等待协议:发送窗口为1,接收窗口为1。
- 后退N帧协议(GBN):发送窗口>1,接收窗口为1 。
- 选择重传协议(SR):发送窗口>1,接收窗口>1 。
三、可靠传输、滑动窗口、流量控制
1.回顾可靠传输和流量控制的概念:
可靠传输:发送端发啥,接收端收啥。
流量控制:控制发送速率,使接收方有足够的缓冲空间来接收每一个帧。
2.滑动窗口解决的问题:
- 流量控制:假如发送端发太快,接收端收不下就不确认,发送端想发也发不了。
- 可靠传输:发送短长时间没有收到确认,就会重新发送一遍原数据。(男朋友打游戏时,女朋友发微信:“在?”,五秒后未回,又发“在?”,又来又来,知道男朋友打完游戏回消息发送确认为止。)
四、本节思维导图
§3.4.2 停止 --- 等待协议
一、停止 — 等待协议的归属:数据链路层 or 传输层?
过去技术不成熟,传输数据可能出现这样那样的问题,因而步骤繁琐,传输层和数据链路层都要进行流量控制。而现在通信技术成熟了,出错的可能性没有那么大了,只需要传输层保留流量控制这个功能就行了。数据链路层只需要进行差错控制。所以有的书会把停止 — 等待协议只放到传输层里。
二、停止等待协议的内核
1.为什么要有停止 — 等待协议?
除了比特出差错,底层信道还会出现 丢包 ① 问题。为了实现流量控制。
注:① 丢包:物理线路故障、设备故障、病毒攻击、路由信息错误等原因,会导致数据包的丢失。不是某个位丢失,而是丢失了一个数据包,一个帧。
2.研究停止等待协议的前提?
虽然现在常用全双工通信方式,但为了讨论问题方便,仅考虑一方发送数据(发送方),一方接收数据(接收方)。
因为是在讨论可靠传输的原理,所以并不考虑数据是在哪一个层次上传送的。
“停止-等待”就是每发送完一个分组就停止发送,等待对方确认,在收到确认后再发送下一个分组。
3.停止等待协议的应用情况:
- ① 有差错情况
- ② 无差错情况
三、停止等待协议的无差错情况
如图,发送方的0帧成功发给了接收方。↓↓↓
然后接收方发送了一个确认帧ACK0(ACK是acknowledge的意思)↓↓↓
然后发送方接受收到了确认帧ACK0,就会继续发送1帧。↓↓↓
然后1帧顺利的到达了接收方,接收方就又会给发送方发送确认帧ACK1,如此往返数次。最后数据就能传送完毕了。↓↓↓
四、停止等待协议的有差错情况
1.发生了丢包:
如图,出现了错误 — 丢包!(噔噔咚~)↓↓↓
那接收端没有接收导数据,所以发送端接一直收不到确认帧,怎么办呢?其实啊发送端在发送某个帧的时候,会启动一个超时计时器。然后只要在一定时间内接收到接收端发来的确认帧,那这个超时计时器就归零了,free()了,然后发送端发送下一个帧,启动下一个超时计时器。但是如果计时器都超时了,确认帧还是没有传过来,那么发送端就会再把这个帧发送一遍。
超时计时器的时间设置应当比帧传输的平均RTT更长一些。(RTT,第一章的东西,反正我写到这里的时候就感觉自己把物理层的东西都忘到沟子上咧。RTT,往返时延,就是一个数据正常情况下从发送方到接收方,再将确认信息从接收方发送到发送方的过程中产生的时延。)
几点注意:
- 发送完一个帧后,一定要保存它的副本,不然东西发出去了,半路没了,丢包了,人家接收端蛮横地要你重发,你副本都没有,本体又丢了,你说你发啥呀。 不过等人家确认信息都传过来了,那这个副本就没得用了,该扔就扔了。
- 数据帧和确认帧都必须要编号。
- 对于帧出错的问题如何解决我们这里没有讲,因为帧出错和丢帧差不多实际上,接收方发现帧错了,就会手动丢掉帧,然后耍脾气不给人家发送方确认帧。
2.确认帧ACK丢失:
如图所示↓↓↓
这种情况下超时计时器的时间到了,确认帧还是没有传来,发送方就会重新发送数据,而接收方已经接收过这个帧,所以就把之前接收的丢弃,重新接收。
3.ACK迟到
确认帧迟迟不来,发送方超时重传,接收方收到重传帧后再次传确认帧。然后过一会儿都已经传到第二三个帧了,发送方收到了第一个帧的确认帧,就会将它丢弃掉。
五、停止等待协议的性能分析
优点:操作简单
缺点:信道利用率太低
如图,TD为发送帧发送时延,RTT为往返时延,TA为确认帧发送时延。
信 道 利 用 率 U = T D T D + R T T + T A 信道利用率U=\\frac{T_D}{T_D+RTT+T_A} 信道利用率U=TD+RTT+TATD
信道利用率,第一章的东西,忘了吧忘了吧哈哈哈,其实我也忘了。
信道利用率指:发送方在一个发送周期内,有效地发送数据所需要的时间占整个发送周期的比率。
信 道 利 用 率 = L C T 信道利用率=\\frac{\\frac{L}{C}}{T} 信道利用率=TCL
T是发送周期,L是发送周期T内发送的比特数据,C是发送方数据传输率。
还有一个类似的概念,信道吞吐率
信 道 吞 吐 率 = 信 道 利 用 率 × 发 送 方 发 送 速 率 信道吞吐率=信道利用率\\times发送方发送速率 信道吞吐率=信道利用率×发送方发送速率
放了这么多概念,我脑子都然成糊糊了,放例题先:
例题:一个信道的数据传输率为4kb/s,单向传播时延为30ms,如果使停止-等待协议的信道最大利用率达到80%,要求的数据帧长度至少为( )。
来,咱们分析一波,题上没有给确认帧的发送时延是多少,那就是忽略不计了,单向传播要30ms,那双向传播就是60ms,也就是说
R
T
T
=
2
×
以上是关于计算机网络第三章:数据链路层的主要内容,如果未能解决你的问题,请参考以下文章 计算机网络 王道考研2021 第三章:数据链路层 -- 数据链路层功能概述封装成帧和透明传输差错控制(检错编码/纠错编码) 《计算机网络(第7版)谢希仁 著》第三章 数据链路层 要点及习题总结