很遗憾的是,这里一节我没办法用实验演示给你看,但是我尽量用文字和图叙述清楚。

慢启动和拥塞避免算法是在 1988 年提出的,而快重传快恢复是 1990 年提出的。既然这两个新算法是时隔两年后才提出的,那么它一定是对慢启动和拥塞避免算法的不足之处进行了改良。

在此之前,先来回忆一下,发送方如何判定网络产生拥塞?已知的一种情况是对方回复 ack 超时。其实还有一种情况,如果发送方连续收到接收方多个重复的 ack(接收方不会没事发送重复的 ack 的),则说明网络生产拥塞(为什么?看完第 1 节你就明白了)。那么简单总结一下,发送方判定网络拥塞就有两种情况了:

  • ack 超时
  • 发送连续收到重复的 ack

知道了上面的事情后,接下来看看,针对连续收到重复的 ack,发送方应该怎么做。

1. 快重传

首先对于接收方来说,如果接收方收到一个失序的报文段,就立即回送一个 ACK 给发送方,而不是等待发送延时的 ACK(请参考《迟到的 ACK》)。所谓失序的报文是指,用户没有按照顺序收到 TCP 报文段,比如接收方收到了报文 M1, M2, M4,那么 M4 就称为失序 报文。

这样做的目的是可以让发送方尽可能早的知道报文段 M3 未到达接收方。快重传算法规定,如果发送方一连收到 3 个重复的确认,就应当立即传送对方未收到的报文 M3,而不必等待 M3 的重传计时器到期。


图1 快重传算法

2. 快恢复

在学习了上一节的慢启动和拥塞避免算法后,我们知道,一旦出现超时重传,TCP 就会把慢启动门限 ssthresh 的值设置为 cwnd 值的一半,同时 cwnd 设置成 1. 但是快恢复算法不这样做。

一旦出现超时重传,或者收到第三个重复的 ack 时(快重传),TCP 会把慢启动门限 ssthresh 的值设置为 cwnd 值的一半,同时 cwnd = ssthresh (在有些版本中,会让 cwnd = ssthresh + 3)。

之前的旧版本的算法是在 TCP 的 Tahoe 版本中,而改进的版本算法是在 TCP Reno 版本中。图 2 中演示了他们之间的区别。蓝色曲线是旧版本,而红色是新版本。


图2 TCP Reno 版本与 Tahoe 版本

图 2 中,连续收到三个重复确认后,TCP Reno(红色)版本转入了拥塞阶段,而 TCP Tahoe 版本(蓝色)转入了慢启动阶段。

实际上,现代的 Linux 内核版本早已都不采用上面这些 TCP 版本了,而是使用使用的 TCP Cubic 版本。那为什么还要学呢?这就好比你想学会走,你就得先学会爬,简单的先弄会,以后再自学复杂的。

3. 流量控制与拥塞控制

在学习流量控制的时候,我们假设网络无限好,不拥塞。在学习拥塞控制的时候,我们又假设接收方缓冲区和接收窗口无限大,对数据来者不拒。现在,是时候综合考虑他们的时候了。

如何综合考虑这两者呢?实际上很简单,我们只要将接收方的窗口 rwnd 和拥塞窗口 cwnd 放在一起比较,取两者中的较小者,也就是:

发送方的窗口上限值=min{rwnd,cwnd}

发送方的窗口上限值 = \min \{rwnd, cwnd\}

上式指出:

  • rwnd < cwnd : 是接收方的接收能力限制了发送方窗口的最大值。
  • cwnd < rwnd : 是网络的拥塞限制了发送方窗口的最大值。

4. 总结

  • 掌握快重传与快恢复
  • 知道 TCP Reno 版本和 TCP Tahoe 版本的区别
  • 如何综合考虑流量控制与拥塞控制

