计算机网络之数据链路层详解
原创
一、概述
要在一条通信线路上传送数据,除了必须建立一条 物理线路 (物理层的功能)之外,还必须有一些 规程 或 协议 来 控制这些数据的传输 ,以保证被传输数据的正确性。实现这些规程或协议的硬件和软件加上物理线路就构成了 “数据链路层”。
链路层构建的是真正用于 数据传输 的 逻辑通道, 一般是 非永久存在 的(但局域网中的数据链路是永久的),仅当有数据传输时建立并存在,在数据传输完后 自动拆除 。
注意:
物理层 的协议是用来构建 物理传输线路 、建立 物理意义 的 网络通信 ,而 不是用来控制数据传输 的。
逻辑链路 必须建立在 物理链路 之上

为什么不直接使用物理层传输?
1、物理层 传输介质 的 多样性 , 通信规程 也各 不相同 ,性能不稳定,而数据链路层中构建的逻辑链路可以屏蔽物理层中传输介质的不同,从逻辑意义上构建一条性 能稳定、不受传输介质类型影响 的 逻辑数据传输通道
2、在物理层中数据是 一位位地单独传输 的,不仅数据 传输效率低下 ,而且容易出现 数据传输差错 (如出现某些数据位丢失或者错位),而链路层以“帧”为单位传输,传输效率高,还不容易出错
链路层 的 主要作用:
在原始的、有差错的物理传输线路的基础上,采取 差错检测、差错控制 与 流量控制 等方法,将 有差错的物理线路 改进成 逻辑上无差错的数据链路 ,以便向 网络层 提供高质量的服务。
就像我们修好了路,还得制定一些 交通法规 ,使路上行驶的车辆必须 按照一定的规则行驶 ,否则可能会经常出现 交通事故 。这些“交通法规”也为了使这些车辆 到达某个车站 (这里所说的“车站”就相当于计算机网络体系结构中的“网络层”)时能 有序进、出站 ,最终使这条数据通信之“路”发挥它本来的作用。
二、数据链路层结构
在数据链路层中,与它的下一层—物理层相邻的是 MAC子层 ,与它的上一层—网络层相邻的是 LLC子层 。所以MAC子层接受物理层的服务,为LLC子层服务,而LLC子层则是接受MAC子层服务,为网络层服务。

而各层是通过各层间的 SAP (Service Access Point,服务访问点)来 提供 或 接受服务 的
SAP是 邻层 实体(“实体”也就是对应层的逻辑功能)间实现 相互通信 的 逻辑接口 ,位于 两层边界处

1、MAC子层(介质访问控制)
作用:
与各种 传输介质访问 有关的问题都放在“MAC子层”来解决。其主要功能包括: 数据帧的封装/卸装 , 帧的寻址和识别( 通过MAC地址进行的 ) , 帧的接收与发送 ,帧的 差错控制 、介质 访问冲突控制 等。
2、LLC子层(逻辑链路控制)
数据链路层中与 传输介质访问无关的问题 都集中在LLC子层来解决,为网络层提供服务。其主要功能包括 逻辑链路的建立和释放 、提供与网络层的接口(也就是前面说到的SAP)、数据传输 差错控制 、给数据帧加上 传输序列号 等。
由于 网络层 上可能有 许多种通信协议 同时存在,而且每一种通信协议又 可能同时与多个对象沟通 ,因此当LLC子层从MAC子层收到一个数据包时必须能够 判断要送给网络层的是哪一个通信协议 。为了达到这种功能,在LLC子层中提供了“数据链路层”的SAP,作为与“网络层” 通信交互的接口

