关于快恢复算法中的一些问题
来源:互联网 发布:软件水平考试科目 编辑:程序博客网 时间:2024/04/28 16:18
TCP Reno这个算法定义在RFC5681。快速重传和快速恢复算法一般同时使用。快速恢复算法是认为,你还有3个Duplicated Acks说明网络也不那么糟糕,所以没有必要像RTO超时那么强烈,并不需要重新回到慢启动进行,这样可能降低效率。所以协议栈会做如下工作
cwnd = cwnd/2
sshthresh = cwnd
然后启动快速恢复算法:
设置cwnd = ssthresh+ACK个数*MSS(一般情况下会是3个dup ACK)
重传丢失的数据包(对于重传丢失的那个数据包,可以参考TCP-IP详解:SACK选项)
如果只收到Dup ACK,那么cwnd = cwnd + 1, 并且在允许的条件下发送一个报文段
如果收到新的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的值。
- 关于快恢复算法中的一些问题
- 关于备份、恢复过程中的一些概念
- 关于《四元数插值算法实现游戏角色平滑旋转》中的算法一些问题
- 关于数据结构中的一些排序算法
- 关于算法上的一些问题
- 关于项目开发中的一些问题
- 关于java gui设计中的一些问题
- 关于Java中的一些问题汇总
- 关于Java中的一些问题汇总
- 关于FLEX3中的ComboBox的一些问题
- 关于学习过程中的一些问题
- 关于IT测试中的一些问题。
- 关于项目开发中的一些问题
- 关于juqery ajax应用中的一些问题
- 关于JacORB编程过程中的一些问题
- 关于Wamp配置运行中的一些问题
- 关于caffe安装中的一些小问题
- 关于cocoapods中的一些细节问题
- Unity摄像机基本功能介绍
- 库依赖问题解决办法
- SYN版本控制器
- angularjs $sce
- 8.Redis的排序
- 关于快恢复算法中的一些问题
- 23个MySQL常用查询语句
- anaconda 创建虚拟(切换)python环境
- 解题报告:HDU_6134:Battlestation Operational (莫比乌斯反演)
- window下如何搭建react项目
- 线程之间的协作
- 筛法求莫比乌斯,欧拉函数
- POJ
- C++程序中调用exe可执行文件