数据链路层,不只是链路|CN-2
数据链路层的功能
易混淆的功能负责层:
- 电路管理功能是由物理层提供
- 控制对物理介质的访问由 数据链路层的介质访问控制子层(MAC) 提供
为网络层提供服务
数据链路层需要将源机器中来自网络层的数据传输到目标机器的网络层,通常可为网络层提供以下服务:
| 服务名称 | 特性 | 适用情况 | 举例 |
|---|---|---|---|
| 无确认的无连接服务 | 无需建立链路连接,目标机器收到数据帧也无需确认,丢失帧不上报 | 实时通信或误码率较低的通信信道 | 以太网 |
| 有确认的无连接服务 | 目标机器收到数据帧需要确认,未收到确认时重发丢失帧 | 误码率较高的通信信道 | 无线通信 |
| 有确认的面向连接服务 | 建立数据链路→传输帧→释放数据链路。目标机器每一帧都确认 | 通信要求(可靠性、实时性)要求高 | - |
❌不存在无确认但面向连接的服务❌
链路管理
数据链路层建立、维持和释放的过程即为 链路管理,它主要用于面向连接服务.
帧定界、帧同步与透明传输
两台主机之间传输信息时,必须将网络层的分组封装成帧,以帧的格式进行传送。
将一段数据首尾分别添加首部和尾部就构成帧,首尾部包含了许多控制信息,它们的一个重要作用就是确定帧的界限,即 帧定界。
帧同步是指接收方应能够从接受到的二进制比特流中区分出帧的起始与终止。
如果在数据中恰好出现了与帧定界符相同的比特组合就会出现错误,而解决该问题就需采取一些措施,即 透明传输。
流量控制
收发双方各自的工作效率和缓存空间的差异可能导致 发送方发送能力大于接收方接收能力从而接收方漏接数据 的情况。为解决此类问题,通常我们需要特别针对发收方进行其发送速率的限制,这就是流量控制。
流量控制并非数据链路层独有,但高层的流量控制的对象与数据链路层不同。
数据链路层控制的是相邻结点间数据链路上的流量,而运输层则是针对源端到目的端的流量。
👉🏻在OSI体系结构里,数据链路层具有流量控制功能,而TCP/IP体系结构中被移到了传输层
差错控制
为了避免因信道噪声等影响致使的帧数据错误发生(位错与帧错),在发收方之间应采用一定的方法进行控制,这就是差错控制。
组帧的方法
目前较为常用的组帧方法是 比特填充法 和 违规编码法
字符计数法
在帧头部使用一个计数字段标明帧内字符数,以此确定帧的结束位置。
注意:计数字段提供的字节数包含有自身所占用的一个字节
字符计数法最大的问题是当计数字段出错时,就完全失去了帧边界划分的依据,结束位与下一帧的开始位模糊,失去同步,从而造成灾难性后果。

