TCP Reno

TCP  Reno引入了ssthresh(Slow Start threshold)变量,作为TCP的Slow Start和Congestion Avoidance两个阶段的分界线。

当cwnd < ssthresh时,TCP保持在Slow Start阶段;

当cwnd >= ssthresh时,TCP进入Congestion Avoidance阶段。

ssthresh实际上影响着TCP的性能,但其初始值在RFC中没有明确定义,可以为任意大的值,在实现时一般初始化为rwnd。

TCP Reno拥塞控制算法继承了“数据包守恒准则”,保证处于网络中的packet的总量是守恒的。它通过4个算法保证这一点:

1. Slow Start

在TCP连接建立之后,由于不知道实际可用的网络带宽,因此采用Slow Start算法,小心翼翼地对网络情况进行探测。

进入Slow Start阶段,首先设置cwnd=1,接着cwnd会随着时间的推进呈指数级增加(因此,其过程并不slow)。具体做法是每收到一个ACK,就对cwnd+1,这样相当于每经过一个RTT,cwnd就翻一番。

在遇到两种情况时,Slow Start阶段会截止:

(1)当cwnd达到ssthresh时,此时TCP会进入Congestion Avoidance阶段。

(2)当拥塞发生时,此时又分两种情况:

(2.1)如果是超时,会重传未被响应的packet,并将ssthresh设置为cwnd/2,并将cwnd重置为1,然后重新进入Slow Start阶段。

(2.2)如果是3个重复ACK,会先进行Fast Retransmit,然后进入Fast Recovery阶段。

2. Congestion Avoidance

在该阶段,cwnd不再像Slow Start那样指数级增长,而是线性增长。具体做法是每收到一个ACK,就对cwnd+1/cwnd,这样相当于每过一个RTT,cwnd都加1。

当拥塞发生时,Congestion Avoidance阶段即截止,接下来的过程与Slow Start处理拥塞的方式相同:

(1)如果是超时,会重传未被响应的packet,并将ssthresh设置为cwnd/2,并将cwnd重置为1,然后进入Slow Start阶段。

(2)如果是3个重复ACK,会先进行Fast Retransmit,最后进入Fast Recovery阶段。

3. Fast Retransmit

当检测是否丢包时,每次都要等待超时的发生,会浪费很长时间,因此引入了Fast Retransmit机制。

通过TCP的机制可知,sender只要收到3个重复ACK,即认为丢包发生,此时会立即重传丢失的包,而不再等待超时的出现。

4. Fast Recovery

为了解决丢包后进入Slow Start引起的效率降低,在Fast Retransmit的基础上,又引入了Fast Recovery机制。

该阶段首先将ssthresh设置为cwnd/2,然后重传丢失的包,再对cwnd进行充气(而不是SlowStart那样将cwnd重置为1),具体做法是在cwnd=ssthresh+3(用以反映3个packet正常离开了network)。

之后,每当再次收到一个重复ACK时,sender都会对cwnd+1,这是为了反映一个packet正常离开了network。

这里可能有两个疑问:

(1)怎么得知一个packet正常离开了network呢?这是因为receiver只有在收到packet之后,才会回复ACK,既然sender收到了ACK,说明有一个packet被receiver接收,即正常离开了network。

(2)那么,为什么需要对cwnd+1呢?这是因为一个packet离开了network,使得network不再饱和,为了使network重新平衡,需要发送新的packet到network中,这就必须通过增大cwnd来实现。

随着cwnd的增大,会将新进入窗口的packet发送出去。这个过程称为inflating。

直到收到新的ACK之后,inflating截止,进入deflating过程。所谓deflating,即将cwnd设置为ssthresh。

为什么收到新的ACK后,需要进行deflating呢?这是因为,新的ACK意味着,刚进入Fast Recovery时重传的packet已经被接收,该ACK即是receiver对重传packet的回应。可以认为lost packet已经恢复了,可以结束Fast Recovery阶段。

值得注意的是,该ACK可能一次性响应了多个连续的packet。这是因为,从lost packet发生时起,到lost packet恢复为止,期间sender发送了多个后续packet,因此在receiver回复ACK时,会指明已接收到的最末端的packet的sequence number。

