TCP的拥塞控制 (四)
NewReno是在Reno的基础上,改进了Fast Recovery,主要思想是保证处于network中的packet的总量是饱和的。
在Reno算法中,一个超时会导致相应的那个packet的重传,然而,一个超时发生时,本可以重传多个潜在的丢包,但Reno算法没有这样实现,这就导致性能不高。
Reno在遇到多包丢失时,存在两个问题:一个是,大量的包没有足够的重复ACK触发重传,只能等待超时才能得以重传。第二个是,即使采取措施(在Partial Acknowledgement一节中已有所讨论)避免了超时,也会存在Multiple Fast Retransmits和严重的window reduction现象,这些会影响TCP的性能。在Multiple Fast Retransmits一节中,我们讨论了相应的解决方案。NewReno正是在此方案的基础上进行的改进。
NewReno添加一个recover变量,作为Fast Recovery阶段的一个阈值,当sender成功发送到recover所标识的packet时,Fast Recovery阶段才结束。这里成功发送的标志是收到来自receiver的正常ACK。
每当进入Fast Recovery阶段时,recover都更新为high_seq(当前已经发送出去的packet的最大序号),而在进入Fast Recovery阶段之前,recover中保持的是上一个Fast Recovery阶段更新的recover的值。实际上,recover表示的是当前窗口中,可能的丢包的最大序号,Fast Recovery阶段的目标就是恢复这里面的所有的丢包,因此,recover是Fast Recovery阶段的边界。
NewReno不允许Multiple Fast Retransmits,因此在收到3次重复ACK时,如果TCP已经处于Fast Recovery阶段,则不会进行Fast Retransmit。并且,即使TCP没有处于Fast Recovery阶段,NewReno还会判断重复ACK中的序号是否大于当前recover的值(当前recover的值实际是上一个Fast Recovery阶段的recover的值)。如果小于,则说明ACK指明的packet是上一轮Fast Recovery已经处理过的packet,其肯定已经在上一轮被重传了,之所以仍然有3次重复ACK,可能是乱序或者重复发送receiver端已经存在的packet导致的,并不意味着丢包,因此不需要重传。如果大于,则说明这是一个显然的丢包,会进入Fast Recovery进行处理。
进入Fast Recovery之后,会继续收到重复ACK,直到收到非重复ACK为止,这期间的操作与传统的Reno一致,NewReno的特别之处体现在处理非重复ACK的环节。
当收到一个非重复ACK时,这个ACK可能响应的是Fast Retransmit重传的packet,也可能是Fast Retransmit之后重传的packet。由于多包丢失的存在,这个ACK可能是Full ACK或者Partial ACK,对这两种ACK会采取不同的处理方式。
如果ack_seq>recover,则该ACK为Full ACK。它响应了进入Fast Recovery之前sender所发送的全部packet,按规定可以退出Fast Recovery阶段。在退出之前,会将cwnd缩减到min(ssthresh, FlightSize+SMSS),以保证网络的守恒。
如果ack_seq<recover,则该ACK为Partial ACK。在Partial Acknowledgement一节中已经讨论过,Partial ACK意味着多包的丢失,因此,NewReno会重传某些packet。与其他方案不同,NewReno并不重传Partial ACK中指明的packet,而是目前未被响应的最小的packet,这样可以保证重传始终是从左到右依次进行,保持连续型。与Reno一样,重传之后,NewReno缩减cwnd。具体的做法是,首先减去Partial ACK所响应的packet的数量,然后加上SMSS。总体上是为了保证Fast Recovery结束时,有ssthresh大小的packet在网络中传输。
由于多包丢失的存在,NewReno针对Partial ACK的处理,仍然不能快速的恢复所有丢失的packet,因此超时会经常发生。当超时发生时,NewReno采取的措施是退出Fast Recovery,并在退出之前将recover的值更新为当前high_seq。
TCP的拥塞控制 (四)的更多相关文章
- 计算机网络(10)-----TCP的拥塞控制
TCP的拥塞控制 拥塞(congestion) 在某段时间,若对网络中某一资源的需求超过了该资源所能提供的可用部分,网络的性能就要变坏. 拥塞控制 拥塞控制就是防止过多的数据注入到网络中,这样可以使网 ...
- TCP网络拥塞控制
拥塞控制过程 数据吞吐量 TCP窗口大小,窗口流量控制,慢启动对TCP的成块数据传输综合作用,可能对TCP的数据传输有意想不到的影响. RTT(Round-Trip Time) :往返时间.是指一个报 ...
- 为什么建立TCP连接需要三次握手,为什么断开TCP连接需要四次握手,TIME_WAIT状态的意义
为什么建立TCP连接需要三次握手? 原因:为了应对网络中存在的延迟的重复数组的问题 例子: 假设client发起连接的连接请求报文段在网络中没有丢失,而是在某个网络节点长时间滞留了,导致延迟到达ser ...
- TCP/IP拥塞控制
TCP/IP拥塞控制包括:慢启动和拥塞避免.其操作流程如下所述: 初始化.拥塞窗口cwnd = 1,慢启动门限ssthresh = 65535 如果没有发生拥塞 若 cwnd < ssthres ...
- TCP的拥塞控制
1.引言 计算机网络中的带宽.交换结点中的缓存和处理机等,都是网络的资源.在某段时间,若对网络中某一资源的需求超过了该资源所能提供的可用部分,网络的性能就会变坏.这种情况就叫做拥塞. 拥塞控制就是防止 ...
- TCP的拥塞控制(转载)
1.引言 计算机网络中的带宽.交换结点中的缓存和处理机等,都是网络的资源.在某段时间,若对网络中某一资源的需求超过了该资源所能提供的可用部分,网络的性能就会变坏.这种情况就叫做拥塞. 拥塞控制就是防止 ...
- 【网络协议】TCP的拥塞控制机制
前言 计算机网络中的带宽.交换节点中的缓存和处理机等,都是网络的资源,在某段时间内,若对网络中某一资源的需求超过了该资源所能提供的可用部分,网络的性能就要变坏,这样的情况就叫做拥塞. 所谓拥塞控制,就 ...
- TCP/IP笔记(四)IP协议
前言 IP相当于OSI参考模型的第3层--网络层:主要作用是"实现终端节点之间的通信"又称"点对点通信". IP作为整个TCP/IP中至关重要的协议,主要负责将 ...
- TCP/IP(四)网络层
前言 前面给大家介绍了计算机网络的基本概述,物理层和数据链路层.这一篇给大家介绍面试中经常会被问到的网络层.在介绍之前我们回顾一下之前学习的知识! CP/IP协议栈:物理层.链路层.网络层.传输层.应 ...
随机推荐
- Drupal views 中合并显示字段
如图, 需要显示如下数据表格 表格的第三列是由两个字段组成的.分别是title 标题字段和body 内容字段. 默认情况下,一列只显示一个字段.如何同时显示两个呢? 这个问题难不到强大的views,要 ...
- 创龙OMAPL138的NMI中断
1. 不可屏蔽中断部分代码,注册中断函数,6748有几个NMI的引脚? void InterruptInit(void) { // 初始化 DSP 中断控制器 IntDSPINTCInit(); // ...
- Flutter系列博文链接
Flutter系列博文链接 ↓: Flutter基础篇: Flutter基础篇(1)-- 跨平台开发框架和工具集锦 Flutter基础篇(2)-- 老司机用一篇博客带你快速熟悉Dart语法 Flutt ...
- mac php版本切换
mac os 中自带php版本,但是很多扩展是不带的. 这个网站: http://php-osx.liip.ch/提供了几乎所有的php版本 通过输入 curl -s http://php-osx.l ...
- (原创)python发送邮件
这段时间一直在学习flask框架,看到flask扩展中有一个mail插件,所以今天就给大家演示如果发邮件. 首先我注册了一个163邮箱,需要开启smtp功能,因为咱们python发送邮件经过的是smt ...
- OpenGL ES学习笔记(二)——平滑着色、自适应宽高及三维图像生成
首先申明下,本文为笔者学习<OpenGL ES应用开发实践指南(Android卷)>的笔记,涉及的代码均出自原书,如有需要,请到原书指定源码地址下载. <Android学习笔记--O ...
- 教你thinkphp5怎么配置二级域名
有些项目要将移动端和PC端分离开来,比如访问xxx.com,展示的是PC端的页面.而访问m.xxx.com,展示的是移动端的页面.thinkphp源码需要多多学习,这里记录一下知识点,顺便分享给需要的 ...
- Winrar去广告图文教程
一.前言 1.1 Winrar 解压缩工具 市场上有很多优秀的压缩工具,常用的有Winrar 和360 压缩工具.Winrar是免费压缩工具,特色是每次使用都会弹出广告.影响用户体验和工作效率,当然最 ...
- 《图解 HTTP 》阅读 —— 第四章
第4章 返回结果的HTTP状态码 1XX 接收的请求正在处理 2XX 请求被处理 200 请求成功 204 请求成功,但是没有返回数据 206 客户端进行了范围请求 3XX 重定向 301 永久性重定 ...
- 【BUG】12小时制和24小时制获取当天零点问题
[BUG]12小时制和24小时制获取当天零点问题 最近在写定时服务的时候,要获取当天的零点这个时间,但是是这样获取的 DateTime dt = DateTime.Parse(DateTime.Now ...