数据链路层要解决的三个基本问题

316 阅读3分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第4天

  1. 封装成帧
  2. 透明传输
  3. 差错控制

封装成帧

在一段数据的前后分别添加首部和尾部,构成一个帧。

首部和尾部的一个重要作用就是进行帧定界(确定帧的界限)

framing.jpg

中间帧的数据部分长度有上限,要小于等于MTU,即最大传输单元,大小为1500个字节

帧定界符举例:

framingex.jpg

控制字符SOH放在一帧的最前面,表示帧的首部开始。(对应十进制ASCII码为1)

控制字符EOT放在一帧的末尾,表示帧的结束。(对应十进制ASCII码为4)

可以选不可打印的字符作为帧定界符,而不只是SOH和EOT

透明传输

现在我们已经可以将数据封装成帧,两边由定界符进行分隔,但新的问题又来了:如果数据中的某个字节的二进制代码恰好和SOH或EOT(或其它规定定界符)一样,那么数据链路层就会找到错误地帧边界

question2.jpg

透明传输就是在传输过程中,对外界透明,就是说你看不见他是传送网络,不管传输的业务如何,我只负责将需要传送的业务传送到目的节点,同时保证传输的质量即可,而不对传输的业务进行处理。

用“字节填充”或“字符填充”解决透明传输问题

answer2.jpg

使用ESC表示其后并不是真正的定界符

差错检测

在传输过程中,可能会产生比特差错,0变成了1,或1变成了0

在一段时间内,传输错误的比特占所传输比特总数的比率称为误码率BER

差错检测方法:循环冗余检验CRC

在发送端,先把数据划分为数组,假定每组k个比特。

CRC运算在每组后面再添加供差错检测用得n位冗余码,然后构成一个帧发送出去,一共(k+n)位

CRC.jpg

CRC冗余码算法

CRCcalc.jpg

  1. 用二进制的模2运算进行2^n乘数据M的运算,这相当与在M后面添加n个0
  2. 第一步中得到的(k+n)位的数除以事先选定好的长度为(n+1)位的除数P,得出商为Q,余数为R,余数R比除数P少1位,即R是n位。
  3. 将余数R作为冗余码拼接在数据M后面,一起发送出去。

这种为了进行检错而添加的冗余码常称为帧检验序列FCS

举例:

CRCEX.jpg 注意这里的竖式中的减法运算不借位,相当于进行了异或运算

除数P的获得(生成多项式)

PofCRC.jpg

X^n存在则该位为1,不存在则该位为0,比如X^4+X^2+X+1是10111

循环冗余检验CRC和帧检验序列FCS并不等同:

  1. CRC是一种常用的检错方法,而FCS是添加在数据后面的冗余码
  2. FCS可以用CRC这种方法得出,但CRC并非用来获得FCS的唯一方法

最后如果检验出错,数据链路层便会将这个数据帧丢掉,请求重传之类的便是运输层的工作了