数据链路层简介
数据链路层的作用
将网络层的数据进行封装,并保证数据在物理层之间可以准确的传输。注意:这里的准确传输指的是所接受的数据一定是正确的,而出错的数据,直接丢弃。通俗点将,就是保质不保量
基本概念
链路:指的是物理线路,例如:双绞线,光纤等
数据链路:指的是逻辑线路,这里是一些必要的通信协议,保证了数据传输的可靠性
帧:把网路层数据打成的包,是数据链路层之间传输的基本数据单元
数据链路层最大传送单元(MTU):指的是数据链路层中,一个帧中所能承载的最大的数据部分的长度
三个基本问题
数据链路层存在着很多种协议,但是所有协议都解决了三个基本问题:封装成帧,透明传输,差错校验。
封装成帧
将网络层传下来的分组添加首部和尾部,用于标记帧的开始和结束。
透明传输
这里的透明传输并不是说让数据变得“透明”,而是让帧的首部和尾部变得“透明”。
帧使用首部和尾部进行定界,如果帧的数据部分含有和首部尾部相同的内容,那么帧的开始和结束位置就会被错误的判定。需要在数据部分出现首部尾部相同的内容前面插入转义字符。如果数据部分出现转义字符,那么就在转义字符前面再加个转义字符。在接收端进行处理之后可以还原出原始数据。这个过程透明传输的内容是转义字符,用户察觉不到转义字符的存在。
差错检测
检测传输的数据是否有错误,CRC是数据链路层广泛使用的一种检错技术。
循环冗余检验CRC得到FCS,可以通过FCS判断是否出错;如果出错,并不能改正,而是直接丢掉。
点对点链路的PPP协议
对于点对点的链路,应用最广泛地就是PPP协议
PPP协议的帧格式
- F字段:标志着帧的开始和结束,默认为0X7E
- A字段:预留字段,默认为FF
- C字段:预留字段,默认为03
- 协议:
- 当协议字段为0x0021时,表示信息部分为IP数据报
- 字段为0xc021时,表示信息部分为LCP数据
- 0x8021表示为网络层的控制数据
- FCS:是使用CRC的帧检验序列
PPP协议实现透明传输
为了避免信息部分也出现7E,FF,03等字段,PPP协议提供了两种解决方案
字节填充
当信息字段中出现0x7E时,将每一个0x7E字节转变成2字节序列(0x7D,0x5E)
若信息字段中出现一个0x7D的字节,则将其转变成2字节序列(0x7D,0x5D)
若信息字段中出现ASCII码的控制字符(即数值小于0X20的字符),则该字符前面需要加入一个0x7D字节,同时将该字符的编码加以改变(+20)。例如,出现0x03,就要把它转为2字节序列(0x7D,0x23)
这里举例说明:如果一个帧的信息部分,想要传递0x7E,那么PPP协议会将其变为0x7D0x5E进行传输。
零比特填充
有些时候,数据链路层传输的不是字符,而是比特位(bit),这时就要使用零比特填充法。
原理类似,都是为了避免特殊字段被信息部分影响。
7E用二进制表示,是0111 1110,这里以7E为例,其他特殊标识类似
具体做法为:在发送端扫描整个信息字段,当有5个1连续出现时,立即填入一个0,保证信息字段中不会出现6个连续1。
广播链路的CSMA/CD协议
广播链路是一种总线的结构,也就是说,当一台计算机发送数据时,总线上的所有计算机都能检测到这个数据。
但是,有时候我们并不想让所有计算机都接受,而是想指明特定计算机发送数据。为了在总线上实现一对一的通信,我们可以利用MAC地址来标识不同的计算机。
广播链路上一对一通信的原理我们理清楚了,但是还有一个问题,怎么保证链路总线上只有一种信号在传输?
也许你会想到利用各种编码方式,使信道可以复用,但是这些编码有一个缺点,那就是所占的频带宽度比原始的基带信号增加了一倍。
所以我们可以换一种思路,如何保证同一时刻只有一个信号正在传输?这样正是CSMA/CD协议解决的主要问题
CSMA/CD协议的要点如下:
- 多点接入
- 载波监听
- 碰撞检测
τ=总线长度/电磁波传输速度
最短帧长:希望检测到碰撞时,帧还没有发送结束,以太网中小于64的都是无效帧