三、主要功能
1、数据链路管理
在数据链路层中要形成一条 更有利于数据传输的数据链路 ,而不是直接利用下面物理层中建立的物理链路。
数据链路 是由数据链路层中的 LLC子层 通过相应的 通信规程 (也就是通常所说的协议) 建立并管理 的。而不同协议建立的数据链路, 提供的服务类型也不同 。
1.数据链路层提供的服务类型:
(1)有确认的面向连接服务
- 提供服务时,必须先 建立好双方通信连接 ;
- 提供服务时,必须要求对方 确认后才进行 。
- 独占链路,只有在当前数据传输完成, 释放了链路 后,其他用户才可能与 同一个接收端进行数据传输
这种服务类型存在 三个阶段 ,即
1. 数据链路 建立
2. 数据 传输
3. 数据链路 释放
就像我们打电话,我们打电话给某个人时,首先就是要拿起电话拨号(相当于 建立连接 的过程),然后对方拿起电话,问一下看是不是打错了(这就是一个 “确认” 过程)。确认不是打错的电话后,双方 开始通话
(2)有确认的无连接服务
- 不需要建立 专门的数据链路
- 接收端在接收到的每一个数据帧时都 向发送端确认
事实上是因为这类服务所用的 数据链路已建立起来 ,而且是 永久存在 的,所以 不用另外建立 ,如局域网中的链路
就像寄快递,送快递的路线早就建立好了,我们只需要寄出去,等收件人确认就好了,不用关心快递运送的路线
(3)无确认的无连接服务
- 不需要建立 专门的数据链路
- 接收端在接收到的每一个数据帧时 不需要向发送端确认
这种服务类型 看似不可靠 ,但它是建立在 可靠的通信线路基础之上 的,所以数据传输仍然是 非常可靠 的。
注意
LLC子层的 链路管理 功能 主要是针对 前面所介绍的 有确认的面向连接 服务类型
它包括三个主要阶段: 链路建立、链路保持、链路释放 。
数据链路层的这种链路连接的 建立、维持和释放 过程就是数据链路层的 链路管理功能。
在多个站点 共享同一物理信道 的情况下(例如在局域网中),如何在要求通信的站点间 分配和管理信道 也属于 数据链路管理的范畴
2、数据帧封装和透明传输
在发送端,数据链路层是 接收来自网络层的数据分组 ,而在接收端它是 接收来自物理层的比特流 ,所以数据链路层的成帧功能就包含两方面的含义:一是将来自网络层的数据分组 封装成数据帧 ,二是将来自物理层的一个个比特流 组装成数据帧
1.数据包的帧封装原理
网络层的数据包 到达数据链路层后加上数据链路层的 协议头和协议尾 就构成了一个 数据帧 。
在每个帧的前部加上一个 帧头部 ,在帧的结尾处加上一个 帧尾部 ,把 网络层的数据包 作为帧的 数据部分 ,就构成了一个完整帧。其中 帧 有 大小限制, 不同网络类型下不同 。
帧头和帧尾就是作为帧的 起始和结束标志 ,也就是 帧边界。

2.比特流的帧组装及透明传输原理
在 发送端 数据链路层中的 帧到达物理层后 就会 以比特位为单位进行传输 。发送端以比特位方式一位位地传输到接收端的物理层,然后 接收端的物理层 把比特流 向数据链路层传输 ,到达后又要将 比特流封装成数据帧 ,这就是数据链路层的帧组装方式了,其实也就是 帧同步问题 。帧同步的目的就是要使 接收端的数据链路层 对从物理层传输而来的一串串比特流 以帧为单位进行区分。
帧同步方法:
(1)字节计数法
以一个特殊字符 代表一个帧的起始 ,并以一个专门的字段来 标识当前帧内字节数 。接收端通过 对该特殊字符的识别 从比特流中 区分出每个帧的起始 ,并根据字节数,判断 帧的结尾

(2)字符填充的首尾定界符法( BSC 协议)
用一些特定的控制字符来定界一个帧的起始与结束,如在帧的头部 加上了两个SYN控制字符 ,用于标识该帧的 开始 ,在结束位置加了 ETX控制字符 ,用于标识该 帧的结束。
为了实现 透明传输, 不使数据信息中与以上 特定字符相同的字符被误判为帧的首尾定界符 ,可以在这种数据帧的帧头填充 一个转义控制字符

