数据链路层保证数据在两台机器间进行可靠、有效的通信。需要考虑传输错误(检错、纠错等)、延迟等问题。因此,其功能可概括为:
1.向网络层提供一个定义良好的服务接口;
2.处理传输错误;
3.调节数据流,确保慢速的接收方不会被快速的发送方淹没。
对应各功能的设计要点:
1.为网络层提供服务,即将数据从源机器的网络层传输到目标机器的网络层。服务又可分为三种:
(1)无确认无连接的服务。目标机器不对数据帧进行确认,事先也不建立连接,事后也不释放连接。不检测丢帧,也不恢复。该类服务适合实时通信,如语音传输。
(2)有确认无连接的服务。发送的每一帧(网络层传来的一个分组可能会被分解为多个帧)都需要单独确认,因此发送方能知道每一帧是否已正确到达。如果在某帧在指定时间间隔内未到达,则重传。该类服务适用于不可靠的通道,如无线系统。缺点是,由于帧没有被编号,重传时可能会导致一些帧被目的方多次收到。
(3)有确认面向连接的服务。数据传输前首先建立一个连接,该连接中的每个帧均被编号,因此可保证每个帧均只被收到一次。有三个阶段:建立连接,初始化资源;传输数据帧;释放连接和资源。
2.成帧。
物理层传输的数据位流并不保证没有错误,而这个检错和纠错在数据链路层完成。做法一般是将分组分离成离散的帧,并计算每个帧的校验和。当该帧到达目标机时重新计算校验和,若不同则说明传输过程中产生了错误,然后采用适当的处理措施。对于如何由分组分离成帧,依次发展有多种方法,如:
(1)字符计数法。在帧的头部标记帧的字符个数。缺点是,当这个字符个数的值本身传输出错时,会导致接收方不知道从哪里开始接收余下的帧。因此该方法已经很少单独使用。
(2)含字节填充的分界符法。该法在帧的头尾加上标志字节作为起始和结束分界符。当传输的数据与分界符相同时,则在前加一个转义字节,也就是字节填充。若本身传输的就是一个转义字节,则再在前加个转义字节。该方法的主要缺点是,依赖于8位字符的模式,但实际上并不是所有的字符码都使用8位字符,如16位的UNICODE。
(3)含位填充的分界符法。该法是字节填充的升级版,采用5个连续“1”后加字符“0”的方法,避免了对字符长度的依赖。
现在的许多链路层协议都是字符计数法和字节填充/位填充法的组合。
3.错误控制。
可靠的传输基于有确认面向连接的服务。对于该服务,需要目的方向发送方发送每帧的确认信息。如果发送方收到来自接收方否定的确认控制帧,则需要重传该帧。由于可能是由于硬件故障导致的丢帧,因此发送方在发送数据帧时,一般需要设定一个定时器,该定时器的长度应该能保证正常情况下收到确认帧。另外,为保证接收方避免多次收到同一个帧,一般有必要对发送出去的帧分配序列号,这样,接收方就能够区别原始帧和重传帧。
数据链路层的一个重要工作就是如何管理好定时器和序列号,从而保证每一帧最终都恰好一次的被传递到目的机网络层。
4.流控制。
为避免发送帧的速度超过接收帧的速度导致的数据淹没,数据链路层另一个重要的工作是采取流控措施。常用的有两种:基于反馈的流控制(基本原理:在得到接收方许可之前,发送方不能继续发送);基于速率的流控制(基本原理:限制发送方的数据传输速率,无需利用接收方的反馈信息。数据链路层不采用基于速率的流控法)。
数据链路层一般包括两个子层:MAC和LLC。
MAC介质访问子层协议是用于在多路访问信道的时候确定下一个使用者的协议,是数据链路层的底下部分。