数据链路层要明确三个问题:1.数据帧怎样组织的2.怎样进行差错控制3.如何进行流量控制
![]()
差错控制:
差错控制通常有三个步骤,一个步骤就是确认,确认是对于接收方来讲,接收方没收到一个帧以后,要给发送方发送一个消息,发送方收到这一消息就知道刚发出去的帧被正确的接收了,这样一次可靠的传输就结束了,这样的确认被称为肯定的确认。如果收到的帧有问题,接收方一般有两种方法:1.扔掉不管,发送方永远也收不到确认。2.发现帧有问题,就告诉对方帧有问题,这种方式称为否定性确认。不管发什么样的确认,前提都必须经过差错控制。所以要发确认信息,就必须先进行差错控制。接收方是可以知道出错了,而且能够知道是哪一位出错了,这种方式称为纠错。在计算机网络中,如果传递的信息是m位,那发送的不只是m位,后面还要加上检错信息或者纠错信息。
在计算机网络中检错方法:
- 校验和:通常听到的校验和有8位校验和、16位校验和、32位校验和等,代表最后的检验结果是8位、16位、32位。比如是8位校验和,那么最后附加的信息量是8位。在计算机中,不管传递的是什么信息,都可以看成是二进制的比特串。现在以16位校验和为例,那就把要传递的信息分成16位一组,16位一组,然后把所有这些组的信息,每一组都看成是二进制数,把所有的二进制数加起来得到一个结果,很可能加起来的结果超过16位,把进位加到里面去,这样形成的结果是16位校验和。比如计算16位校验和,要传递“Hello world.”
计算结果为:4865H+6C6CH+6F20H+776F+726CH+642E+进位=71FCH。校验和计算起来非常简单,但是检错强度比较弱。可以看到,如果在做加法的时候,同一列上出现两个错,有一位从0变成1,有一位从1变成0(当然不是随便的两位啦~),校验和的结果是一样的,所以一般把校验和放在上层的协议里,上层的协议经过下层的检错,出错的概率比较小。像IP协议的IP包的校验就用校验和的方式校验的。
- 块校验:特殊的校验和,在同步终端中常用,同步终端是按一个键,这个键的内码存在这个终端里面,然后组织成一个帧以后再一起传送到主机,这时,主机到终端的传输也可能存在问题,也需要校验,出错的概率也是比较小的。相当于是8位的校验和,对每个字符(8位),对每个字符看成二进制比特串,进行异或运算,异或运算计算机做的非常快,用异或门就可以实现。比如还是“Hello world.”
,
- 循环冗余校验:在数据链路层,用得最多的校验方式还是循环冗余校验,像HDLC( High-Level Data Link Control,高级数据链路控制,是一个在同步网上传输 数据、面向比特的数据链路层的协议)就是用的循环冗余校验;如果拨号上网用PP协议( 点对点协议,为在点对点连接上传输多协议数据包提供了一个标准方法。PPP 最初设计是为两个对等节点之间的 IP 流量传输提供一种封装协议。在 TCP-IP 协议集中它是一种用来同步调制连接的数据链路层协议)的,PPP协议也是用的循环冗余校验;像以太网中里面的检错也是用循环冗余校验。可以通过硬件进行检错。在循环冗余校验的计算中,把每一个帧,如果这个帧有k个比特,把它看成k-1次的多项式,每个比特就看成是多项式中某个系数,
,
,
,在计算CRC校验的除法时,0-1=1。把接收到的比特串除以G(X),如果现在有一个帧是1101011011,是10个比特,看成9次方的多项式
,
,乘上X的4次方,相当于二进制比特串后面加了4个0,
,看高位为1就上1,高位为0就上0。
。
![](https://img-my.csdn.net/uploads/201210/17/1350438661_5595.png)
流量控制
在计算机网络中,通信一般是双向的通信。 先介绍单项的通信,一个发送方一个接收方。 wait_for_event(&event)函数是 等待某个事件的发生。比如数据链路层有帧过来等。
- 协议1:无限制的单工协议,在这个协议中,A和B传输的信道是理想的,即不需要差错控制,接收方的能力是无限的,即不用流量控制,就只用帧的封装了。对发送方,网络层有消息过来,封装成帧,交给物理层发送出去。这个工作是死循环while(1),问网络层有没有数据发送,如果有,就从函数中跳出。只需要把发送的数据放到帧的数据部分:
,s是帧的结构体。交给物理层就是发送,把帧作为参数发给物理层。对接收方来讲,一直等着,等到event发生,协议1数据链路之进行帧的封装,说明数据链路最简单的工作。
- 协议2:单工的等—停协议:在这个协议中,A和B传输的信道是理想的,所以不需要差错控制,但是接收方的接收能力是有限的,因此需要流量控制,发送方要接到接收方发过来的信号才可以发送,发送方发送一个消息后就不能发送了,停在那里,接收方收到发送的帧就去处理这个帧,等它处理完了,给发送方发一个确认消息,发送方收到消息后继续发送第二个消息。体现在程序里:发完了一个帧不能发送必须等待。
比协议一增加了停,等的控制。
- 协议二还是比较理想的,事实上链路肯定会出错。协议三:噪声信道的单工协议。有噪声的信道,一旦信道有噪声,就会给帧的传输出问题,问题可能是出在帧的某些数据位,出在帧头帧尾(这种情况称为帧的丢失),对于发送方来讲,都要重发,在协议二的基础上添加定时器,当发送方发完一个帧以后,启动定时器,等待确认消息,如果确认消息没收到,定时器到时了,就会起到它的差错控制机制,重发这个帧。有个问题,重发机制效率低,定时器的值一定保证帧传到对方,而且还要回来的时间。协议三里面有差错控制(帧的序号),对发送方来讲记录每个帧的序号,对于接收方来讲记录等待帧的序号,帧的序号只要一个比特(0和1)就可以了。应答号是收到的那个帧,没必要区分帧的类型,因为是单工的。