(3)比特填充的首尾定界符法( SDLC、HDLC 协议)
通过在帧头和帧尾各插入 一个特定的比特串 (如01111110)来标识一个数据帧的 起始 与 结束 。
而为了 透明传输 ,也就是为了避免在信息位中出现的 与帧起始和结束标志符相似的比特串 时被 误判 为帧的首、尾标志,采用了 比特填充 的方法。比如上面采用的特定模式为“01111110”,则对信息位中的任何 连续出现的5个“1” (因为帧标志符中是有5个连续“1”),发送端 自动在其后插入一个“0”
(4)违法编码法
在物理层采用 特定的比特编码 方法时采用。
例如,曼彻斯特编码方法,将数据“1”编码成“高-低”电平对,将数据“0”编码成“低-高”电平对。而高-高电平对和低-低电平对在数据比特中是违法的,因此可以 借用这些违法编码序列 来定界帧的 起始与终止 。
(5)PPP同步传输协议(点对点链路)
面向字符传输,PPP帧结构如下

- 标志(Flag):标志帧的起始或结束,值固定为 01111110 ( 0x7E )
- 协议(Protocol):表示封装的是哪个网络层协议包
透明传输:

3、差错控制
“成帧”功能解决了 帧同步问题 ,也就是接收端可以区分每个数据帧的起始和结束了,但是还没有解决 数据正确传输 的两方面问题:一是如果有 帧出现了错误 怎么办?二是如果有 帧丢失 了怎么办?
1.差错检测
(1)奇偶校验码(PCC)
一种校验代码传输正确性的方法,是根据被传输的一组二进制代码的数位中“1”的个数是奇数或偶数来进行校验的。
具体做法是:在传输的二进制 代码最后专门设置一个奇偶校验位 ,用它 控制 这组代码中1的个数为奇数或偶数(具体是偶数还是奇数,要视所采用的是偶校验还是奇校验),然后再在 接收端进行校验 ,看里面的“1”的个数是否仍 与原来一样的奇数或偶数 ,来确定数据传输的正确性。
但是奇偶校验方法只可以用来检查 单个码元错误 , 检错能力较差 ,所以一般只用于本身 误码率较低 的环境
(2)循环冗余校验(CRC)
一是要预先确定一个发送端和接收端都用来 作为除数 的 二进制比特串 (或多项式);
二是把 原始帧 与上面 选定的除 进行二 进制除法运算 ,计算出FCS。
假设比特串为n位,那么在原始帧后面加上 n-1个0 ,并用 二进制除法 除以该 比特串 ,最后的余数就是 FCS校验码 ,将FCS校验码放在原始帧最后, 接收端 拿到数据后,用 二进制除法 除以 比特串 ,若余数为0,则没有差错,反之有差错。

2.差错纠正
(1)反馈检测:
它要求 接受端 在接收到 每一个数据帧 后均要 向发送端发送 一个表示是否接收了该数据帧的 反馈信息 ,且这个反馈信息就是原来由发送端 发给接收端的原始数据帧 。发送端在收到接收端发送的反馈信息后,通过 对比保存在缓存中原来该帧的数据 来判断接收端 是否正确 接收了该数据帧。
使用了 计时器 来避免帧丢失的情况。又 给每个帧编号 ,防止由于传输线路较忙,误以为帧丢失了,发送端 重新发送 同一帧,而 接收端重复接受 的情况。
但无论如何每个数据帧实际上在信道中均被传输了两次,造成 信道利用率降低, 通常用于在 面向字符的异步传输 中
(2)自动重发请求(ARQ):
先让发送端将要发送的数据帧 附加一定的冗余检错码 (如上面介绍的PCC、CRC码)一起发送,接收端则根据检错码对数据帧进行 错误检测 ,若 发现错误 ,就 返回请求重发的响应 (不用返回全部的帧)。发送端收到 请求重发 的响应后,便 重新传送 该数据帧。
对于帧丢失的问题,发送端会在发送时引入 计时器, 发送帧的同时 启动计时器 ,若在 限定时间间隔 内没有收到接收端的 反馈信息 ,即 计时器超时 ,则可认为传的对应帧 已出错,或丢失 ,继而发送端知道要 重新发送 对应的数据帧。
具体实现方案:
1、 空闲重发请求 :
发送端每发送一帧后就要 停下来 ,然后等待接收端发来的 确认信息

