在上一节中,我们了解了数据链路层的三大基本服务,并且详细学习了第一大服务,也就是封装成帧,这一节的内容我们继续学习数据链路层,第二大服务——透明传输。
首先,我们解释一下,透明传输是什么意思。透明传输指的是,不管所传输的数据是什么样的比特组合,都应当能在链路上传输。说的通俗一点,核心的意思就是一个数据帧的数据部分不能和帧头帧尾的控制信息产生歧义,以免被接收方把帧进行错误定界。
我们通过一个具体的样子来感受一下。上节我们说到,通常用“SOH”作为帧头的标记,用“EOT”作为帧尾的标记,也就是下图这个样子的:

针对这种面向字节的传输,我们要实现透明传输是通过“字节填充”的办法来实现的。
字节填充
看着上面的示意图,我们提出一个这样的问题:如果数据部分就是比较普通的数据,那么使用“SOH”和“EOT”这两个特殊的不可打印字符作为帧定界,完全可以,但如果数据部分里面不单是普通的数据,它也包含一些特殊的字符信息,比如说计算机程序等信息,那么就非常有可能使得在数据部分中也出现了“EOT”这个字符,这就使得数据的接收方误以为帧的结束,就像下图表现的这样:

对于出现这样的问题,就保证不了数据的透明传输,那么怎么办呢,我们就提出了字节填充的办法。
这个办法的思想就是,如果数据中也恰好出现了产生歧义的“SOH”和“EOT”等字符,那么发送方的数据链路层就在这些歧义的字符前面添加一个转义字符“ESC”,这样使得它避免歧义,接收方的数据链路层接收的时候,再把这些转义字符去掉,就保证了透明传输。
添加转义字符之后,新的问题又来了,如果转义字符也恰好就出现在了数据部分中,也就是说原本的数据部分中出现了“ESC EOT”这样的字符,那怎么办呢,透明传输又无效了,这时候我们的解决办法是:转义字符前面再添加一个转义字符,这样当接收方收到连续的两个转义字符,就自动去掉前面一个,保证透明传输。
我们看一下字节填充法的示意图:

零比特填充
在有些数据传输的环境中,并不是面向字节的传输,比如有一个HDLC协议,它就是一个面向比特的传输协议,这时候字节填充的方法就不适用了,在这种环境中实现透明传输更适合的办法是:零比特填充。
在这种面向比特的环境中,通常我们把“01111110”作为帧的定界符。同样,如果在正常的数据部分中,也出现了一模一样的数据,就误使接收方错误的定界帧,这时候采用零比特填充的方法,在发送数据帧之前,先扫描一遍,只要发现数据部分出现了连续的5个1,就立马在5个1后面填一个0,避免它出现连续的6个1。数据到达接收方后,接收方再扫描数据部分,看到连续5个1,就把随后跟着的一个0删除掉,这就保证了数据的透明传输了。
零比特填充如下图的例子:

上述两种方法在不同的传输环境下,都起到了透明传输的作用,当然,除了这两种方法,还有其他方法,最典型的一个,就比如我们上节学过的帧同步,这也是一种方法,接收方收到帧以后,就会知道这个帧的结构了,就不会造成帧的错误定界了。
数据链路层的透明传输的内容,我们就学习这么多,下一节我们将讨论链路层差错检测的方法。
参考教材:谢希仁《计算机网络》第七版
2690

被折叠的 条评论
为什么被折叠?



