1. 前言
今天是【计算机网络】课程考试前一周时间,趁着计算机网络考试,猫猫来进一步梳理计网这门课程的知识,希望也能给阅读本系列文章的友友们提供一些帮助。
本系列分为两个部分:
- 全面知识梳理
- 特别知识梳理
(全面知识梳理一律加上【第*章】字样,是软件工程所有知识的全面梳理)
(特别知识梳理一律加上 【一篇搞定】字样,仅仅作为特别重要内容的展开延申)
2. 数据链路层
数据链路层是基于物理层不可靠的传输向上层提供可靠的传输,它提供的是相邻两个节点之间可靠的数据传输(点对点的传输)。本章主要涉及网络模型中第二层(即数据链路层)的设计原则。实现通过一条通信信道连接起来的两台机器,实现可靠有效的完整信息块(称为帧)通信的一些算法。解决通信线路中出错的情况、关于有限的数据传输率、发送时间和接受时间存在的非零延迟等问题。
2.1 章节框架
2.2 数据链路层的设计问题
数据链路层使用物理层提供的服务在通信信道上发送和接受比特。完成一些功能:
- 向网络层提供一个定义良好的服务接口。
- 处理传输错误。
- 调节数据流,保证慢速的接收方不会被快速的发送方淹没。
对应的每一个功能有一个名字:
- 为网络层提供服务:无确认的无连接服务、有确认的无连接服务、有确认的有连接服务
- 差错控制:接收方主机收到帧后通过检错码和检错算法判断帧在传输过程中是否产生误码
- 流量控制与可靠传输:调节数据流,保证慢速的接收方不会被快速的发送方淹没
想要完成这些功能,必然要增加头信息(在网络层数据分组上增加控制信息),因此还需要实现:
- 封装成帧:数据链路层给网络层交付的协议数据单元添加帧头和帧尾
接下来,我们将从上面四个功能逐一展开去学习数据链路层🍉🍉
2.3 封装成帧
封装成帧
的过程就是将网络层的IP数据报(分组)加头加尾,形成链路层的数据传送单元帧
,IP数据报也就成了帧的数据部分。- 封装成帧需要保证在接收端那边能够拆帧
一些概念:
帧同步
:接收方从接收到的二进制比特流中区分出帧的起始和终止- 组帧:就是在发送端封装成帧的过程
数据链路层的帧长
:帧从帧首部到尾部包括中间数据部分的总长度透明传输:
不管所传数据是什么样的比特组合,都能够在链路上传送并且不会引起帧边界判断错误。当所传数据中的比特组合恰巧与某一个控制信息完全一样时,就必须采取适当的措施,使接收方不会将这样的数据误认为是某种控制信息。这样才能保证数据链路层的传输是透明的。
能够拆帧要解决的问题:
- 帧的边界问题:如何识别帧的边界。
- 帧的透明传输(填充)问题:如果帧的数据中出现和边界一样的 flag 该如何防止被识别为边界
透明传输是帧定界需要满足的要求
2.3.1 帧结构
记忆:662N4,帧结构真好记!
2.3.2 帧定界
概念:将一段数据的前后部分添加首部和尾部,构成一个帧;接收端在收到物理层上交的比特流后,就能根据首部和尾部的标记,从收到的比特流中识别帧的开始和结束。
- 首部和尾部的标记,就是首部和尾部添加的一个字节,这个字节叫做
帧定界符
,接收端可据此确定帧开始和结束的位置。 - 首部和尾部包含许多的控制信息,其中的帧定界符才实现
帧定界
的作用;还有其他关于差错控制、流量控制、物理地址等信息
帧定界包含在封装成帧里面
满足透明传输的组帧(帧定界)的四种方法:
- 字符计数法
- 字符(节)填充法
- 零比特填充法
- 违规编码法
1. 字符计数法
帧首部使用一个计数字段(第一个字节,8位)来标明帧内字符数。
如果计数字段发生错误,比如从5到4,则第一个帧的结束位发生错误,导致后面所有的帧都发生错误,导致接受方无法正确的接收每一个帧,接受双方失去了同步。
2. 字符填充法
加头SOH,
加尾EOT
(均为一个字节)标记帧的开始与结束,只要协商好,SOH
和EOT
对应的比特组合可以不同。
- 当传送的帧都使由文本文件组成时,都是ASCII,与一个字节的
SOH
和EOT
不会有交集,因此不会与这连个标记重复,可以实现透明传输
- 但当传送的帧由非ASCII码组成时,有可能出现数据内某段比特流数据正好与标记字段重复,从而导致误判断的情况,因此要采用
字符填充法实现透明传输
字符填充法:在数据部分与标记字段重复的字段前加转义字符
,告诉接受端不用管我后面的字段是什么,正常接收即可,直到遇到真正的开始/结束标志
3. 零比特填充法
首部和尾部的标志相同,均是01111110
如果发送端发送一系列一连串的比特时,数据部分也出现了与标志相同的比特组合01111110
,那么怎么实现透明传输呢?这就是零比特填充法
要解决的问题
4. 违规编码法
因特网传输使用的是曼彻斯特编码,回顾一下:
- 曼彻斯特编码:跳零反跳1看中间,中必变
- 差分曼彻斯特编码:跳0不跳1看起点,中必变
- 反向非归零编码:跳0不跳1看起点,中不变
因此,对于因特网的传输,因为曼彻斯特编码不使用高-高
,低-低
来表示数据信息,所以如果使用高-高
,低-低
来表示帧起始和终止就不会与数据冲突
2.4 差错控制
2.4.1 差错的由来
为什么要在数据链路层进行差错控制?
因为错误可以尽早发现,不会让一个错误的数据包发送了很长时间到达最终目的地之后才被发现,从而导致网络资源的浪费
2.4.2 差错控制的类型
数据链路层的差错控制针对的是比特,也就是物理层传输中出现的错误。
差错控制包括两类:
- 差错检测:奇偶效验码、循环冗余码
- 差错纠正:海明码
注意:数据链路层编码和物理层的数据编码与调制不同。
- 物理层编码针对的是单个比特,解决传输过程中比特的同步等问题,如曼彻斯特编码。
- 而数据链路层的编码针对的是一组比特,它通过
冗余码
的技术实现一组二进制比特串在传输过程是否出现了差错
2.4.3 差错检测
推断是否发生错误。适用于高度可靠的信道,错误偶尔发生时,只需重传整个数据块即可。
1. 奇偶校验码
奇校验:保证1的个数为奇数
偶校验:保证1的个数为偶数
上图中D选项的错误不能检测,由此可见奇偶效验效果并不好
2. 循环冗余码
循环冗余码分为两个步骤:
- 发送端生成冗余码
- 接收端检测错误
发送端生成冗余码:
接收端检测错误:
2.4.4 差错纠正(山东大学不考)
1、确定校验位数r
2、确定校验码和数据的位置
3、求出校验码的值
4、检错并纠错