2、 连续重发请求 :
发送端可以 连续发送一系列数据帧 (也不总是不断地发送,具体可以连续发送多少个帧,要视双方的 缓存空间大小 ,即窗口大小而定),即 不用等前一帧被确认便可继续发送下一帧 ,效率大大提高。
但如果有帧 错误或丢失, 有以下解决方案:
回退N帧 策略

选择重发 策略

(3)海明纠错码
可以有多个校验位,具有检测并纠正一位错误代码功能的纠错码。
将有效信息按某种规律 分成若干组 ,每组安排 一个校验位 进行 奇偶性测试 ,然后产生 多位检测信息 ,若有一个或多个组产生错误,可以通过查表,得出具体的出错位置,最后通过 对错误位取反 (也是原来是1就变成0,原来是0就变成1)来将其 纠正 。

4、流量控制
“流量控制”包括 两方面 的含义:
一是发送端的数据 发送速度与接收端的数据接收速度要匹配 ,否则接收端来不及接收就会造成数据在传输过程中的丢失。
二是发送端的数据 发送速度要与线路上的承载速率(与线路信道带宽有关)相匹配 ,否则也会造成数据在传输过程中的丢失
“流量控制”实际上是 对发送端数据传输速率的控制 ,使其数据发送速率 不超过接收端所能承受的数据接收能力 。考虑到在接收端还需要对来自物理层的比特流进行一系列的处理,如帧封装,向发送端发送返回确认帧等,所以通常是要使 发送端的发送速率略小于接收端的数据处理能力 。
控制方法:
(1)基于反馈的流量控制方案:
差错控制中的“ 自动重发请求 ”就是基于反馈的流量控制。
XON/XOFF(继续/停止):
接收端认为 不能继续接收数据 时(也就是接收端的 缓存空间满了 或者 接近满 时),接收端会向发送端发送一个 XOFF控制字符 ,当发送端收到对应的XOFF控制字符时就 停止数据的继续发送 ;当接收端可以 继续接收数据 时,接收端会再向发送端发送一个 XON控制字符 ,发送端收到这个控制字符后就知道可以 恢复数据发送 了,继续发送数据,一直这么循环下去。
(2)基于速率的流量控制方案:
基于 窗口滑动机制 的 速率控制方案。
假设发送端 缓存空间大小为3个帧, 那么发送端连着发了3个帧后,缓存空间满了,就要停止,等待接收端的确认,当发送端收到接收端对前两个帧的确认后,发送端将前两个帧从缓存空间中删去,再发送两个帧,此时缓存空间又满了,又要等待确认.....如此循环下去。
注意
流量控制并 不是数据链路层所特有的功能 ,许多高层协议中也提供流量控功能,只不过流量 控制的对象不同 而已。比如,对于 数据链路层 来说控制的是 相邻两节点之间数据链路上的流量 ,而对于 传输层 来说控制的是 从源到最终目的端之间的流量。
四、网桥和二层交换机
1、网桥
两端口 二层网络设备,用来连接 不同网段 的计算机网络设备,同时它又 可隔离冲突域 ,因为它的 两个端口不是共享一条背板总线 (分别有一条 独立的交换信道 ),比当时的集线器(Hub)性能更好(集线器上各端口都是 共享同一条背板总线的 )。
网桥除了可以 扩展网络的物理连接范围 外,还可以 对MAC地址进行分区。 但因为网桥只有 两个端口 ,故一般两个端口都是连接 集线器, 每个物理网段的主机都连接到各自的集线器上。
后来,网桥被具有更多端口、同时也可隔离冲突域的 交换机(Switch)所取代 。

物理网段 :
指IP地址属于同一网络地址段(也就是IP地址中的网络ID一样),位于 不同地理位置 的不同 LAN分段 ,是基于 物理意义上的地理区域 进行划分的。如连接的主机位于不同办公室或者不同办公楼中
网桥的工作原理:

2、交换机
交换机(Switch)可以说同时是 集线器 和 网桥 的升级换代产品,因为交换机具有集线器一样的 集中连接 功能,同时它又具有网桥的 数据交换 功能。



