- 数据链路层有有多种传输协议,提取出三个共同的基本问题:
1、封装成帧
2、透明传输
3、差错检测
1、封装成帧
-
描述
发送端
将网络层交下来的IP数据报
的前后分别添加首部和尾部
,这就构成了一个帧
(发送端给出每一个帧的界限)
接收端
在收到物理层交上来的比特流后,根据首部和尾部的标记,从比特流中识别出一个个帧的开始和结束(接收端识别这些界限,接受一个个帧)
-
首部和尾部相关
1、帧定界:确定帧的界限
2、首部和尾部还包括很多必要的控制信息
3、各种数据链路层协议对帧首部和尾部的格式
都作出规定
4、除了数据链路层,其它层的封装都是只增设一个首部,只有数据链路层是首部尾部都加,因为数据链路层下面就是连续的比特流 -
互联网上传送的数据都是以
分组(IP数据报)
为传送单位
网络层的 IP数据报 传送到数据链路层就成为帧的数据部分
帧
是数据链路层的协议数据单元
一个帧的帧长
等于帧的数据部分长度
加上帧首部和帧尾部的长度
-
最大传送单元
每一种数据链路层协议都规定了所能传送的帧的数据部分长度上限
,就是最大传送单元(MTU)
为提高传输效率,应使帧的数据部分长度尽可能大于首部和尾部的长度 -
帧定界符
当数据是由可打印的 ASCII码 组成的文本文件时,帧定界可以使用特殊的帧定界符
ASCII码 是7位编码,一共可以组合成 128 个不同的 ASCII码,其中可打印的有 95 个,剩下的 33 个是控制字符
可以规定将控制字符SOH(0x01,start of header)
放在一个帧的最前面,表示帧的开始
将另一个控制字符EOT (0x04,end of transmission)
放在一个帧的最后面,用来表示帧的结束
-
帧定界符的作用
1、定界
2、当数据在传输过程中出错,发送端尚未发送完一帧就突然故障,中断了发送,随后恢复正常,发送端重新从头开始发送刚才未发送完的帧。通过帧定界符,接收端就知道前面接收到的数据是一个不完整的帧(有SOH无EOT)
,则对其进行丢弃。后一个完整的(有SOH有EOT)帧接收
2、透明传输
-
帧的数据部分
出现帧的开始标记字符
或结束标记字符
,会出现帧定界的错误
若传送的帧的数据部分是文本文件,数据区不会出现 SOH,EOT这样的帧定界控制字符 (文本文件的字符都是从键盘上输入的)。无论从键盘上输入什么字符都可以放到帧中传输出去,这样的传输就是透明传输。
若传送的帧的数据部分不是文本文件(如二进制的bin,图像数据等),数据区中的某个字节的二进制代码可能恰好和 SOH 或 EOT 这种控制字符一样,数据链路层就会错误地找到帧的边界,只接受了帧的部分,把剩下的帧内容丢弃(因为找不到 EOH),这样的传输就不是透明传输。
-
如何理解 透明
某一个实际存在的事物看起来却不存在
在数据链路层中透明传送数据:无论什么样的比特组合的数据,都能够按照原样正确地通过数据链路层
对于所传送的数据来说,这些数据看不见数据链路层有什么妨碍传输的东西(数据链路层对这些数据来说是透明的) -
如何做到 透明传输
必须设法使数据区中可能出现的控制字符 SOH、EOT 在接收端不被解释为控制字符
具体做法(字节填充 / 字符填充):
发送端的数据链路层在数据区中出现控制字符(SOH,EOT)的前面,均加入一个转义字符 ESC(0x1b)
,出现 ESC 本身也要在其前面加上一个 ESC
接收端
的数据链路层在把数据送往网络层之前删除这个插入的转义字符。简单来说就是接收端遇到一个转义字符就删除它并把它后面一个字符视为普通数据来接收。
3、差错检测
-
比特差错
比特在传输过程中可能会产生差错:1可能会变成0,0可能会变成1
比特差错是传输差错的一种 -
误码率
传输错误的比特占所传输比特总数的比率
BER( bit error rate )
如误码率为 10-10 ,表示平均没传送 1010 个比特就会出现一个比特出错 -
实际的通信链路都是不理想的,BER 不可能为 0
误码率与信噪比有很大的关系:信噪比提高,BER 减小
为了保证数据传输的可靠性,计算机网络传输数据时有很多种差错检测措施
数据链路层广泛使用的检错法:循环冗余检验,CRC -
模2运算
加减法时不进位,不借位
普通运算:1+1=10,模2运算:1+1=0
普通运算:10-1=1,模2运算:10-1=11 -
循环冗余检验
先把数据划分成组,每组 k 个比特
CRC运算就是在一组数据的后面加上供差错检测用的 n 位冗余码,构成一个帧发送出去 -
如何求这 n 位冗余码
首先在原数据 k个比特 后面加上 n 个 0,记为 m
收发双方事先要确定一个长度为 n+1 位的除数 p
m 除以 p(模2除法运算)能得到 n位余数,这就是要求的 n位冗余码 -
帧检验序列 FCS
添加在数据后面的冗余码
(CRC 是检错方法) -
CRC循环冗余检错法,只能做到对帧的无差错接受(出错的帧直接丢弃了),只能检测比特级的错误
不能检测帧丢失、帧重复或帧失序(此三种也是传输错误) -
可靠传输
发送端发送什么,接收端就收到什么
CRC 显然不能保证可靠传输,本章介绍的数据链路层协议都不是可靠传输的协议,保证可靠传输的任务交给别的层来实现