链路层数据成帧方法

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


        能看出来,帧的组成主要是标志和字段两个部分,标志主要是标识了帧的开始和结束,字段部分主要有地址字段,控制字段,正文字段和校验字段四个部分。地址字段表明了帧的去向和来源,这是硬件的网卡地址,控制字段就是各种协议,正文字段是真正的信息,校验字段是用来检验帧是不是有错误,通常有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去掉一个,这样就得到了原文的数据了。

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

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值