数据链路层的成帧方法,链路层


       之前说过,数据链路层一个很重要的功能就是成帧和拆帧,因为帧是数据链路层的一个单元,数据链路层是对于帧进行处理的。那么这里就具体讲一讲数据链路层是怎么成帧的。

       首先我们应该想想成帧所涉及的问题。第一就是网络层的数据包交给链路层之后,按照怎样的格式封装成帧?第二就是,用什么来区分帧头和帧尾?也就是什么时候帧开始,什么时候结束的问题。以及,怎么看传送的帧是对的?能不能看出来帧的某个比特错了?这些都是成帧机制应该考虑的,所以帧的格式设计成如下这样:


        能看出来,帧的组成主要是标志和字段两个部分,标志主要是标识了帧的开始和结束,字段部分主要有地址字段,控制字段,正文字段和校验字段四个部分。地址字段表明了帧的去向和来源,这是硬件的网卡地址,控制字段就是各种协议,正文字段是真正的信息,校验字段是用来检验帧是不是有错误,通常有CRC校验等等。这样来看,上面的几个问题就都解决了。标志是成帧的一个重要标志,链路层读到标志,就知道帧开始了,这也就界定了一个帧的范围。对于正文字段,链路层读不懂,他也不会在意正文字段是什么,他眼中的正文也就是一串0101而已。

数据链路层成帧的方法主要有三个:字符计数法,字符填充的首尾界定法和比特填充的首尾界定法。

1.字符计数法  用一个帧的第一字节来说明帧的总长度(总长度包含这个帧头)


        看这张图,白色为帧头,指明了长度,比如第一帧长度为5,后面就跟了4个字节,第二帧的长度为5,后面也跟了4字节,之后是两个8字节长度的,所以各自跟了7字节的正文部分。但是很显然,如果头这一个字节出了问题,影响的就不仅仅是这一帧了,其他的都会出问题。比如:


        第二个帧头出了问题,那么就会出现大问题:后面的全部帧都会出错,连锁反应。所以这种方法不太常用。

        2.字符填充的首尾界定法

        在帧的头之前和尾之后加一个特殊的字符,只要读到这个字符帧就开始了,再次读到就认为这个帧结束了,如下图所示:



        这种方法能够避免上面字符计数法的头出错问题,但是他也有问题:如果正文里面出现了flag特殊字符怎么办?解决办法是在正文里面flag字符前面加上转义字符esc,这样读到flag之前如果没有转义字符esc,那么认为帧结束,如果有esc那么认为他就是普通的数据就行。问题又来了,那么正文里面如果有esc字符呢?那么就在esc前面再加一个esc就行了,这两个的处理是一样的。如下图:


      3.比特填充的字符界定法

       这种方法和第二种比较类似,区别是他把flag具体化了,为6个1。这样当正文读取的时候一旦出现了5个连续的1,那么在后面填充一个0,避免出现6个1造成帧提前结束。如下图所示:


       收端接收到之后,每读到5个连续的1之后,就把后面的0去掉一个,这样就得到了原文的数据了。

       上面三种方法就是最常见的链路层成帧的方法。


查看评论

相关内容