27-TCP 协议(快重传与快恢复)相关推荐

  1. 网络:TCP停止等待、超时重传、滑动窗口、拥塞控制、快重传和快恢复

    TCP超时与重传机制 TCP协议是一种面向连接的可靠的传输层协议,它保证了数据的可靠传输,对于一些出错,超时丢包等问题TCP设计的超时与重传机制.其基本原理:在发送一个数据之后,就开启一个定时器,若是 ...

  2. UDP(首部)和TCP(首部、三次握手、四次挥手、可靠传输、滑动窗口、流量控制、拥塞控制(慢开始、拥塞避免、快重传、快恢复))

    1.UDP 用户数据报协议 UDP(User Datagram Protocol): 是无连接的,尽最大可能交付,没有拥塞控制,面向报文(对于应用程序传下来的报文不合并也不拆分,只是添加 UDP 首部 ...

  3. 5.3.3 计算机网络传输层之TCP拥塞控制(慢开始与拥塞避免、快重传和快恢复)

    文章目录 1.什么是拥塞控制? 2.拥塞控制与流量控制的区别 3.拥塞控制的4种算法 (1)慢开始与拥塞避免 (2)快重传和快恢复 1.什么是拥塞控制? 所谓拥塞控制,是指防止过多的数据注入网络,保证 ...

  4. 关于慢开始、拥塞控制、快重传、快恢复算法的理解

    门限值(ssthresh):过了门限值就采用拥塞控制算法 拥塞窗口:某时刻能发送多少报文段 超时:一旦发送方发现超时,立刻就调整门限值,为顶峰窗口1/2,然后采用慢开始算法. 收到三个重复ACK:一旦 ...

  5. TCP之快重传与快恢复

    1.快重传 对于接收方来说,如果接收方收到一个失序的报文段,就立即回送一个 ACK 给发送方 当发送方收到了3个重复的ACK时,则发送方快速重传丢失的包(所谓失序的报文是指,用户没有按照顺序收到TCP ...

  6. TCP协议(二) 重传 乱序和丢包

    TCP重传机制 接收端给发送端的Ack确认只会确认最后一个连续的包,比如,发送端发了1,2,3,4,5一共五份数据,接收端收到了1,2,于是回ack 3,然后收到了4和5. 1)超时重传 一种是不回a ...

  7. 【计算机网络】传输层 : TCP 拥塞控制 ( 慢开始 | 拥塞避免 | 快重传 | 快恢复 )

    文章目录 一.TCP 拥塞控制 二.TCP 拥塞控制算法 三.慢开始 和 拥塞避免 算法 四.快重传 和 快回复 算法 一.TCP 拥塞控制 TCP 拥塞控制 : ① 拥塞出现表现 : 资源需求总和 ...

  8. TCP协议基于计时器的重传策略模拟实战

    前言: 关于TCP协议的重传策略,是TCP数据传输正确性的重要保证. 由于下层网络层协议可能出现的包丢失.重复.失序包等问题,当TCP协议基于某种策略确认当前包已经发生以上情况,就会启动重传. TCP ...

  9. 《lwip学习10》-- TCP协议

    TCP服务简介 UDP 运载的数据是以报文的形式,各个报文在网络中互不相干传输, UDP 每收到一个报文就递交给上层应用,因此如果对于大量数据来说,应用层的重装是非常麻烦的,因为UDP 报文在网络中到 ...

最新文章

  1. JS 实现可停顿的垂直滚动
  2. CentOS 6.5 手动rpm包安装gcc、g++
  3. 基于LZ77算法的文件解压缩项目缺陷分析
  4. 使用PrimeFaces开发数据导出实用程序
  5. 松下壁挂式新风系统推荐_松下壁挂式新风怎么样 松下壁挂式新风系统优势介绍【详解】...
  6. uln2003驱动蜂鸣器_让蜂鸣器发声
  7. canny算子的理论分析
  8. 解决保存快照失败后redis无法写入的问题( Redis is configured to save RDB snapshots)
  9. JAVA输入jdb,解决 JAVA 单步调试键盘输入被 JDB 占用的问题
  10. 支持鸿蒙系统的手机名单,华为鸿蒙系统支持手机型号名单
  11. Reed-Solomon Codes——RS纠错码
  12. Windows电脑添加打印机
  13. 【C++OJ多重继承与虚拟继承】商旅信用卡(多重继承)
  14. 【求职经历】四川移动暑期实习面试经历
  15. 实现智能dns为用户分配最佳线路
  16. AdBlock/AdBlock Plus 屏蔽广告
  17. 正则表达式的用法和常用正则表达式大全(转)
  18. 天池-淘宝用户行为数据分析(python+Tableau)
  19. DM8在银河麒麟服务器上配置Oracle19c的DBLINK服务
  20. PyCharm + PySide2/PySide6 外部工具配置

热门文章

  1. C语言之通讯录的制作并用文件存储
  2. DC / DC boost电路带闭环控制
  3. HTML常用标签之列表标签
  4. 线程间操作无效: 从不是创建控件的线程访问它。
  5. 4.Redis的内存维护策略
  6. 洛谷 P1135奇怪的电梯
  7. 未来两年前装激光雷达规模超150万颗,技术路线博弈下的市场
  8. Android上层与驱动交互完整篇(一)I2C设备驱动篇
  9. 名悦集团:买一辆车花多少钱才能买到中意的
  10. 分享2款设备管理系统源码:Springboot医院设备管理+物联网云监控IOT设备管理