数据链路层
为什么需要数据链路层?
在机器A把比特发送给机器B时,通信线路偶尔会出错。而且,他们只有有限的传输速率,并且在比特的发送时间和接收时间之间存在一个非零延迟。这些原因导致对物理层的比特传输有很大影响,这个时候就需要数据链路层,他完成的功能有:
1. 向网络层提供一个定义良好的服务接口
2. 处理传输错误
3. 调节数据流,确保慢速的接收方不会被快速的发送方淹没
数据链路层设计
帧
为了实现上述这些,数据链路层从网络层获得数据包,然后将这些数据包封装成帧以便传输。每个帧包含一个帧头,一个有效载荷以及一个帧尾。
成帧方法
字节计数法
在每个帧开始的位置放置一个字节表示这个帧之后还有多少字节,但是这种方式很可能因为这个特殊的帧的错误而全盘皆错,这种方法不被使用。
字节填充的标志字节法
第二种方法考虑到了出错之后的重新同步问题,在每个帧的两段加上了特殊的标志字节,这样可以区分出一个帧的开始和结束。如果在这个帧中也有这个标志字节,那么还需在帧头再加上特殊的转义字节ESC,在数据链路层把帧上盛给网络层的时候会把转义字节删除。那么问题来了,如果在帧中还有转义字节存在怎么办?答案是在帧头再加上一个转义字节,加到区分的开为止,这种技术成为字节填充技术。
比特填充的标志比特法
比特填充是字节填充的改进版,这种方法讲标志字节固定为01111110标记,而在数据中每遇到连续的五个1边在后面添加一个0来区分,在接收方会将五个1后面的0自动剔除,这样确保了0111110标记的独一无二性。
物理层编码违禁法
将物理层的4B/5B方法中剩下的那些不被使用的5位信号比特当作帧的开始和结尾。
差错控制
在可靠有连接的传输方式中,接收方应该对发送方发送的每个帧返回一个确认的特殊控制帧,表示该帧接收方已经成功接收,相对如果返回了一个否认的特殊控制帧,则表示该帧存在错误。但这其中隐含一个问题,如果该帧丢失,则发送方接收不到任何信息。为了解决这种情况,发送方在发送帧的时候附带一个计时器,发送帧开始计时,如果超出时间则重新发送。
流量控制
如果一台超级浏览器向一个小手机发送大量的数据,在未处理的情况下,这个小手机很可能被无数的数据淹没,那么这个时候就需要某种措施来确保这种情况发生。通常办法有两种:
基于反馈的流量控制
接收方给发送方返回信息,允许他发送更多的数据。
基于速率的流量控制
这种方法的协议有一种内置机制,他能限制发送方传输数据的速率,无需利用接收方反馈信息。
差错检测和纠正
纠错码
纠错码策略是在每一个被发送的帧中加入大量的冗余,以便接收方在收到信号中能推断被发送的信息是什么,即使有错误也可以纠正。一帧m个数据位和r个冗余位组成,数据块总长度为n(n=m+r),n位码字。码率为m/n。
海明码
将两个同样位数的比特串XOR,得到的1的个数即为两个码字的海明距离,如果两个码字的海明距离为d,则需要d个1位错误才能将一个码字转变成另一个码字。
经过数学的推论不需要知道具体步骤的,我们给出一个公式:
(m+r+1<=2r)
在给定m的情况下,这个条件给出了纠正单个错误所需要的校验位数的下界。海明码的校验位为2的幂次位(1、2、4、8、16…)通过对每个校验位所校验的位数进行异或,再根据奇校验或偶校验来确定每个校验位的值。在检查错误中,如果只有一个校验码异或和不符,则肯定是这个校验位本身出现了错误,如果是多个校验码出了错误,则要根据具体的情况来具体分析。
检错码
检错码再发送的时候也包含了一些冗余信息,但是这些信息只能告诉接收方,这个包中是否存在错误。
奇偶
在每段比特流的末端加上一个数字,使得整个的字段的1的个数为奇数个(或偶数个),这样最多可以检测到一位错误。
循环冗余校验码CRC
将位串看成是系数为0或1的多项式,一个k位的帧看成k-1次多项式的系数列表。其中,二进制的加减都是异或,同0异1。使用CRC时,发送方和接收方必须先规定一个生成多项式,生成多项式的长度要小于帧的长度,用帧去除以多项式,不足用0来补充,一直除到除出了原帧的长度,将余数作为校验和附加于发出帧的末尾,商数抛弃。最后发出的帧加上后面的几位校验和可以被生成式整除,如果接收端发现不能整除,则传输过程中有错误,被检查出来。
滑动窗口协议
发送窗口可发送帧,接收方接收到,发送方确认接收到帧,发送方发送下一个帧。这是滑动窗口协议的基本思维,1位滑动窗口协议(停-等协议)发送方和接收方都只有一个窗口,需要带宽小,但是效率慢。回退N协议,一次发送很多个,只要出错就从出错的地方之后的包全部重发。
数据链路协议实例
PPP
PPP的三个特性:1.一种成帧方式2.一个链路控制协议:链路控制协议LCP3.一种协商网络层选项的方式:网络控制协议NCP。
PPP是面向字节的而不是比特。
HDLC
高级数据链路控制协议HDLC面向比特填充技术。