字符填充法
用特殊字符来定界一帧的开始与结束
帧首部:SOH(Start of Head)
帧尾部:EOT(End of Transmission)
通过在数据位中出现与定界字符的相同字符前填充转义字符(ESC) 实现透明传输
字符填充法,也被称为 字符填充的首位定界符法。
因为它通过转义字符对数据进行处理,所以能很好地实现透明传输。对于为了避免冲突而填充的转义字符,接收方接到之后会自己删除,结果仍为原来的数据。特别地,如果数据中也有和转义字符相同的字符,那么解决方法仍然是再在目标字符前填充转义字符以消除。
下面是一个简单的示例:
其中,蓝色字符表示 字符填充法中使用的特殊字符,灰色字符表示传输的信息中出现的与特殊字符相同的字符(即不应该被当作特殊字符处理的字符)
零比特填充法
通过 01111110 填充至首尾来标志帧的开始和结束,并不对帧内比特数有限制
当信息位的比特流中出现连续5个 1 时自动在其后填充一个 0 ,以此实现透明传输
下面给出示例:
1 | 数据: 11011111111110010 |
💦零比特填充的首尾标志法 很容易由硬件实现,性能优于字符填充法
违法编码法
将物理层编码时未用到的“违法”编码方式进行帧定界
👉🏻局域网 IEEE 802 标准 采用了该方法
例如,曼彻斯特编码方法将数据比特 1 编码为 “高-低”电平,0 编码为 “低-高”电平。
那么,“高-高” 和 “低-低” 电平 就可用于帧定界。
违法编码法不需要采用任何填充技术,但是它只适用于采用冗余编码的特殊编码环境。
差错控制
在实际的通信链路中,因为各种原因可能会导致数据的传输差错。其中,比特差错是传输差错的一种,比特差错描述的是比特流中的 1 变成了 0 和 0 变成了 1 的情况。
针对这类差错,主要有两类差错控制方法:
- 自动重传请求 (Automatic Repeat reQuest,ARQ)
- 前向纠错(Forward Error Correction,FEC)
在 FEC 中,接收端不仅能检测到差错,还能确定比特流错误的位置从而加以纠正。因此,差错控制据此也分为 检错编码 和 纠错编码。
检错编码
- 奇偶校验码:添加一位校验元,使得包含校验元在内的长为 的码字中“1”的个数为奇数,则是奇校验。该方法只能检验奇数位的出错情况,还不知道是哪一位出错。
- 循环冗余码(Cyclic Redundancy Code,CRC)
注:CRC校验是拥有纠错功能的,只是数据链路层只使用了其检错功能,检测到出错就丢弃。
关于CRC的计算方法以及背后的数学原理,乃至硬件实现与编程实现,可以移步到本站文章:
纠错编码
最常见的纠错编码是 海明码|Hamming Code,也叫汉明码。
我们知道,在信息传输时为了加入纠错功能,需要引入冗余码,所以加入更少的冗余码的同时又能实现纠错就是一个值得思考的数学课题。
海明码的位数
假设现有 的数据需要传输,且出错位数最多为1位. 那么我们可以得出出错的可能性就是 16,而为了描述具体的出错位置,我们至少需要利用 位信息对其进行表征。
该例子利用 信息论 的知识,按照香农的思想得出了冗余码位数的下限,而汉明码巧妙在它正好符合这个下限。
因此,海明码的位数要求:
其中, 为信息位, 为校验位。
海明码核心策略
海明码的核心思想就是通过有限次的奇偶校验从而锁定出错的数据位的位置。这与数独游戏、扫雷游戏十分类似。而校验位的个数则规定了奇偶校验的次数。
也就是说,每个校验位“管辖”一部分信息位的奇偶性(这些信息位也会交叉地同时被其他校验位管辖),当发现奇偶校验不符时,就可以判断出被管辖的这堆信息位中存在差错,再和其他校验位得出的信息进行综合比较,最后就能得到各校验位的信息,得出出错的数据位的准确位置。
但是思想简单,如何分配“管辖区域”使得校验位最少却是难题。海明码的精妙之处也正在于此。
校验位的位置
海明码要求,将每一个校验位依次放置在下标为 的位置。即要求校验位的下标的二进制码只有一位是1 ,其余都是0.
例如第一个校验位的下标是,即为 0001. 类似的,就有 0010,0100,1000 共4个校验位,那么根据上面的公式,令,我们可以推测出最多可以用来检验 的信息。
神奇的是,共 16 位的传输数据中,必然有8组数据是以 xxx1 为下标,有8组数据是以 xx1x 为下标,依次类推。而这就成为了每一个校验位的管辖依据!
检错与纠错
默认偶校验 我们对除 0001 以外,其他下标是 xxx1 的数据进行奇偶校验(异或),从而确定 0001 处校验位的值。以此类推,我们就可以填充完所有 4 个校验位。
接收方收到数据后,检验这 4 位是否符合奇偶性,就能判断是否出错。并且,如果出错还能确定位置。
比如,我们发现 xxx1 组出错,那么我们可以确定出错的数据其下标一定是 xxx1 型,如果该组没有出错,那么可以断定出错下标的要么是xxx0 型,要么整个数据都没有出错。
这样依次判断 xx1x,x1xx,1xxx 组是否出错,综合以上结果我们就能确定出错数据的具体下标了。找到错误位之后,对这一位取反即可还原出原始数据,实现纠错。
实现算法
至此,汉明码的核心思路已经讲解终了。而事实上,接收方还有一种更快速更优雅的检验错位的方法。
你或许会觉得接收方对每一组都进行一次奇偶检验十分繁琐,那么神奇的异或操作将解决这个问题。
我们知道,对于每一组验证奇偶性时,只需将校验位一起与该组内所有数据进行异或操作即可,结果为0就表示没问题。回忆前面我们说如果第一组结果没问题,那么出错的下标就是 xxx0 型。那么,第 组的异或结果可以直接用来确定错误位二进制下标的第 位。
现在我们来考虑这样一个实例。
- 假设校验位的位置下标为
0001,其组内值为1的数据下标有:0011,1111。那么错误位的下标最后一位一定是 的最后一位。 - 假设校验位的位置下标为
0010,其组内值为1的数据下标有:0011,0110。那么错误位的下标倒数第二位一定是 的倒数第二位。
而我们知道,。所以,上面这两组运算可以结合成一个运算:
而错误位下标的最后两位就是该结果的最后两位。
更进一步地,只要我们将值为 1 的数据的下标按位异或,我们直接可以确定出错误位的下标!在 Python 中甚至一句代码就能完美实现:
1 | from functools import reduce |
更形象更精彩的讲述强烈推荐参看下列视频!
流量控制
流量控制涉及对链路上的帧的发送速率的控制,以使接收方有足够的缓冲空间来接受每个帧。
常见的方式有两种:停止-等待流量控制和滑动窗口协议。
停止-等待流量控制
发送方每发送一个帧就等待接收方的应答信号,若接收方不反馈则发送方一直等待。每次只允许发送一帧,然后就陷入等待确认信息的过程中,所以传输效率很低。
滑动窗口流量控制
数据链路层的可靠传输通常使用确认和超时重传两种机制来完成,这种控制帧使得接收方可以让发送方知道哪些内容被正确接收。有些情况下为了提高传输效率,将确认捎带在一个回复帧中,称为捎带确认。超时重传是指发送方在发送某一个数据帧以后帧,直到发送成功为止。 就开启一个计时器,在一定时间内如果没有得到发送的数据帧的确认帧,那么就重新发送该数据。
自动重传请求(Auto Repeat reQuest,ARQ),通过接收方请求发送方重传出错的数据帧来恢复出错的帧,是通信中用于处理信道所带来差错的方法之一。
传统自动重传请求分为三种:
- 停止-等待(Stop-and-wait)ARQ;
- 后退 帧(Go-bck-n)ARQ;【累积确认】发送窗口:
- 选择性重传SR(Selective Repeat)ARQ。【只重传一个帧】发送窗口:
后两种协议是滑动窗口技术与请求重发技术的结合,由于窗口尺寸开到足够大时,帧在线路上可以连续地流动,因此又称其为连续ARQ协议注意,注意ARQ中的三种实现方法,不仅应用于数据链路层,而且也应用于传输层的流量控制之中。
介质访问控制
介质访问控制(Medium Access Control) 简称 MAC。 是解决当局域网中共用信道的使用产生竞争时,如何分配信道的使用权问题。
信道划分
信道划分介质访问控制(MAC Multiple Access Control )将使用介质的每个设备与来自同一通信信道上的其他设备的通信隔离开来,把时域和频域资源合理地分配给网络上的设备。
下面介绍多路复用技术的概念。当传输介质的带宽超过传输单个信号所需的带宽时,人们就通过在一条介质上同时携带多个传输信号的方法来提高传输系统的利用率,这就是所谓的多路复用,也是实现信道划分介质访问控制的途径。多路复用技术把多个信号组合在一条物理信道上进行传输,使多个计算机或终端设备共享信道资源,提高了信道的利用率。
信道划分的实质就是通过分时、分频、分码等方法把原来的一条广播信道,逻辑上分为几条用于两个结点之间通信的互不干扰的子信道,实际上就是把广播信道转变为点对点信道。
- 频分多路复用(FDM):所有用户在同样的时间占用不同的带宽(频率带宽)资源。为防止干扰,相邻信道之间需设置“保护频带”。
- 时分多路复用(TDM):每个用户在一个TDM帧中占用固定序号的时隙,所有用户轮流占用信道。而统计时分多路复用(STDM)在此基础上进行改进,采用按需动态分配时隙策略。
- 波分多路复用(WDM):波分多路复用就是
光的频分多路复用,在一根光纤中传输多种不同波长(频率)的光信号,由于波长(频率)不同,所以各路光信号互不干扰,最后再用波长分解复用器将各路波长分解出来。 - 码分多路复用(CDM):采用不同的编码来区分各路原始信号。
码分多址
码分多址(Code Division Multiple Access, CDMA)是码分复用的一种方式。
其原理是每个比特时间再划分为 个短时槽,称为码片(chip),通常 取 64 或 128. 每个站点被指派一个唯一的 位码片序列,若想发送1,则站点发送它的码片序列;想发送0,则发送码片序列的反码。当多个站同时发送时,各路数据在信道中进行线性相加,到达目的地后再分解开来,为此需要每个站点的序列都相互正交。
形式化表示如下:
设 为站点 的码片向量, 为站点 的码片向量。则它们的规格化内积为0(内积数以码数),即:
此外还要去码片向量自身规格化内积为1,即,这也使得码片向量的每一位都有
当 同时发送数据到 站点时,信道内将它们的码片序列进行线性相加。
如, 欲发送一位比特, 欲发送一位比特,其中
则叠加后的向量为:.
其中 为指示函数,有:
信道的叠加向量 到达 之后,若 想获得 向它发出的数据,只需将得到的向量与 的码片向量作内积即可。
下面给出一实例予以说明。
若
而站点 要发送1, 要发送0,则:
到达 之后,再将 与 内积,得:
故,可得出 发送的数据为1.
随机访问
在随机访问协议中,不采用集中控制方式解决发送信息的次序问题,所有用户能根据自己的意愿随机地发送信息,占用信道全部速率。
在总线形网络中,当有两个或多个用户同时发送信息时,就会产生帧的冲突(碰撞,即前面所说的相互干扰),导致所有冲突用户的发送均以失败告终。为了解决随机接入发生的碰撞,每个用户需要按照一定的规则反复地重传它的帧,直到该帧无碰撞地通过。
这些规则就是随机访问介质访问控制协议,它们的核心思想都是:胜利者通过争用获得信道,从而获得信息的发送权。因此,随机访问介质访问控制协议又称争用型协议。
常用的协议:ALOHA 协议、CSMA协议、CSMA/CD 协议和CSMA/CA协议等。
如果介质访问控制采用信道划分机制,那么结点之间的通信要么共享空间,要么共享时间,要么两者都共享。
而如果采用随机访问控制机制,那么各结点之间的通信就可既不共享时间,也不共享空间。所以随机介质访问控制实质上是一种将广播信道转化为点到点信道的行为。
纯 ALOHA 协议
纯ALOHA协议思想:不监听信道,不按时间槽发送,随机重发。
可以理解为:当网络中的任何一个站点需要发送数据时,可以不进行任何检测就发送数据。如果在一段时间内未收到确认,那么该站点就认为传输过程中发生了冲突。发送站点需要等待一段时间后再发送数据,直至发送成功。
假设网络负载为( 时刻所有站点发送成功和未成功而重传的帧数),则纯 ALOHA 网络的吞吐量 ,当 时,,这是它能达到在最大值。
可见,纯 ALOHA 网络的吞吐量很低。
时隙 ALOHA 协议
时隙ALOHA协议的思想:把时间分成若干个相同的时间片,所有用户在时间片开始时刻同步接入网络信道,若发生冲突,则必须等到下一个时间片开始时刻再发送。
时隙 ALOHA 协议避免了用户发送数据的随意性,减少了数据产生冲突的可能性,提高了信道的利用率。
CSMA 协议
载波监听多路访问协议 CSMA(carrier sense multiple access)
CS:载波侦听/监听,每一个站在发送数据之前要检测一下总线上是否有其他计算机在发送数据。
MA:多点接入,表示许多计算机以多点接入的方式连接在一根总线上。
载波监听的原理:
当几个站同时在总线上发送数据时,总线上的信号电压摆动值将会增大(互相叠加)。当一个站检测到的信号电压摆动值超过一定门限值时,就认为总线上至少有两个站同时在发送数据,表明产生了碰撞,即发生了冲突。
协议思想:发送帧之前,监听信道。
根据监听方式和信道忙后的处理方式,CSMA协议又分三种。
| 特点 | 1-坚持CSMA | 非坚持CSMA | p-坚持CSMA |
|---|---|---|---|
| 信道空闲 | 立即发送 | 立即发送 | 以概率 发送,以 推迟到下一时隙 |
| 信道忙 | 继续坚持监听 | 放弃监听,等待一个随机时间再监听 | 持续监听,直到信道空闲 |
| 优点 | 避免了媒体利用率的损失 | 可以减少冲突发生的可能性 | 综合前2个的优点 |
| 缺点 | 假如有两个或两个以上的站点有数据要发送,冲突就不可避免 | 可能存在大家都在延迟等待过程中,使得媒体仍可能处于空闲状态,媒体使用率降低 | 发生冲突后还是要坚持把数据帧发送完,造成了浪费。 |
CSMA/CD 协议(碰撞检测)
载波监听多点接入/碰撞检测| CSMA/CD(carrier sense multiple access with collision detection)
CS:载波侦听/监听,每一个站在发送数据之前以及发送数据时都要检测一下总线上是否有其他计算机在发送数据。
MA:多点接入,表示许多计算机以多点接入的方式连接在一根总线上。 应用于:总线型网络
CD:碰撞检测(冲突检测) ,“边发送边监听”,适配器边发送数据边检测信道上信号电压的变化情况,以便判断自己在发送数据时其他站是否也在发送数据。 应用于:半双工网络
CSMA/CD 协议的主要作用就是为了在检测到信号发送碰撞后及时停止发送。
争用期
为了分析站点所发出的数据帧会不会发送碰撞,如何检测是否发生了碰撞,我们引入争用期的概念。
如图所示,当站点 欲向站点 发送数据帧时,可能的情况如下。

