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

几个相关概念:

1.  MSL

  MSL 是Maximum Segment Lifetime英文的缩写,中文可以译为“报文最大生存时间”,他是任何报文在网络上存在的最长时间,超过这个时间报文将被丢弃。

2. TTL

  IP头中有一个TTL域,TTL 是 time to live的缩写,中文可以译为“生存时间”,这个生存时间是由源主机设置初始值但不是存的具体时间,而是存储了一个ip数据报可以经过的最大路由数,每经 过一个处理他的路由器此值就减1,当此值为0则数据报将被丢弃,同时发送ICMP报文通知源主机。RFC 793中规定MSL为2分钟,实际应用中常用的是30秒,1分钟和2分钟等。
TTL与MSL是有关系的但不是简单的相等的关系,MSL要大于等于TTL。

3. RTT

  RTT是客户到服务器往返所花时间(round-trip time,简称RTT),TCP含有动态估算RTT的算法。TCP还持续估算一个给定连接的RTT,这是因为RTT受网络传输拥塞程序的变化而变化

TCP限制向其连接发送流量

TCP连接的每一端都是由一个接收缓存、一个发送缓存和几个变量组成。运行在发送方的TCP拥塞控制机制跟踪一个额外的变量,拥塞窗口(cwnd),它对一个TCP发送方能向网络中发送流量的速率进行了限制:在一个发送方中未被确认的数据量不会超过cwnd和rwnd中的最小值,即 LastByteSent - LastByteAcked <= min{cwnd, rwnd}
    通过约束发送方中未被确认的数据量,间接限制了发送方的发送速率。考虑一个丢包和发送时延均可以忽略不计的连接。在每个往返时间 (RTT)的起始点,上面的限制条件允许发送方向该连接发送cwnd个字节的数据,在该RTT结束时发送方接收对数据的确认报文。因此,该发送方的发送速率大概为 cwnd/RTT 字节/秒。

TCP检测网络发生拥塞

当出现超时未反馈或者收到接收方的3个冗余ACK,则出现丢包事件。则发送方认为在发送方到接收方的路径上出现了拥塞的指示。 
    冗余ACK是指接收方回给发送方和之前的ACK相同的一个ACK。这出现在,当接收方本应该接收X字节开头的报文,却收到X字节之后的某字节开头的报文(即X字节开始的报文丢失)时,接收方返回给发送方和上次相同的ACK报文,即报文的确认号位置仍然填写X。 
这样发送方就知道X字节开始的报文丢失,从而会重传X字节开头的报文。

TCP拥塞控制算法

TCP拥塞控制算法包括慢启动、拥塞避免、快速恢复三个部分。 
1. 慢启动 
    TCP连接开始时,cwnd的值通常初始置为一个MSS的较小值,这就使得初始发送速率大约为 MSS/RTT;之后,每收到一个报文段的首次被确认cwnd就增加一个MSS。这样,第一个RTT中,cwnd为1 MSS, 第二个RTT中,cwnd为2 MSS, 第三个RTT中,cwnd为4 MSS, 即每个RTT之后,cwnd就翻倍,cwnd呈指数增长。 
    当发生丢包时,设置一个变量 ssthresh(慢启动阈值) = cwnd / 2, 然后cwnd重新设为1。

2. 拥塞避免 
    当出现丢包时,如果(可能会直接进入快速恢复)进入慢启动阶段,ssthresh设为 cwnd/2, cwnd值置为1,然后每个RTT cwnd翻倍,当cwnd值到达 ssthresh之后,进入拥塞避免阶段。 
    此时,每个RTT,cwnd值只增加1个MSS,即每收到一个报文的ACK,cwnd = cwnd + MSS/cwnd.直到再次出现丢包后。当出现超时类型的丢包时,进入慢启动阶段(ssthresh = cwnd/2, cwnd=1);当出现三次冗余ACK类型的丢包时,进入快速恢复阶段(ssthresh = cwnd/2, cwnd = ssthreash + 3MSS)

 
3. 快速恢复 
    当出现三次冗余ACK类型的丢包时,进入快速恢复阶段。此时 ssthresh = cwnd/2, cwnd = ssthreash + 3MSS,之后每个RTT内,cwnd增加1个MSS,直到出现丢包。

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

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

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

  2. s6-8 TCP 拥塞控制

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

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

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

  4. TCP拥塞控制机制

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

  5. 3.7 TCP拥塞控制

    3.7 TCP拥塞控制 在3.5.5流量控制中有,接收方通过维护一个rwnd来控制流量,本节中考虑三个问题: 第一,  一个TCP发送方如何限制它向其他连接发送流量的速率. 第二,  一个TCP发送方 ...

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

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

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

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

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

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

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

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

随机推荐

  1. logo上线

  2. 《Effective C++》读书摘要

    http://www.cnblogs.com/fanzhidongyzby/archive/2012/11/18/2775603.html 1.让自己习惯C++ 条款01:视C++为一个语言联邦 条款 ...

  3. view class source code with JAD plugin in Eclipse

    The default class viewer doesn't decompile the class file so you cannot open and check the source co ...

  4. COM技术の接口

    什么是接口 DLL的接口可以理解为其导出的那些函数,C++类的接口则是该类的一个成员函数集. 对于COM来说,接口是一个包含一个函数指针数组的内存结构,每一个数组元素包含的是一个由组件所实现的函数的地 ...

  5. VC 实现文件与应用程序关联(转载)

    转载:http://www.cnblogs.com/RascallySnake/archive/2013/03/01/2939102.html 日常工作中,doc文件直接双击后,就能启动word软件, ...

  6. GZFramwork快速开发框架演练之会员系统(一)框架源码下载

    GZFramwork框架开发环境为.NET 4.0 (必须)   VS2013+SQL2005+DevExpress v13.2.8+FastReport (推荐)  数据库建模工具PowerDesi ...

  7. linux 中的快捷键

    终端快捷键 tab=补全 ctrl+a=开始位置 ctrl+e=最后位置 ctrl+k=删除此处至末尾所有内容 ctrl+u=删除此处至开始所有内容 ctrl+d=删除当前字母 ctrl+w=删除此处 ...

  8. FPM的远程利用

    看了lijiejie的博客,和乌云的PHPFastCGI的这篇文章,感觉在实际的业务中经常能遇到,所以在此记录下来: 原文:http://www.lijiejie.com/fastcgi-read-f ...

  9. jQuery:使用$获取对象后检查该对象是否存在

    注意: 1)即使jQ获取到网页中不存在的元素也不会报错 2)使用$("#tt")形式获取到的永远是对象,即使网页上没有此元素 jQuery检查某个元素在网页上是否存在时,不能使用以 ...

  10. 图-用DFS求连通块- UVa 1103和用BFS求最短路-UVa816。

    这道题目甚长, 代码也是甚长, 但是思路却不是太难.然而有好多代码实现的细节, 确是十分的巧妙. 对代码阅读能力, 代码理解能力, 代码实现能力, 代码实现技巧, DFS方法都大有裨益, 敬请有兴趣者 ...