3.7 TCP拥塞控制

在3.5.5流量控制中有,接收方通过维护一个rwnd来控制流量,本节中考虑三个问题:

  第一,  一个TCP发送方如何限制它向其他连接发送流量的速率。

  第二,  一个TCP发送方如何感知从发送方到目的方产生了拥塞。

  第三,  当发送方感知到拥塞,采取什么算法来改变发送速率。

第一个问题,一个TCP发送方如何限制它向其他连接发送流量的速率?

TCP连接每一端都由一个发送缓存,接收缓存和几个变量组成(这些在TCP连接的时候分配的),在发送方TCP拥塞控制机制跟踪一个额外的变量,拥塞控制窗口(cwnd),它对发送方能向网络中发送流量的速率进行了限制:

LastByteSent – LastByteAcked <= min { cwnd, rwnd};

上式左边表示是的未确认量,这个很容易理解,未被确认的就是还在传输过程中,或者是ACK还在传输过程中的未被确认的一定要小于rwnd这个必须得,多了就会丢包,发送端控制不了rwnd(因为是接收端的变量),所以通过可控制cwnd来控制发送方的速率。

第二个问题,一个TCP发送方如何感知从发送方到目的方产生了拥塞?

TCP把丢包定义为:超时和收到3个冗余ACK。拥塞时,可能是路由器的缓存满了,来了数据传输速率太快了,来不及发,只能存到缓存里,但是缓存也满了只能丢弃,这样就造成了丢包。当出现丢包的时候,发送方就会意识到已经遇到拥塞了。

第三个问题,感知到拥塞后,什么算法改变发送速率?

这就是下面要将的了!

1.  慢启动

  发送方通过控制cwnd来控制发送速率。

开始的时候cwnd的值通常初始置为一个MSS的最小值,发送方想快速的找到可用带宽的数量。

每当报文段首部被确认,cwnd就会增加一个MSS,所以一个拥塞窗口的报文段都被确认之后,cwnd会增加一倍。就会是1,2,4,8…这样增长。

什么时候停止增长呐?

当出现超时或者丢包(拥塞了),TCP发送方会将cwnd设置为1,同时用变量ssthresh(“慢启动阈(yu)值”的速记)设置为拥塞窗口值得一半。当cwnd超过ssthresh时再翻倍就可能会拥塞了,所以此时转入拥塞避免。

2.  拥塞避免

拥塞避免就是在拥塞窗口内的报文全部确认后增加的长度为1MSS,也就是说每收到一个确认报文就增加MSS / cwnd。

何时停止增长?

和慢启动一样,拥塞了,cwnd置1,然后ssthresh标记为cwnd / 2,当cwnd大于等于ssthresh时进入快速恢复。

3.快速恢复

在快速恢复中,初始cwnd不置为1(也就是说不会在进行慢启动),首先cwnd = cwnd / 2,ssthresh = cwnd,,然后开始快速恢复:

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

2. 重传丢失的数据包

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

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

