数据链路层
数据链路层的功能
在物理层所提供服务的基础上向网络层提供服务,即将原始的、有差错的区里线路改进成逻辑上无差错的数据链路,从而向网络层提供高质量的服务。它一般包括3种基本服务:无确认的无连接服务、有确认的无连接服务和有确认的有连接服务(不存在无确认的有连接服务)
为网络层提供的服务
- 无确认的无连接服务: 源机器发送数据帧时不需要先建立链路连接,目的机器收到的数据帧时不需要发回确认。对丢失的帧,数据链路层不负责重发而交给上层处理。适用于实时通信或误码率较低的通信信道,如以太网
- 有确认的无连接服务: 源机器发送数据帧时不需要先建立链路连接,但目的机器收到数据帧时必须发回确认。源机器在规定的时间内未收到确定信号时,就重传丢失的帧,以提高传输的可靠性。该服务适用于误码率较高的通信信道,如无线信道。
- 有确认的面向连接服务: 帧传输过程分为三个阶段:建立数据链路,传输帧,释放数据链路。目的机器对收到的每一帧都要给出确认,源机器收到确认后才能发送下一帧,因而该服务的可靠性最高。该服务适用于通信要求(可靠性、实时性)较高的场合
数据链路层的主要功能:
- 链路管理: 负责数据链路的建立、维持和释放,主要用于面向连接的服务
- 帧同步: 接收方确认收到的比特流中一帧的开始位置与结束位置
- 差错控制: 用于使接收方确认收到的数据就是由发送方发送的数据
- 透明传输: 就是不管数据是什么样的比特组合,都应当能在链路上传送
- 流量控制: 限制发送方的数据流量,使其发送速率不超过接收方的接受能力
封装成帧
就是在一段数据的前后部分添加首部和尾部,这样就构成了一个帧。接收端在收到物理层上交的比特流后,就能根据首部和尾部的标记,从收到的比特流中识别帧服开始和结束
组帧的四种方法
- 字符计数法: 是指在帧头部使用一个技术字段来表明帧内字符数。目的的结点的数据链路层收到字节计数时,就知道后面跟的字节数,从而可以确定帧结束的位置(计数字段提供的字节数包括自身所占用的一个字节)
这种方法问题:如果计数字段出错,即失去了帧边界划分的依据,那么接收方就无法判断所传输帧的结束位和下一帧的开始位,收发双方将失去同步,从而造成灾难性后果
- 字符填充法: 使用特定字符来界定一帧的开始与结束,控制字符SOH放在帧的最前面,表示帧的首部开始,控制字符EOT表示帧的结束。为了使信息中出现的特殊字符不被误判为帧的首尾定界符,可在特殊字符填充一个转义字符(ESC)来加以区分,接收方收到转义字符后,就知道其后面紧跟的数据信息,而不是控制信息
当传送的帧是由非ASCII码的文本文件组成时(二进制代码的程序或图像),就要采用字符填充方法实现透明传输
- 零比特填充法: 允许数据帧包含任意个数的比特,也允许每个字符的编码包含任意个数的比特。它使用一个特定的比特模式,即011110来标志一帧的开始和结束,零比特填充法很容易由硬件来实现,性能优于字符填充法
- 违规编码法: 在物理层进行比特编码时,通常采用违规编码法。如:曼彻斯特编码将数据比特“1”编码成“高-低”电平对,将数据比特“0”编码成“低-高”电平对,而“高-高”电平对和“低-低”电平对在数据比特中违规的。可以借用这些违规编码序列来定界帧的起始和终止
总结
由于字节计数法中技术字段的脆弱性和字符填充法是线上的复杂性与不兼容性,目前较常用的组帧方法是比特填充法和违规编码法
差错控制
差错的原因
传输中的差错都是由噪声引起的
- 全局性:由于线路本身电气特性所产生的随机噪声(热噪声),是信道固有的,随机存在的;解决办法:提高信噪比来减少或避免干扰
- 局部性:外界特定的短暂原因所造成的冲击噪声;解决办法:利用编码技术来解决
差错的分类
- 位错:比特位出错,1变成0,变成1
- 帧错:丢失、重复、失序
差错控制的方法
检错编码
- 奇偶校验码: 在信息码后面加一位校验码,分为奇校验和偶校验
奇校验:添加一位校验码后,使得整个码字里面1的个数是奇数。接收端收到数据后就校验数据里的1的个数,若检测到奇数个1,则认为没有出错,否则说明传输过程中,数据发生了改变,要求重发。
偶校验:添加一位校验码后,使得整个码字里面1的个数是偶数。接收端收到数据后就校验数据里的1的个数,若检测到偶数个1,则认为没有出错,否则说明传输过程中,数据发生了改变,要求重发。
只能检查出奇数个比特错误,检错能力为50%
- 循环冗余码CRC: 用较少的冗余比特使检错的可能性最大
最终发送的数据:要发送的数据+帧检验序列FCS
计算冗余码: (1)加0——假设生成多项式G(x)的最高阶为r,则加r个0
(2)模2除法——数据加0后除以多项式,余数为冗余码(FCS),CRC校验码的比特序列(同0异1)
示例: 要发送的数据是1101 0110 11,采用CRC校验,生成多项式是10011(多项式最高阶为4),那么最终发送的数据应该是?
接收端检错过程:把收到的每一帧都除以同样的除数,然后检查得到的余数R,余数为0,判定这个帧没有差错,接收,否则丢弃。
FCS的生成以及接收端CRC检验都是由硬件实现,处理很迅速,因此不会延误数据的传输。
可靠传输: 数据链路层发送端发送什么,接收端就收到什么
数据链路层使用CRC校验,能够实现无比特差错的传输,但这还不是可靠传输
注意:
数据链路层编码和物理层的数据编码与调制不同。
物理层编码针对的是单个比特,解决传输过程中比特的同步等问题;
数据链路层的编码针对的是一组比特,它通过冗余码的技术实现一组二进制比特串在传输过程是否出现错误。
纠错编码
- 海明码(动一发而牵全身): 发现双比特错,纠正单比特错。
海明码工作流程:确定检验码位数r->确定校验码和数据的位置->求出检验码的值->检错并纠错
1.确定校验码位数r
海明不等式:2r次方>=k+r+1,r为冗余信息位,k为信息位
要发送的数据:D=101101,数据的位数k=6,满足不等式的最小r为4,海明码有10位,其中原数据6位,校验码4位
2.确定校验码和数据的位置
设4位校验码分别为P1、P2、P3、P4,数据从左到右D1、D2、···D6,校验码Pi(i取1,2,3,4)在编码中的位置2i-1
3.求出校验码的值
P1+D1+D2+D4+D5=0--P1=0(个位数为1)
P2+D1+D3+D4+D6=0--P2=0(十位数为1)
P3+D2+D3+D4=0--P3=0(百位数为1)
P4+D5+D6=0--P4=1(千位数为1)
101101的海明码为0010011101
4.检错并纠错
D2改为1,第五位出错
P1+D1+D2+D4+D5=1
P2+D1+D3+D4+D6=0
P3+D2+D3+D4=1
P4+D5+D6=0
0101=5,出错位是第五位
流量控制
注意: 数据链路层的流量控制是点对点;而传输层的流量控制是端到端的。数据链路层流量控制手段:接受方瘦不下就不回复确认;传输层流量控制手段:接收端给发送端一个窗口公告
停止-等待流量控制
每发送完一个帧就停止发送,等待对方的确认,在收到确认后在发送下一个帧,如果接收方不返回应答,则发送方必须一直等待
滑动窗口流量控制
在任意时刻,发送方都维持了一组连续的允许接收的帧的序号,称为发送窗口。同时,接收方也维持了一组连续的允许接收的帧的序号,称为接收窗口。发送端每收到一个帧的确认,发送窗口就向前滑动一个帧的位置。
滑动窗口的重要特性:
- 只有接受窗口向前滑动(同时接收方发送了确认帧)时,发送窗口才有可能(只有发送方收到确认帧后才一定)向前滑动
- 从滑动窗口的概念,停止-等待协议、后退N帧协议、选择重传协议只在发送窗口大小与接收窗口大小有所差别:
停止-等待协议:发送窗口大小=1,接收窗口大小=1
后退N帧协议:发送窗口大小>1,接收窗口大小=1
选择重传协议:发送窗口大小>1,接收窗口大小>1- 接收窗口的大小为1时,可保证帧的有序接收
- 数据链路层的滑动窗口协议中,窗口大小在传输过程中是固定的
可靠传输机制
数据链路层的可靠传输通常使用确认和超时重传两种机制完成的。
确认是一种无数据的控制帧,这种控制帧使得接收方可以让发送方知道哪些内容被正确接收。
超时重传是指发送方在发送某个数据帧后就开启一个计时器,在一定时间内如果没有得到发送的数据帧的确认帧,那么重新发送该数据帧,直到发送成功为止
使用确认和超时重传两种机制实现可靠传输的策略又称为自动请求重发(ARQ)
停止-等待协议
发送方传输一个帧后,必须等待对方确认才能发送下一帧,若在规定时间内没有收到确认,则发送方超时,并重传原始帧(协议=技术+考虑不利因素,停止-等待协议=停止-等待流量控制技术+不利因素)
停止-等待协议出差错的分类
- 帧一般被分为数据帧和确认帧,第一类错误是数据帧被损坏或者丢失
- 第二类错误是确认帧被破坏丢失
后退N帧协议(GBN)
后退N帧协议基于滑动窗口流量控制技术。发送方送完一个数据帧后,不是停下来等待确认帧,而是连续再发送若干个数据帧。如果这是收到了接收方的确认帧,那么还可以接着发送数据帧。如果某个帧错了,接收方只能简单地丢掉该帧及其所有的后续帧。发送方超时后需重发该错帧及其后续所有帧
选择重传协议(SR)
选择重传协议也是基于滑动窗口流量控制技术的。若一帧出错,则其后续先存入接受方的缓冲区中,同时要求发送方重传出错帧,一旦收到重传帧后,就和原先存在缓冲区的其余帧一起按正确的顺序送至主机。选择重传协议避免了重复传输那些本来已经正确到达接收方的数据帧,进一步提高了信道利用率,但代价是增加了缓冲空间