写在前面
在听了《计算机网络概述》这节课后,感觉网络真的东西好多,兴趣使然,自己也搞了本《计算机网络 自顶向下方法》,读了一段时间,发现对其中的链路层中的差错控制很感兴趣,故也想记录一下,写一点笔记和自己的理解。
数据链路层的功能
数据链路层在物理层提供服务的基础上向网络层提供服务,其主要作用是加强物理层传输原始比特流的功能,将物理层提供的可能出错的物理连接改造成逻辑上无差错的数据链路,使之对网络层表现为一条无差错的链路。(反正这五层结构就是下层为上层打工干活就完了。)
差错控制
从上述功能也可以发现,既然要表现为一条“无差错”的链路,那么差错控制对于链路层来说无疑是一项必须完成的事情。因为在实际通信链路中,传输都不是理想的,比特在传输过程中可能会产生差错,1可能变成0,0也可能变成1,这就是所谓的比特差错。 差错控制通常利用编码技术来实现,主要分为两类:检错编码和纠错编码
检错编码
1.奇偶校验码,这个应该大家也都很熟悉,我之前没学过,不过看了之后倒也觉得挺简单。这是一种基本的校验码,由n-1位的信息元和1位校验元组成,如果是奇校验码,那么附加一个校验码后,码长为n的码字中“1”的个数为奇数;偶校验码与此类似。不过,该校验码的局限之处在于它只能检测奇数位的错误,而且不知道哪些位错了。
2.循环冗余码(CRC),又称为多项式码,其实也挺好理解,就是一个k位帧可以视为X的k-1次方到X的0次方的k次多项式(此处说k次应该是有k项,而不是数学中的根据最高次数来定的那个k),给定一个mbit的帧或报文,发送器同时也发送一个rbit的序列,称为帧检验序列,这样形成的帧将由m+r比特组成。发送方和接收方事先商定一个多项式G(x),使这个带校验码的帧正好能被预先确定的多项式G(x)整除,接收方用同样的多项式去除收到的帧,如果无余数,则认为无差错。看到这,细心的小伙伴可能发现了,循环冗余码好像是具备纠错功能的,为什么会放在检错编码里呢? 事实上,数据链路层仅仅使用了它的检错功能,即检测到帧出错就直接丢弃。
纠错编码
海明码是最常见的纠错编码,其实现原理是在有效信息位中加入几个校验位形成海明码,并将海明码的每个二进制分配到几个奇偶校验码中。当某一位出错后,就会引起有关的几个校验位的值发生变化,这个不但可以发现错位,还能够指出错位的位置,方便纠错。不过由于本人才疏学浅,到现在也还略微有点看不太明白其具体过程,故在这里引用一位CSDN博主的文章:海明码(汉明码)详解
大家感兴趣可以点进去看看其详细过程。