开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第4天
- 封装成帧
- 透明传输
- 差错控制
封装成帧
在一段数据的前后分别添加首部和尾部,构成一个帧。
首部和尾部的一个重要作用就是进行帧定界(确定帧的界限)
中间帧的数据部分长度有上限,要小于等于MTU,即最大传输单元,大小为1500个字节
帧定界符举例:
控制字符SOH放在一帧的最前面,表示帧的首部开始。(对应十进制ASCII码为1)
控制字符EOT放在一帧的末尾,表示帧的结束。(对应十进制ASCII码为4)
可以选不可打印的字符作为帧定界符,而不只是SOH和EOT
透明传输
现在我们已经可以将数据封装成帧,两边由定界符进行分隔,但新的问题又来了:如果数据中的某个字节的二进制代码恰好和SOH或EOT(或其它规定定界符)一样,那么数据链路层就会找到错误地帧边界
透明传输就是在传输过程中,对外界透明,就是说你看不见他是传送网络,不管传输的业务如何,我只负责将需要传送的业务传送到目的节点,同时保证传输的质量即可,而不对传输的业务进行处理。
用“字节填充”或“字符填充”解决透明传输问题
使用ESC表示其后并不是真正的定界符
差错检测
在传输过程中,可能会产生比特差错,0变成了1,或1变成了0
在一段时间内,传输错误的比特占所传输比特总数的比率称为误码率BER
差错检测方法:循环冗余检验CRC
在发送端,先把数据划分为数组,假定每组k个比特。
CRC运算在每组后面再添加供差错检测用得n位冗余码,然后构成一个帧发送出去,一共(k+n)位
CRC冗余码算法
- 用二进制的模2运算进行2^n乘数据M的运算,这相当与在M后面添加n个0
- 第一步中得到的(k+n)位的数除以事先选定好的长度为(n+1)位的除数P,得出商为Q,余数为R,余数R比除数P少1位,即R是n位。
- 将余数R作为冗余码拼接在数据M后面,一起发送出去。
这种为了进行检错而添加的冗余码常称为帧检验序列FCS
举例:
注意这里的竖式中的减法运算不借位,相当于进行了异或运算
除数P的获得(生成多项式)
X^n存在则该位为1,不存在则该位为0,比如X^4+X^2+X+1是10111
循环冗余检验CRC和帧检验序列FCS并不等同:
- CRC是一种常用的检错方法,而FCS是添加在数据后面的冗余码
- FCS可以用CRC这种方法得出,但CRC并非用来获得FCS的唯一方法
最后如果检验出错,数据链路层便会将这个数据帧丢掉,请求重传之类的便是运输层的工作了