数据链路层作为物理层的上层,为网络层提供服务,提供了成帧,差错控制,流量控制等功能
文章目录
成帧
帧是数据链路层规定的最小的数据传送逻辑单位,帧将网络层交下来的数据包按照所采用的协议根式,封装成一定形式的帧,帧还需要考虑双方的同步问题,计算帧的校验和,帧的基本格式:
- 帧定界:标志了帧的开始与结束,包括字节计数法,字符填充法,位填充法
- 地址:属于物理或硬件地址,用于设备或机器的物理寻址,如网卡地址
- FCS:帧校验序列,用来判断传输是否正确
透明传输
学习了上面的成帧协议后,了解到了对于一些特定的控制字符如帧的首部,尾部,都是特定的比特流,比如下面的SOH
那么就有一个问题,如果在数据中也出现了同样的比特流该怎么办?
我们平时在编程的时候,会有转义字符 \ ,这样后面的符号等就会被赋予其他的含义,那如果数据中出现了 \ 呢?则通过 \ 两个转义字符来进行区分,这里数据链路层也是采用了这种思想
这里的ESC就是转义字符
如果数据中出现了转义字符,那么通过两个转义字符来进行区分
差错检测
差错控制是数据链路层一个重要的服务,在数据通信中,由于噪声的干扰,接收端收到的数据与发送数据会有不一致的现象,如何判断是否有错就是差错检测
为什么需要帧尾部
在帧尾部有进行差错检验的fcs——帧检验序列,放在帧尾部,接收方在接收端接收完数据后,会将自己计算的fcs与帧尾的进行比较,如果不正确,会抛弃数据
奇偶校验码
奇偶校验是将数据进行分组,每一组加上一个校验位,规则如下:
- 奇校验:该组若有奇数个1,则在校验位补0,如果有偶数个1,则在校验位补1
- 偶校验:改组若有偶数个1,则在校验位补0,如果有奇数个1,则在校验位补1
循环冗余校验码CRC
采用多项式编码的方式,举个例子:
对于序列10011的多项式表示为:x4+x+1
该校验的方法如下:
- 双方规定G(x),而发送方把要发送的数据转为多项式K(x)的形式
- 定义M(x)=xr*K(x),其实就是把K(x)序列往左移动了r位,这r位就是用来给余数挪位置的
- 然后用M(x)/G(x)得到余数R(x),在发送的时候发送T(x)=R(x)+K(x)
- 接收方收到T(x)后,然后用T(x)/G(x),如果可以整除,那么就说明传输正确
eg:
差错控制
检测到错误后如何去做,就是差错控制
前向纠错FEC
首先在发送端将信息进行纠错编码,然后将纠错码发送至接收端,接收端译码后发现错误就自动纠正错误,不需要重发信息
停等协议SAW
停等协议非常好理解,就是发送方每发送一帧消息就会停下来,等待接收方接收后然后发来确认消息,这时发送方才会发送下一帧消息。确认信息位ACK表示正确确认信息,NAK表示需要重传消息,在一定的时间没有收到确认消息,发送方也会重传
很明显,这种发送消息帧的方式效率是非常低的,所以被淘汰掉了
自动请求重传ARQ
既然一个一个发送会导致效率很低,那么一次性发送多帧称为了改进的主要方向,ARQ又分为回退N和选择重传两种
回退N(Go Back N)
回退N属于ARQ,所以发送方一次会发送多帧数据,不必等待接收方的应答,在连续发送多帧数据后,陆续接受到接收方的确认信息,如果接收到NAK消息,则从该帧往后的所有数据全部重新发送
- 优点:提高了效率
- 缺点:由于出错后,要进行回退,所以导致很多正确的帧重传,会降低发送效率
选择重传协议(SR)
了解了回退N协议后,选择重传协议就很好理解了,选择重传协议只会把错误的帧进行重传,而在接收端会有一个缓冲区,存储接收到的错误帧后面的帧,在收到重传后的帧后从缓冲中取出,这样就按顺序接收了
- 优点:避免重传正确的帧,提高了信道利用率
- 缺点:接收端需要一个缓存,控制比较复杂
滑动窗口协议
滑动窗口是指在发送端和接收端都有一个窗口,所谓窗口就是通过两个指针限定帧的范围,只有帧号发送窗口内的帧才可以发送,只有帧号在接收窗口的帧才可以接受,在确认完毕后窗口整体向前滑动
其实滑动窗口就是上面情况的总结,根据不同的情况对应
MTU 与 路径MTU
帧在传输的过程中会有时延影响传输效率,所以帧过大过小都是不合适的,MTU就是数据链路层最大的传输单元,不能超过MTU的大小
- 以太网MTU一般为1500字节
路径MTU是指经过很多网络路径时,MTU遵循短板效应,受限于最小的MTU
这里的MTU就是1492
mac地址
- mac地址是指硬件地址
- 每一个设备都有一个mac地址
- mac地址共48位,使用十六进制表示
可以使用ipconfig来查看以太网的mac地址
以太网协议
- 是一种使用广泛的局域网技术
- 完成相邻设备的数据帧传输
数据格式
- 目的地址和源地址都是mac类型,48位占6个字节
- 类型分为:0800-IP数据报 0806-ARP请求 8035-RARP请求
- CRC:校验码
这里提到的ARP,RARP都是网络层的协议
发送过程
这里A要给C发送消息,首先要确认路由器E中的mac地址映射表中是否有C的硬件接口信息,如果没有则路由器E会广播除了A,然后BC响应这种方式拿到C的硬件接口信息,有了硬件接口信息后会将数据发送给C
那如果是这种情况的话该怎么办呢?如下图,A要给C发送消息
这种情况下,其实数据链路层是无法完成的,这也就是以太网为什么只能是相邻物理节点之间的传输