数据链路层的功能
- 为网络层提供服务,良好的服务接口
- 保证数据传输的有效、可靠
- 处理传输错误:差错检测和控制和流量控制(有基于速率和基于反馈两种)
协议数据单元PDU为数据帧
帧由帧头帧尾和载荷构成
- 帧头:有定位所需要的物理地址信息
- 载荷:上一层网络层送下来的分组和包
- 帧尾:校验核,用作校验
数据链路层使用物理层提供的服务,物理层处理的是位流,数据链路层处理的是帧(数据链路层的PDU)
将原始的位流分散到离散的帧中,叫成帧,成帧的方法有
- 字符计数法
- 带字节/字符填充的标志字节法
- 比特填充的比特标志法
- 物理层编码违例法
字符计数法
发送方:在每个帧头部的第一个字段,标志该帧的长度,总共有多少个字符数
接收方:通过第一个字段就知道这个帧有几个字符
简单,但很少人用,缺点严重如上
字节填充的标志字节法
每个帧采用一个特殊的字节(flag)作为帧界,即帧的开始和结束
但是会遇到问题:如果要传输的字节中有转义字符,那么就会冲突混淆
解决方法:和C语言一样增加转义字符(esc)
缺点:帧只按字节(8位字符)来传递,任意比特数的帧不适用,必须是8的整数倍,这样如果需要疯狂转义则会造成传输效率低下,例子下面有
比特填充的比特标志法(0比特填充法/位填充法/透明传输)
面向二进制的帧格式成帧方法
又称作0比特传输
其中的黄色部分为帧标记,作为一个帧的开始,当然也意味着另一个帧的结束
如果要传输的字段中出现01111110,那么就在连续5个1后加个0
优点:可以传输任意比特数的帧,效率也更高
例子:假设要传输100个"01111110",如果用字节填充法那么你不得不在每个"01111110"前面塞100个转义符,那么传输效率就会变为50%,如果用的比特传输法,那么你只需要在5个1后面加个0就ok了,传输效率高达80%
物理层编码违例法
统称,例如曼彻斯特编码,如果用"高电平-低电平"表示"1","低电平-高电平"表示"0",那么就可以用"高电平-高电平"和"低电平-低电平"来作为帧界,这样完全不会冲突,而且效率还很高
除此之外还有4B/5B编码等