封装成帧
接收方的数据层如何从物理层交付的比特流中提取出一个个的帧呢?
帧头和帧尾的作用之一就是 帧定界。
例如PPP帧的帧头帧尾中就含有标志了。这样就可以一个个提取了。
但是并不是每一种数据链路层协议的帧都包含有帧定界的标志。
如MAC帧就没有这个格式。
接收方是怎么接受的呢?
物理层会在MAC帧前加上一个前导码。
同时mac帧还规定了 帧间间隔,所以不需要 帧尾的定界符。
透明传输
如果在上层交付的协议数据单元中,恰好也包含了这个flag帧头帧尾的特定数值,那么接收方还能正确接受吗?答案是否定的。
接受方在接收到第一个flag帧定界标志时,认为是帧的开始。
当再次接收到时候,会误认帧结束接收了。如果数据链路层不采取措施来避免接收方对 帧 是否结束的 误判,就不能称为 透明传输。 也就是 数据链路层对上层交付的数据单元有 限制。其内容不能包含定界符。那么这样的数据链路层没有任何意义了。
解决方案:
在发送前,对数据进行扫描,如果有flag定界符,那么就会在前面插入一个esc转义字符。
这样就可以避免问题了,遇到esc之后,就会知道后面是数据而不是定界符了。剔除转义字符后,就可以自动处理了。
那么如果上层交付给数据单元的过程中,本身就含有esc这个数据那么又该怎么办呢。
方法仍然是进行扫描数据,然后加上一个esc。
esc长度为一个字节,而不是esc这三个字符。10进制值为27。
例如该方法是连续的五个1的比特后面加一个0即可,接收验证的时候直接剔除就可以了,
差错检测
传输过程可能会出现错误,一段时间内,传输错误的比特占传输比特总数的比率称为误码率BER(bit error rate)。
使用差错检测码,可以检测是否出现了差错。
循环冗余检验 CRC
需要注意的是:算法要求生成多项式必须包含最低次项,也就是每一项的最后都是1。
检错码只能检测出错,但是不能定位错误,不可以纠正错误。