在学习数据通信时需要首先明确一点:现有的计算机网络链路其实都不是理想、安全的通信线路,受到来自网络内部或者网络外部的各种因素影响,帧在链路上进行传输时,有一定概率会产生差错。总而言之,这种差错主要分为两个大类,一类叫作“比特差错”,是指数据比特在传输过程中,二进制的0可能会变成1,1可能会变成0;另一类叫作“传输差错”,相对于比特差错而言,传输差错要更复杂一些,它是指数据比特没有出错,但是所传输的帧可能会出现丢失、重复或未按序到达等错误,对应的名称分别为帧丢失、帧重复及帧失序。本小节中提到的差错,均是指比特差错,即数据链路层要对可能出现的二进制字符错误加以检测和控制。
1.误码率
误码率(Bit Error Rate,BER)是指在一定时间内,传输出错比特的数量占传输比特总数的比率。如果误码率为10-12,则表示每传送1012个比特时,就会出现一个出错的比特。我们可以通过提高信噪比的方式来降低误码率,但误码率不可能降到零,因此,必须在数据链路层上采取某种技术方法,来对潜在存在的比特错误进行实时检测。
2.循环冗余检验
循环冗余检验(Cyclic Redundancy Check,CRC)是目前数据链路层中广泛采用的比特检错技术。其整体设计思想是在发送方的数据链路层为将要发送的数据尾部添加若干位的冗余码,接收方的数据链路层会利用冗余码对数据在传输过程中是否出现比特错误进行检测和判断,并做出相应的处理动作。
1)循环冗余检验的工作原理
循环冗余检验的工作原理要分别从发送方和接收方两个角度进行阐述。假设循环冗余检验的冗余码长度为n位,在工作开始之前,数据发送方与接收方首先需要商定一个长度为n+1位的字符串P,然后分别按照如下流程进行操作。
(1)在发送方。
①将准备发送的数据进行分组,假设每组包含k个比特。
②在待发送数据m的尾部添加n个0(其实是进行了一个2n与m的模2乘法运算,相当于在m尾部添加n个0),形成k+n位的新数据M。
③以M为被除数,以P为除数,按照模2运算规则进行除法运算,得到商Q和余数R。其中,R的长度也为n。
④将R附加在m的尾部,形成k+n位的新数据N,将其发送出去。
(2)在接收方。
以接收到的数据N为被除数,以P为除数,进行模2除法运算,并对结果进行分析,如果余数为0,则判定这个帧没有出错,将其接收;如果余数不为0,则判断该帧出错,将其丢弃。
2)一个循环冗余检验的应用实例
现在假设要发送一个数据m=101001,发送方与接收方事先约定除数P=1101,可知k=6(数据m的位数),n=3(比除数P的位数小1)。按照循环冗余检验的运算规则,以M=101001000(k+n=9位)为被除数,以P=1101为除数进行模2除法运算,运算过程如图3-7所示。
(www.xing528.com)
图3-7 求解冗余码的模2除法运算过程
经模2除法运算,得到商Q=110101,余数R=001。此处,商Q仅作为一个过程数据出现,对循环冗余检验本身没有实际意义。余数R是我们想要的结果,即冗余码。于是,将冗余码001拼接到数据101001尾部,得到数据N=101001001,一并发送出去。其中,为了进行差错检验而添加的这个冗余码(即余数R)被称为帧检验序列(Frame Check Sequence,FCS)。
接收方在收到数据后,进行循环冗余检验。假定数据在传输过程中无误,接收方正确接收到数据101001001。接下来,接收方以数据101001001作为被除数,以P=1101为除数,进行模2除法运算,其余数一定为0(关于这一点,读者可以自行检验),接收方可据此判定数据在传输过程中没有出现错误,将其正常接收。若余数不为0,则判定数据出错,将其丢弃。
3)循环冗余检验的不足
(1)如果想在数据链路层利用循环冗余校验进行差错检验,则必须以帧为单位进行数据传输。先将数据划分为多个帧,然后在每一个帧的后面都加上不同的冗余码,再发送出去。接收方逐帧进行差错检验。
(2)在正常发送的数据后面增加了冗余码,会给网络数据传输带来额外开销,但在一个可能会出现传输错误的环境下应用循环冗余校验以保障数据的正确传输所付出的代价是值得的。
(3)发送端帧校验序列的生成和接收端的循环冗余检验会增加一些时间开销,但上述过程均是利用硬件完成的,运算速度非常快,给数据传输带来的延迟非常微小。
(4)循环冗余检验只能对某一帧是否出错进行判定,但是不能确定错误发生的具体位置或者那几位上。循环冗余检验只能对是否出错进行判断,但却不能对错误进行纠正,对错误的纠正,由其他高层负责完成。
(5)假设帧在传输过程中出现了错误,但接收方在进行校验时,得到的余数R依然为0的概率是存在的,但是这个概率非常低,不在本书的讨论范围之内。
3.比特错误与非比特错误
通过前文的分析可知,在数据链路层若仅仅使用循环冗余校验技术进行差错检验,则只能做到对帧的无差错接受(注意,不是无差错接收),即凡是被接收端的数据链路层接受的帧,在传输过程中没有出错的概率非常接近1。对于在传输过程中出错的帧,虽然被接收端的数据链路层接收了,但是并没有向上递交给网络层,而是判断出错后直接丢弃,并没有被网络层接受。所以可以这样认为:凡是被接收端数据链路层接受的帧都是无差错的帧。
但是,数据链路层并没有向网络层提供“可靠传输”的保障。通过循环冗余检验技术,数据链路层能够非常接近1地保障所传输的数据不出现比特差错,但是对于帧传输过程中可能出现的非比特差错,循环冗余检验技术却无法提供解决办法。除比特差错外,在传输过程中还可能会出现帧丢失、帧重复及帧失序等差错,所以,无比特差错并不等于无传输差错,二者并非同一概念。
在网络通信线路质量较差的年代,OSI七层协议认为,必须让数据链路层向上提供可靠传输服务,因此,在循环冗余检验的基础上又增加了帧编号、帧确认和帧重传等机制,但是,现在大部分的网络通信线路质量已经大大提高了,相应的差错检验策略也进行了调整,具体做法如下:
对于通信质量良好的有线传输线路,数据链路层不使用确认和重传机制,即不要求数据链路层向上提供可靠传输的服务。此时,如果出现传输错误,那么改正错误的任务交由更高层协议来完成。
对于通信质量较差的无线传输线路,数据链路层协议使用确认和重传机制,向更高层提供可靠传输服务。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。