站点从发送帧开始,最多经过时长 (即 )就可检测出所发送的帧是否遭遇了碰撞。
因此,共享总线以太网的端到端往返时间 被称为争用期(Contention Period) 或碰撞窗口(Collsion Window) ,它是一个非常重要的参数。
共享总线以太网(传统以太网)规定,争用期 的值为 512 比特的发送时间,则争用期。
最小帧长
为了确保共享总线以太网上的每一个站点在发送完一个完整的帧之前,能够检测出是否产生了碰撞,帧的发送时延就不能少于共享总线以太网端到端的往返时间,即一个争用期。
所以,根据上述推导,我们知道,若已知信道的数据传输率,争用期,则在一个争用期内能够传输的帧长即为 ,而这就是最小帧长。
即:最小帧长 = 总线传播时延 x 数据传输速率 x 2
对于 的共享总线以太网,争用期的值为,因此其最小帧长为:
当某个站点在发送帧时,如果帧的前 没有遭遇碰撞,那么帧的后续部分也就不会遭遇碰撞。也就是说,如果遭遇碰撞,就一定是在帧的前 之内。
由于发送帧的站点边发送帧边检测碰撞,一旦检测到碰撞就立即中止帧的发送,此时已发送的数据量一定小于。因此,接收站点收到长度小于 的帧,就可判定这是一个遭遇了碰撞而异常中止的无效帧,将其丢弃即可。
最大帧长
帧太长也会导致信道利用率下降,所以以太网 V2 规定有 MAC 帧长的最大限制。如下图所示。

