流量控制与滑动窗口是数据链路层的重要内容。当发送方较高的发送速度与接收方较低的接收速度不匹配时会造成传输出错,所以需要进行流量控制。我们需要明白一点,在数据链路层流量控制是点到点的,而在传输层流量控制是端到端的。
- 数据链路层流量控制手段:接收方收不下就不回复确认,当接收方还收得下时就会回复,然后发送方就会接着发送
- 传输层流量控制手段:接收端给发送端一个窗口公告
停止-等待协议
在数据的传输过程中除了会出现比特差错,底层信道还会因为物理线路故障、设备故障等原因导致数据包的丢失并且为了实现流量控制,所以需要停止-等待协议。虽然现在常常使用全双工的通信模式但是为了更清楚的理解停止-等待协议我们在此只考虑一放发送数据另一方接收数据的情况。停止-等待协议用一句话概括就是“发送方每发送完一个分组就停止发送,等待对方确认,在收到确认后再发送下一个分组”
无差错情况
在这里0帧和1帧只是帧的代号,里面的内容是不同的。我们可以从图中很清楚的看到在无差错的情况下发送方每发送完一个分组就停止发送,等待对方确认,在收到确认后再发送下一个分组。
有差错情况
- 数据帧丢失或者检测到帧出错
当发送方发完一个帧后就会保留这个帧的副本,是为了防止帧丢失,可以再次把帧发送出去。我们从图中可以很清楚的看到发送方发送两个相同的帧表示发生了超时重传 - ACK确认帧丢失
当由于ACK确认帧丢失发生超时重传时。接受方会收到两个相同的帧,那么接受方就会丢弃一个重复的帧。 - ACK确认帧迟到
当由于ACK确认帧迟到发生超时重传时。接受方也会收到两个相同的帧,接受方也就会丢弃一个重复的帧。当发送方收到了迟到的那个ACK确认帧后就会立即丢弃。
显然停止-等待协议的信道利用率实在太低,毕竟信道大部分时间都在传输数据而不是发送数据。为了提高信道利用率就有了后面的后退N帧协议和选择重传协议
后退N帧协议
与流量控制这个概念永远分不开的是滑动窗口,因为滑动机制造就了流量控制功能。从图中我们可以清楚的看到发送方的发送窗口是六而接收方的接收窗口是以(包括前面的停止-等待协议也可以认为发送窗口与接收窗口都是一)。其中橙色为拷贝副本,防止帧丢失可以再发送。
2.
此时接收窗口收到了0号数据
3.
此时接收窗口返回确认帧
4.
当返回的确认帧被发送窗口收到后,此时发送方0号数据接收方已经接收完毕,所以发送窗口与接收窗口整体向后移动一格准备接收第1号数据
后退N帧协议有两个特点——累计确认和按序接收
- 累计确认:在协议中接收方不用返回每个帧的确认帧,可以隔一会儿再返回确认帧就告诉发送方这个帧以及之前的帧都收到了。并将该帧中的数据部分交付给上层
- 按序接收:假设按按序发送0-5号帧。但是发送1帧丢失了,而接收方在接收了0帧后一直没接收到1帧,那么后面的2,3,4,5帧都会接收到后立刻丢弃。所以在到了一定时间后,发送方就会把0号帧后已发送但没有接收的帧页就是1,2,3,4,5,帧全部再发送一遍。
后退n帧协议因为可以连续发送提高了信道利用率但是必须把原来已经传送的 数据帧重传,这样就大大降低了效率。为了解决这个问题就有了后面的选择重传协议。
选择重传协议
选择重传协议为了解决数据帧全部重传的问题设置了单个确认同时加大接收窗口并且设置接收缓存来存储乱序到达的数据帧。
发送方从上层接到数据之后,需要检查下一个可用于该帧的序号,如果序号位于发送窗口内就发送数据帧。每一个帧都有自己的定时器,当一个超时事件发生后只需要重传一个帧。
接收方具有在窗口内来者不拒的特点。接收方确认一个正确接收的帧而不管其是否按序,乱序的帧将被缓存下来,并返回给发送方一个收到该帧的确认帧。当窗口内所有的帧都被收到时这一批帧将被交付给上层,然后向前移动滑动窗口。