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. 一个非常好用的PHP数组函数

    array_column 该函数非常有用,在PHP 5.5中可直接调用. 有如下二维数组,如要抽取每个子数组中的特定项. <?php // Array representing a possib ...

  2. 【索引】MySQL索引

    一.索引的定义及作用 1. 二.索引的创建及删除 1.1查看表的索引 show index from tblname; 1.2.创建索引 1.22创建普通索引 ALTER TABLE `table_n ...

  3. Redis的事物

    Redis的事物 Redis 事物常用命令 multi标记一个事物块的开始   exec:执行所有事物块内的命令   discard: 取消事物,放弃执行事物块的所有命令   watch key [k ...

  4. Python接口测试实战5(下) - RESTful、Web Service及Mock Server

    如有任何学习问题,可以添加作者微信:lockingfree 课程目录 Python接口测试实战1(上)- 接口测试理论 Python接口测试实战1(下)- 接口测试工具的使用 Python接口测试实战 ...

  5. python的pip升级问题

    近来由于pip升级为10.0.1了,导致使用pip命令报错,使用过很多方法,最终找到一种相对靠谱的方法,一下是步骤: 进入https://pypi.python.org/pypi/pip 下载pip- ...

  6. JMeter学习工具简单介绍

    JMeter学习工具简单介绍   一.JMeter 介绍 Apache JMeter是100%纯JAVA桌面应用程序,被设计为用于测试客户端/服务端结构的软件(例如web应用程序).它可以用来测试静态 ...

  7. 列出连通集(mooc)

    给定一个有N个顶点和E条边的无向图,请用DFS和BFS分别列出其所有的连通集.假设顶点从0到N−1编号.进行搜索时,假设我们总是从编号最小的顶点出发,按编号递增的顺序访问邻接点. 输入格式: 输入第1 ...

  8. SVN部署与简单使用

    原文发表于cu:2016-05-24 参考文档: http://www.tuicool.com/articles/Yv2iyu7 http://www.centoscn.com/CentosServe ...

  9. C++进阶训练——停车收费系统设计

    一.简介 经过一段时间的c++基础学习,是时候做一个较为全面的.运用c++功能的较复杂的项目练练手了. 运用软件:Visual Studio   (VS). 题目:c++停车收费系统设计(某本编程书进 ...

  10. Pythagorean Triples毕达哥斯拉三角(数学思维+构造)

    Description Katya studies in a fifth grade. Recently her class studied right triangles and the Pytha ...