特性:
(1)具有多个交换端口
网桥通常只是 两个 交换端口,其设计目的主要就是用来连接两个距离超过单段网线传输限制的物理网段。
一台交换机可以有 多个端口 ,而且与网桥一样,不仅每个端口可以 连接一个不同的物理网段 (交换机上一个端口对应一个物理网段),还可以有 大量的端口 来 集中连接主机 ,这时交换机就可以同时担当 集线器和网桥 的 双重角色
(2)数据转发效率更高
集线器 发送数据是采用 广播方式 ,所以信道中的无效载荷比例相当高
交换机因为大多数主机都是 直接连接在交换机端口上 ,即使不是,也主要是连接在 其他交换机端口 ,所以数据的转发基本上都是通过 提取帧中的MAC地址 直接发送到 目的主机 上的,而不是通过广播方式(仅在未知目的MAC地址时采用广播)
(3)更强的MAC地址自动学习能力
相比网桥,只有两个端口,所以一个网桥端口要与多个源主机MAC地址之间的映射,也就是 一对多映射 关系。
而交换机上的端口多数是 直接连接主机 的,所以在映射表中基本上都是一个源主机MAC地址与一个交换端口间的 一对一映射 。一对一的映射查找起来明显比一对多的映射效率要高
工作原理:

五、介质访问控制子层(MAC)
介质访问控制子层( MAC子层 )是局域网体系结构中 划分的子层 ,对于广播型网络(如以太局域网、WLAN)是非常重要的,因为它担负了两方面的主要职责:
一是如何在局域网内 寻址 (也就是找到目的节点)
二是如何解决多路通信中 介质争用 的现象。
1、信道类型:
(1)点对点信道

(2)广播信道


MAC子层仅在 广播型网络 (如以太局域网、WLAN,以及其他无线网络)中有用,而对于 点对点型 网络中就没有存在的意义了,因为在 点对点网络中不需要寻址 ,也不存在一般意义上的 信道争用 问题
2、LLC帧和MAC帧
数据链路层有两种不同的数据帧— LLC帧 和 MAC帧 。不过,我们通常所说的“帧”一般是 指MAC帧 ,而不是LLC帧。因为从上层来的数据包,进入到LLC子层后加上 LLC子层的协议头和协议尾就形成了LLC帧 ,然后需要继续向下传输,到达MAC子层后同样再要 加上MAC子层的协议头和协议尾 ,又要进行重新封装,最终形成 MAC帧 传输到物理层。
3、MAC帧的类型
- 单播帧:目的MAC地址是一个 单播MAC地址 的帧;
- 广播帧:目的MAC地址是一个 广播MAC地址 (全“1”地址)的帧;
- 多播帧:目的MAC地址是一个 多播MAC地址
4、介质争用
CSMA介质访问控制
就是 先侦听 要访问的介质,当发现 介质忙时先避让 一段时间,不发送数据,仅当侦听到 介质空闲 时才进行数据发送。
要避让多长时间才再次侦听?这就是CSMA技术的 退避算法 。
三种退避算法:
(1)非-坚持算法
各站点不连续侦听总线介质是否空闲,即在发现介质忙时, 先停止侦听,等过一段时间再来侦听
不足:
过一段时间再监听,可能这段时间中介质存在空闲状态,降低了信道利用率

(2)1-坚持算法
“1”有 两层含义 :
一是指发现总线介质忙时一直 持续不间断侦听 ,直到发现介质处于空闲状态;
二是在侦听到介质处于空闲状态后一定 (也就是100%)发送数据。

不足:
在网络中同时有多个站点在 同一时间检测到介质空闲 (因为中间没有一个延迟,也就是一直在侦听介质状态),而 立即进行了数据发送 ,所以更容易发生冲突。
二是这种算法发现在 介质忙时一直侦听 ,占用了 大量网络 和 设备资源 。
(3)P-坚持算法
P-坚持CSMA算法是前面介绍的非-坚持CSMA和1-坚持CSMA这两种算法的 一种折中算法 ,取两者的长处,而尽量克服了两者的不足。
在侦听到介质处于忙状态时 持续侦听 ,当侦听到介质 处于空闲状态 时,此时站点却 不一定马上发送数据 ,根据 概率P (这个P值是算法事先确定好的)来选择 发送数据 ,而在另一个 (1-P)概率 的时候,即使介质处于空闲状态,也会 延迟一段时间t (这个t是指端到端的传播延时)后再重新侦听介质状态。
当有 两个或多个 正在传输数据的站点检测到 它们发送的数据发生了冲突时 ,它们都会通过 发送一个阻塞帧 (它是一个32位全为1的帧)来进行 响应, 用于 强化碰撞 , 告知总线上的所有站点 信道发生冲突。