TCP的拥塞控制 (二)的更多相关文章

  1. 上位机面试必备——TCP通信灵魂二十问【上】

    关注公众号获取更多干货 TCP通信协议应该是上位机开发中应用最广泛的协议,无论是西门子S7协议.三菱MC协议或者是欧姆龙的Fins-TCP协议等,都是TCP通信协议的典型应用.很多人在上位机面试时,都 ...

  2. 计算机网络(10)-----TCP的拥塞控制

    TCP的拥塞控制 拥塞(congestion) 在某段时间,若对网络中某一资源的需求超过了该资源所能提供的可用部分,网络的性能就要变坏. 拥塞控制 拥塞控制就是防止过多的数据注入到网络中,这样可以使网 ...

  3. TCP网络拥塞控制

    拥塞控制过程 数据吞吐量 TCP窗口大小,窗口流量控制,慢启动对TCP的成块数据传输综合作用,可能对TCP的数据传输有意想不到的影响. RTT(Round-Trip Time) :往返时间.是指一个报 ...

  4. TCP/IP拥塞控制

    TCP/IP拥塞控制包括:慢启动和拥塞避免.其操作流程如下所述: 初始化.拥塞窗口cwnd = 1,慢启动门限ssthresh = 65535 如果没有发生拥塞 若 cwnd < ssthres ...

  5. 上位机面试必备——TCP通信灵魂二十问【下】

    上篇文章跟大家介绍了TCP通信常见的前10个面试题,没看过的小伙伴可以点击下方链接进行查看: 上位机面试必备——TCP通信灵魂二十问[上] 今天就后面的10个面试题接着做下说明:欢迎关注[dotNet ...

  6. TCP的拥塞控制

    1.引言 计算机网络中的带宽.交换结点中的缓存和处理机等,都是网络的资源.在某段时间,若对网络中某一资源的需求超过了该资源所能提供的可用部分,网络的性能就会变坏.这种情况就叫做拥塞. 拥塞控制就是防止 ...

  7. TCP的拥塞控制(转载)

    1.引言 计算机网络中的带宽.交换结点中的缓存和处理机等,都是网络的资源.在某段时间,若对网络中某一资源的需求超过了该资源所能提供的可用部分,网络的性能就会变坏.这种情况就叫做拥塞. 拥塞控制就是防止 ...

  8. TCP/IP(二)物理层详解

    前言 在前面说了一下,计算机网络的大概内容,没有去深刻的去了解它,这篇文章给大家分享一下物理层! 我们知道ISO模型是七层,TCP/IP模型是五层,而tcp/ip协议只将七层概括为4层,我们将学习其中 ...

  9. 【TCP/IP】二、协议的概念

    一.概念 1.tcp/ip是通信协议的统称. 2.协议就是计算机与计算机之间通过网络实现通信时,事先达成的一种约定.这种约定,使那些不同厂商的设备,不同的CPU以及不同的操作系统组成的计算机之间,只要 ...

随机推荐

  1. kallsyms , addr to symbol

    #!/usr/bin/env python # addr2sym.py - resolve addresses to symbols, using a map file # Reads a log f ...

  2. Eclipse与MySQL数据库连接步骤

    将Eclipse与数据库进行连接的步骤: 1. 下载并配置MySQL 2. 为新建的项目配置mysql的jar包(jdbc和connection的配置) a) 可直接引用外部文件(不建议做,这样项目一 ...

  3. Codeforces Round #500 (Div. 2) D - Chemical table

    首先我们如果满足三缺一,那么必有同行和同列的点 如果两行有同列的数,我们可以设想,他们最后会全部填充成为两者啥都有的情况 显然这个是个并查集 现在我们有了很多集合,每个集合自己可以进行三缺一操作,但是 ...

  4. 用Python实现多站点运维监控

    在小型公司里如果产品线单一的话,比如就一个app, 一般1~2个运维就够用了.如果产品过于庞大,就需要多个运维人员. 但对于多产品线的公司来说,运维人员就要必须分多个人负责,因为超过200个站点让1个 ...

  5. Python基础入门(迭代器和生成器)

    1 Python迭代器 迭代器是一个可以记住遍历的位置的对象. 迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束. 迭代器只能往前不会后退. 迭代器有两个基本的方法:iter() 和 ...

  6. Java解惑之TreeSet是如何去重的

    引言: 最近在处理一个问题,大致是这个样子,从数据库里面取出一个集合,取出来的数据放到一个JavaBean里面.结果得到的集合长度为1. TreeSetSet的一个实现,默认实现排序:故TreeSet ...

  7. python—2.x中如何使用中文

    python2.x 默认使用ASCII编码格式 python3.x 默认使用UTF-8编码格式 在python2.x文件的第一行增加一下代码,解释器会以utf-8编码来处理python文件. # *_ ...

  8. Paper Reading - Long-term Recurrent Convolutional Networks for Visual Recognition and Description ( CVPR 2015 )

    Link of the Paper: https://arxiv.org/abs/1411.4389 Main Points: A novel Recurrent Convolutional Arch ...

  9. 如何让QT程序以管理员权限运行(UAC)

    方案一:(仅适用于使用msvc编译器) 在PRO文件中添加一行指令即可, QMAKE_LFLAGS += /MANIFESTUAC:"level='requireAdministrator' ...

  10. centos下安装升级python到python3.5

    本文摘抄自:https://www.cnblogs.com/edward2013/p/5289056.html  请支持原版 CentOS7安装Python3.5   2. 安装Python的依赖包 ...