数据链路层(Data Link Layer)
数据链路层(Data Link Layer)
位于物理层 和 网络层 之间, 它能够提供对物理通信的控制 并 提供对上面网络层的服务。
该层执行以下主要功能:成帧、寻址、差错控制和可靠性、流量控制、介质访问控制。
(1)成帧
网络层的IP数据报传送到 数据链路层 成为 帧的数据部分,在帧的数据部分前后加上首部和尾部,就构成了一个完整的帧。
最大传送单元(Maximum Transfer Unit) 是指 帧的数据部分的长度上限。
帧定界:
接受链路层用来确定每一帧的开始 和 结束。
帧定界有多种方法,主要分为两类。
采用特殊的物理编码标记帧的边界 和 通过是否存在某个信号来标识边界。
比如以太网,不同以太网系统中都会采用不同的成帧方式。
成帧协议也有两种: 面向位的, 和 面向字节的, 根据其基本单元。
1、面向位的
比如 HDLC(高级数据链路控制),以 01111110标记。
在每5个连续的1后面插入一个0.
2、面向字节的
指定特殊字符,比如SOH (头部开始)和 STX(文本开始)
存在转义字符。
帧格式:
帧头部中主要包含以下字段。
地址,源地址和目的地址。
长度、整个帧的长度,或者数据的长度。
类型、网络层协议的类型。
错误检测代码:(将在差错控制中详细介绍)
(2)寻址
IEEE 802标准。(没什么好说的。。)
(3)差错控制和可靠性
主要有两种检测函数:checksum(校验和) 和 CRC(循环冗余检测,Circuit Redundancy Check)
在更高层协议(TCP,UDP,IP) 中使用 checksum, CRC只用于以太网和无线局域网。
原因:1、CRC容易在硬件中实现,而高层协议几乎总在软件中实现。2、CRC对物理传输错误是健壮的,所以不需要使用checksum复核了。
checksum 原理(算法):
将所有位按照相邻字节配对形成 16位的字(如有剩余一个,最后再处理),然后将这些16位字全部加起来,(最后如果剩下一个字节,也加起来),然后对得到的数操作(用32位 sum 表示, 这样判断溢出),如果有溢出(即32位sum前16位非0),将该sum折叠,重复折叠操作,直到sum前16位 为0.最后将sum 取反 得到checksum。
代码如图:
CRC原理(算法):
首先注意,这里的全部运算皆是在模2的条件下进行的。(其实不用搞懂模运算,感兴趣的小伙伴可以补充一波数论同余)
假设帧内容有m位,发射机生成一个k位序列(Frame check sequence),将m位帧内容左移k位(就是末尾添加k个0),用这个数模2除以 FCS,得到一个余数,将刚刚那个m+k位的数加上这个余数,,得到的这个数就是要传输的帧。
接收机将收到的帧内容除以 FCS ,若余数为0,则验证正确,反之不然。
(4)流量控制
这是由于一种情况:发送机不断发送分组数据,而接收机来不及处理,那么这个时候就需要提醒发送机放慢速度。
即流量控制。
最简单的方法:停止--等待,发射机发送一个帧,等待接收机确认,然后发送下一个。这样会使链路的利用率非常低。
滑动窗口协议:
通过窗口滑动传送帧
(5)介质访问控制
多个节点共享同一个物理介质时用到的机制。
恩。。同学们看到这里很烦了吧,我也累了,没什么用,等有新发现再来补充。