指数退避算法

CSMA/CA 协议(碰撞避免)
载波监听多点接入/碰撞避免 | CSMA/CA(carrier sense multiple access with collision avoidance)
为什么使用CSMA/CA协议
虽然CSMA/CD协议已成功地应用于有线连接的局域网,但无线局域网不能简单地搬用CSMA/CD协议。其主要原因是:
- 第一,
CSMA/CD协议要求一个站点在发送本站数据的同时还必须不间断地检测信道,以便发现是否有其他的站也在发送数据,这样才能实现“冲突检测”的功能。但在无线局域网的设备中要实现这种功能花费过大。 - 第二,更重要的是,即使能够实现冲突检测的功能,且在发送数据报时检测到信道是空闲的,但是,由于无线电波能够向所有的方向传播,且其传播距离受限,在接收端仍然有可能发生冲突,从而产生隐藏站问题和暴露站问题。
- 此外,无线信道还由于传输条件特殊,造成信号强度的动态范围非常大。这就使发送站无法使用冲突检测的方法来确定是否发生了碰撞。
- 因此,无线局域网不能使用CSMA/CD协议,而是以此为基础,制定出更适合无线网络共享信道的载波监听多路访问/冲突避免CSMA/CA协议。CSMA/CA协议利用ACK信号来避免冲突的发生,也就是说,只有当客户端收到网络上返回的ACK信号后,才确认送出的数据已经正确到达目的 。
主要思想
采用该协议要求设备要主动避免冲突而非被动侦测的方式来解决冲突问题。避免冲突的方法主要有两个:
1、监听到信道空闲时,并不是立即发送,而是等待一段时间再发送数据。
2、先发送一个很小的信道侦测帧RTS,如果收到最近的接入点返回的CTS,就认为信道是空闲的,然后再发送数据
协议的主要流程如下:
- 首先检测信道是否有使用,如果检测出信道空闲,则等待一段随机时间后,才送出数据
- 接收端如果正确收到此帧,则经过一段时间间隔后,向发送端发送确认帧ACK。
- 发送端收到ACK帧,确定数据正确传输,在经历一段时间间隔后,再发送数据。
轮询访问|令牌传递协议
2️⃣ 令牌传递协议又称“标记传送”,局部网数据送取的一种控制方法,多用于环形网。
- 令牌由专用的信息块组成,典型的令牌由连续的 8 位
1组成。 - 当网络所有节点都空闲时,令牌就从一个节点传送到下一个节点;当某一节点要求发送信息时,它必须获得令牌并在发送之前把它从网络上取走,一旦传送完数据,就把令牌转送给下一个节点,每个节点都具备有发送/接收令牌的装置。
- 使用这种传送方法决不会发生碰撞,这是因为在某一瞬间只有一个节点有可能传送数据。最大的问题是令牌在传送过程中丢失或受到破坏,从而使节点找不到令牌从而无法传送信息。
- TCU:环接口干线耦合器。它的主要作用是传递经过的所有帧,为接入站发送和接收数据提供接口。它的状态有两种:收听状态和发送状态。
- 注:没有人使用令牌时,令牌则在环路中循环。

