一:数据链路层的组帧:
组帧:网络层的IP数据报向下传送至数据链路层,成为数据链路层的数据单元,给数据单元加上首部和尾部,就组成数据链路层的一个帧。如图所示:
其中规定数据链路层帧的数据单元所能传送的最大数据长度(Max Transfer Unit),j加首部和尾部的最重要的作用就是帧定界。
特别的当帧的数据部分完全是由ASCII码编码形成的文本文件时,帧的首部和尾部可以使用特殊的帧界定符。即:
在ASCII码中规定SOH(start of headline)为标题首部,在数据链路层规定为帧的首部,EOT (end of transmission)为传输结束,在数据链路层规定为帧的尾部,其中SOH的十六进制为01,EOT的十六进制为04。当帧的数据部分不是完全由ASCII码编码的文本文件时我们则不可以使用这种方法来规定首部和尾部。
二:数据链路层的组帧上的透明传输:
由上面如果我们传送的帧数据部分完全是由ASCII码编码的文本文件时,使用SOT和EOT作为帧的首部和尾部是非常适合接收端识别每一个帧,和每一个帧里面包含的数据部分。当时当我们帧的数据部分不在完全是由ASCII码编码的文本文件时,数据部分传送的是图片和二进制计算机程序时,我们很难保证每一帧的数据部分没有和SOT和EOT一样的十六进制编码,如果数据部分出项十六进制的04,接收端在收到数据时,会错误的判断改帧一结束。
这种情况不是我们希望看见的。所以我们引入了一些方法来,最大程度上支持数据链路层的透明传输特性。
方法一:字符填充法
字符填充法和我们再写代码时的转义字符一样。比如再上图中,帧的数据部分爷出现了SOH,我们在其前加一个转义字符ESC。 数据链路层的发送发在发送帧时,会查看帧的数据部分,如出现SOH和EOT就在其前面加一个转义字符ESC,接收方在收到帧时,查看帧中的数据部分,如果“看见”ESC和SOH或EOT在一起,就删除EOT.如果发送方的帧的数据存在ESC,那么我们可以在ESC前面在加一个ESC(这是我臆造的想法,不同的协议再做透明传输控制时都会根据实际情况做的很灵活,比如共享以太网根本就不存在帧的首部和尾部,他通过每发送一个帧后都等待一段时间才发送下一个帧。而PPP协议的帧虽然也是用字符填充的方法,但和这里讲的思路一致,但做得很灵活)
方法二:零比特填充法
零比特填充法,它使用一个特殊的比特模式,如帧首和帧尾为01111100,在数据部分,每出现5个1,就在其后加一个0,接受方做其逆操作。
方法三:字符计数法
字符计数法,在帧首使用一个计数字段,记录帧的数据部分有多少的字符。
方法四:违规编码法
在物理层比特编码通常采用违规编码。例如,曼彻斯特编码将数据比特“1”编码为“高-低”电平,数据比特“0”编码为“低-高”电平,而“高-高”,“低-低”电平在编码中是违规的,可以依次检查接收到的帧的正确性。
三:数据链路层的差错检验
数据在通信信道中传输不可能是理想的,如在传输过程中,1可能变成0,0变成1。这种错误我们称为比特差错。下面所有的差错检验都是针对比特差错的。
在理解数据链路层的差错检验技术的原理,需要一些前置知识。
前置知识:
方法一:奇偶校验码。(只能检错
原理:它是由n-1位信息元和1位校验元组成,可以表示成为(n,n-1)。如果是奇校验码,在附加上一个校验元以后,码长为n的码字中“1”的个数为奇数个;如果是偶校验码,在附加上一个校验元以后,码长为n的码字中“1”的个数为偶数个。
方法二:循环冗余校验码 (只能检错)
原理:在K位信息码后再拼接R位的校验码,整个编码长度为N位,因此,这种编码也叫(N,K)码。对于一个给定的(N,K)码,可以证明存在一个最高次幂为N-K=R的多项式G(x)。根据G(x)可以生成K位信息的校验码,而G(x)叫做这个CRC码的生成多项式。 校验码的具体生成过程为:假设发送信息用信息多项式C(X)表示,将C(x)左移R位,则可表示成C(x)*x的R次方,这样C(x)的右边就会空出R位,这就是校验码的位置。通过C(x)*2的R次方除以生成多项式G(x)得到的余数就是校验码。