最后给出流程图(摘自博客园:http://www.cnblogs.com/stemon/p/4784142.html):

3.7 TCP拥塞控制的更多相关文章

  1. TCP拥塞控制

    TCP必须使用端到端拥塞控制而不是使网络辅助的拥塞控制,因为IP层不向端系统提供显式的网络拥塞反馈.TCP采用的方法是让每一个发送方根据所感知到的网络拥塞程度来限制其能向连接发送流量的速率. 几个相关 ...

  2. [置顶] NS2中TCP拥塞控制仿真过程中盲点解析

    最近利用NS2做TCP拥塞控制协议的仿真,发现很多变量的方法含义都是解释的不清楚,给核心模块修改带来很多麻烦,所以决定用最准确的语言解释成员变量.方法,术语等的含义.限于个人水平,若有错误请留言指正! ...

  3. s6-8 TCP 拥塞控制

    TCP 拥塞控制  虽然网络层也试图管理拥塞,但是,大多数繁重的任务是由TCP来完成的,因为针对拥塞的真正解决方案是减慢数据率  分组守恒:当有一个老的分组离开之后才允许新的分组注入网络  TC ...

  4. TCP/IP 笔记 - TCP拥塞控制

    拥塞控制是TCP通信的每一方需要执行的一系列行为,这些行为有特定算法规定,用于防止网络因为大规模的通信负载而瘫痪.其基本方法是当有理由认为网络即将进入拥塞状态(或已由于拥塞而出现路由丢包情况)时减缓T ...

  5. TCP拥塞控制机制

     研究TCP的拥塞机制,不仅仅是想了解TCP如何的精巧,更多的是领悟其设计思想,即在一般情况下,我们该怎样处理问题.   一.拥塞的发生与其不可避免    拥塞发生的主要原因:在于网络能够提供的资源不 ...

  6. TCP拥塞控制及连接管理

    在阅读此篇之前,博主强烈建议先看看TCP可靠传输及流量控制. 一.TCP拥塞控制 在某段时间,若对网络中某资源的需求超过了该资源所能提供的可用部分,网络的性能就要变坏——产生拥塞(congestion ...

  7. 牛客网Java刷题知识点之拥塞发生的主要原因、TCP拥塞控制、TCP流量控制、TCP拥塞控制的四大过程(慢启动、拥塞避免、快速重传、快速恢复)

    不多说,直接上干货! 福利 => 每天都推送 欢迎大家,关注微信扫码并加入我的4个微信公众号:   大数据躺过的坑      Java从入门到架构师      人工智能躺过的坑          ...

  8. 计算机网络概述 传输层 TCP拥塞控制

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

  9. 现代互联网的TCP拥塞控制(CC)算法评谈

    动机 写这篇文章本质上的动机是因为前天发了一个朋友圈,见最后的写在最后,但实际上,我早就想总结总结TCP拥塞控制算法点点滴滴了,上周总结了一张图,这周接着那些,写点文字. 前些天,Linux中国微信公 ...

随机推荐

  1. 在 Symfony Command中自定义脚本把Excel数据导入到数据库中

    // 注:只是在此做下记录,有兴趣的可以参考,不做实际教程文档 <?php/** * Created by IntelliJ IDEA. * User: davis * Date: 2019-0 ...

  2. 四、利用EnterpriseFrameWork快速开发基于WCF为中间件的三层结构系统

    回<[开源]EnterpriseFrameWork框架系列文章索引> EnterpriseFrameWork框架实例源代码下载: 实例下载 本章内容与上一张<利用Enterprise ...

  3. iframe ie低版本 横向滚动条的解决办法

    吐槽下百度,在百度搜这个问题都是渣渣,谷歌直接就出来了,记录一下 设置Frame时,有一属性是scrolling="yes/no/auto",IE6的mozilla都支持,或许对a ...

  4. 「LeetCode」0952-Largest Component Size by Common Factor(Go)

    分析 注意到要求的是最大的连通分量,那么我们可以先打素数表(唯一分解定理),然后对每个要求的数,将他们同分解出的质因子相连(维护一个并查集),然后求出最大的联通分量即可. 这里使用了筛法求素数.初始化 ...

  5. 180725-InfluxDB-v1.6.0安装和简单使用小结

    InfluxDB安装和简单使用小结 InfluxDB是一个时序性数据库,因为工作需求,安装后使用测试下是否支持大数据下的业务场景 说明: 安装最新版本 v1.6.0 集群版本要收费,单机版本免费 内部 ...

  6. 创建第一个Scrapy项目

    d:进入D盘 scrapy startproject tutorial建立一个新的Scrapy项目 工程的目录结构: tutorial/ scrapy.cfg # 部署配置文件 tutorial/ # ...

  7. Base64编码图片存取与前台显示

    需求:将Base64编码图片以BLOB类型存入数据库,需要时取出显示 后台: String base64str=new String(log.getRequest_imgdata());//log为实 ...

  8. 卡特兰数(Catalan)及其应用

    卡特兰数 大佬博客https://blog.csdn.net/doc_sgl/article/details/8880468 卡特兰数是组合数学中一个常出现在各种计数问题中出现的数列. 卡特兰数前几项 ...

  9. 王者荣耀交流协会第三次Scrum立会

    会议时间:2017年10月22号   18:00-18:32,时长32分钟. 会议地点:中快餐厅二楼第二排倒数第二个桌子. 立会内容: 1.每位同学汇报了今日工作. 2.通过讨论我们决定用存excel ...

  10. P4语法(3)Table,Action

    Table table是p4的匹配——动作表,定义了匹配字段(key).动作(action)和一些其他相关属性. 其处理数据包的流程: Key construction.建立其匹配字段 Key loo ...