局域网
IEEE 802.3 以太网
无连接、不要求确认、曼彻斯特编码
IEEE 802.11 无线局域网|WiFi
基本服务集中基站(base station)、接入点(Access Point,AP)
- 802.11帧的地址字段
| 去往AP | 来自AP | 地址1 | 地址2 | 地址3 | 地址4 |
|---|---|---|---|---|---|
| 0 | 1 | 接收地址=目的地址 | 发送地址=AP地址 | 源地址 | - |
| 1 | 0 | 接收地址=AP地址 | 发送地址=源地址 | 目的地址 | - |
帧间间隔(IFS: interframe space)
为了尽量避免碰撞,802.11规定,所有的站在完成发送后,必须再等待一段很短的时间(继续监听)才能发送下一帧。这段时间的通称是帧间间隔IFS。
帧间间隔的长短取决于该站要发送的帧的类型。高优先级的帧需要等待的时间较短,因此可以优先获得发送权,但低优先级帧就必须等待较长的时间。若低优先级帧还没来得及发送而其他高优先级帧已发送到媒体,则媒体变为忙态因而低优先级帧就只能再推迟发送了。这样就减少了发生碰撞的机会。至于各种帧间间隔的具体长度,这取决于使用的物理层特性。
IFS提供对无线介质访问的不同优先级来进行划分的,不同优先级按照IFS的时间长短来进行划分,时间越短,表示其对应的优先级越高,帧间间隔的时间从小到大列出如下:
SIFS:短帧间间隔。SIFS是最短的时间区段,用来间隔需要立即响应的帧,如控制帧(RTS/CTS/ACK)等。在帧交换顺序地两次传输之间使用最短间隔,可以防止其它正在等待介质的站点试图使用介质。
PIFS:点协调帧间间隔,只能够由工作于PCF模式的站点来使用。
DIFS:分布协调帧间间隔,是最长的IFS,只能够由工作于DCF模式的站点来使用。
EIFS: 在前一帧出错的情况下,发送节点 不得不延迟 EIFS 而不是DIFS时间段,再发送下一帧。





