关于快恢复算法中的一些问题

来源:互联网 发布:软件水平考试科目 编辑:程序博客网 时间:2024/04/28 16:18

TCP Reno这个算法定义在RFC5681。快速重传和快速恢复算法一般同时使用。快速恢复算法是认为,你还有3个Duplicated Acks说明网络也不那么糟糕,所以没有必要像RTO超时那么强烈,并不需要重新回到慢启动进行,这样可能降低效率。所以协议栈会做如下工作

  1. cwnd = cwnd/2

  2. sshthresh = cwnd

然后启动快速恢复算法:

  1. 设置cwnd = ssthresh+ACK个数*MSS(一般情况下会是3个dup ACK)

  2. 重传丢失的数据包(对于重传丢失的那个数据包,可以参考TCP-IP详解:SACK选项)

  3. 如果只收到Dup ACK,那么cwnd = cwnd + 1, 并且在允许的条件下发送一个报文段

  4. 如果收到新的ACK, 设置cwnd = ssthresh, 进入拥塞避免阶段

主要问题:

1.为什么在第1步中要 + ACK个数*MSS这一步?
答:我们在开始的时候将发送窗口的值设为ssthresh的值,但是因为我们接收到n个ACK,这说明在网络中已经有n个报文已经到达接收端了,所以我们设置的窗口中还可以再添加n个报文发送,这样其实才是真正的将发送窗口的值设为ssthresh的值。

2.为什么在接收到重复ACK的时候还要让cwnd加1?
答:每当我们接收到重复的ACK的时候就能说明两点:
1)我们要发送的报文还是没有到达接收端,所以发送窗口的左端是不能动的;
2)在网络中又有一个报文成功到达接收端,所以网络中又可以添加一个报文。
但是要注意的是,虽然看起来发送窗口变大了,但是里边发送的报文数量其实和我们设置的ssthresh值是一样的,里边有很多“小窗口”是空的,不严谨的讲,我们甚至可以说这个发送窗口的真实大小就是ssthresh。

3)为什么在最后接收到非重复的ACK要重置cwnd的值?
答:其实看过前两个问题的答案,这个问题的答案也就显而易见了。我们虽然一直在加cwnd的值,但是其中可同时发送的报文数量还是ssthresh的值,而当我们接收到非重复的ACK的时候,说明我们之前要发送的报文也顺利到达接收端,这个时候,我们将发送窗口移动到这个新的ACK的位置,这个时候窗口里边已经没有那些空的“小窗口”,所以要把发送窗口大小重置为ssthresh的值。

原创粉丝点击