2. CSMA/CD介质访问控制( 多点接入载波监听/冲突检测 )
由于信道传播延时的存在,即使通信双方的站点都没有侦听到载波信号,在发送数据时 仍可能会发生冲突 ,因为他们可能会在 检测到介质空闲时同时发送数据 ,致使冲突发生。尽管CSMA可以发现冲突,但它 并没有先知的冲突检测和阻止功能。

CSMA/CD的介质访问 控制原理包含四个处理内容 :
侦听、发送、检测、冲突处理 ,可以用以下几句话来概括:
❏ 先听后说 (“听”是指侦听,“说”是指发送数据,下同),边听边说;
❏ 一旦冲突 , 立即停说 ;
❏ 等待时机 , 然后再说 。
冲突检测原理:
(1)争用期: 最先发送数据帧的站,在发送数据帧后 至多经过时间 2τ (两倍的 端到端往返时延 )就可知道发送的数据帧是否遭受了碰撞。
以太网的端到端往返时延 2τ 称为争用期,或碰撞窗口。
(2) 争用期的长度
1.以太网取 51.2 微秒 为争用期的长度。
2.对于 10 Mb/s 以太网,在争用期内可发送 512 bit ,即 64 字节。
3.以太网在发送数据时,若 前 64 字节没有发生冲突,则后续的数据就不会发生冲突 。
4.以太网规定了最短有效帧长为 64 字节 ,凡长度小于 64 字节的帧都是由于冲突而异常中止的无效帧。

冲突避让原理:
(1)二进制指数类型退避算法
发生碰撞的站在停止发送数据后,要 推迟(退避)一个随机时间 才能再发送数据。
1.确定 基本退避时间 ,一般是取为争用期 2τ。
2.定义重传次数 k, k <= 10,即
k = Min[重传次数, 10]
3.从整数集合 [0,1,…, (2^k - 1)] 中随机地取出一个数,记为 r。重传所需的时延就是 r 倍的基本退避时间 。
当重传达 16 次仍不能成功时即 丢弃该帧 ,并向高层报告。
避让后,若检测到信道空闲,还要再等待 一个帧间发送间隙的时间 (9.6μs),以使网络中所有接收站点有时间准备好接收下一个帧。


原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
- 一、概述
-
二、数据链路层结构
-
1、MAC子层(介质访问控制)
-
2、LLC子层(逻辑链路控制)
-
三、主要功能
-
1、数据链路管理
- 1.数据链路层提供的服务类型:
-
2、数据帧封装和透明传输
- 1.数据包的帧封装原理
- 2.比特流的帧组装及透明传输原理
-
3、差错控制
- 1.差错检测
- 2.差错纠正
-
4、流量控制
- 控制方法:
-
1、数据链路管理
-
四、网桥和二层交换机
-
1、网桥
- 网桥的工作原理:
-
2、交换机
- 特性:
- 工作原理:
-
1、网桥
-
五、介质访问控制子层(MAC)
-
1、信道类型:
- (1)点对点信道
- (2)广播信道
-
2、LLC帧和MAC帧
-
3、MAC帧的类型
-
4、介质争用
-
CSMA介质访问控制
- 三种退避算法:
-
2. CSMA/CD介质访问控制(多点接入载波监听/冲突检测)
- CSMA/CD的介质访问控制原理包含四个处理内容:
- 冲突检测原理:
- 冲突避让原理:
-
CSMA介质访问控制
-
3、MAC帧的类型
-
1、信道类型:
-
2、LLC子层(逻辑链路控制)
-
1、MAC子层(介质访问控制)