TCP滑动窗口与回退N帧协议以及拥塞控制
滑动窗口
我们知道在数据链路层中也有一个滑动窗口,其实滑动窗口指的就是发送方和接收方所关心的序列号范围。在发送滑动窗口中,滑动窗口包含已经发送出去的序列号和可以发送的序列号。在接收滑动窗口中,滑动窗口包含了将要接收的序列号。
回退N帧
数据链路层的接收滑动窗口大小始终为1,也就是说在当前允许到达的序列号到达之前窗口不会发生滑动。如果接收方所期待的序列号为2,发送方已经将2,3,4号发出,但是由于传输原因2号丢失,那么发送窗口就需要从2号开始重新发送。
选择性重复ARQ
选择性重复ARQ的接收窗口大小是大于等于1的,他可以接收多个序列号,当其中有一个序列号丢失的时候,不需要从丢失的序列号开始全部重新发送,只需要重新发送丢失的序列号即可。
介绍完这三个基本概念我们来看看TCP的滑动窗口和回退N帧协议。
TCP的滑动窗口与数据链路层不同的一点是,数据链路层的滑动窗口是面向帧的,TCP的滑动窗口是面向字节的,而且数据链路层的窗口大小是固定的,TCP的窗口大小是可变的。
那什么是可变的呢?窗口是张开的,合拢的,收缩的。窗口张开是指右边沿向右移动,也就是允许缓存更新符合条件的字节。窗口合拢是指左边沿向右移动,也就是有些字节已经被确认。窗口收缩指的是右边沿向左移动,也就是废除了某些满足条件的发送(因为这样的操作有可能造成已经发送的字节失效,所以现实中不建议这样使用)。
TCP的回退N帧和数据链路层的有所不同,TCP中的回退N帧是数据链路层中回退N帧和选择性重复ARQ的结合体。
因为他没有NAK所以看起来像回退N帧,但是接收方会保存失序的段直到丢失的段到达,所以看起来也像选择重发。
TCP拥塞控制
TCP的拥塞控制大致分为三个阶段:慢速启动,拥塞避免,拥塞检测。
慢速启动:指数增长。在最开始时将窗口设置为一个最大段长度,随着接受到的确认个数的增加,窗口大小按照指数增长。直到达到窗口的阈值。
拥塞避免:加性增加。为了避免拥塞,当窗口到达阈值之后,随着确认个数的增加,窗口不再沿着指数增长,而是每次加1。
拥塞检测:乘性减少。发送方推测出发送拥塞现象的唯一方法就是通过重传的要求。也就是在发送方接收到三个ACK之后或者计时器到时。
如果是计时器到时,那么意味着存在严重拥塞的可能性,在这种情况下TCP会做出强烈的反应:
1、将阈值设为当前窗口的额一半
2、将拥塞窗口设置为一个最大段的长度
3、启动慢速启动阶段
如果是接收到三个ACK,那么意味着存在轻度拥塞的可能性,这种情况下TCP会做出轻度的反应:
1、将阈值设为当前窗口的一半
2、将拥塞窗口设置为阈值
3、启动拥塞避免阶段。
(像我们平时在下载东西的时候,可能下着下着下载速度就变慢了,如果我们暂停之后重新开始就会发现速度又重新变快了,那么大概就是TCP的拥塞控制的结果了。)