TCP拥塞控制 (1)
Basic:
TCP,传输控制协定,它是目前最广泛使用的网络传输协议。SMTP、SSH、FTP、HTTP等因特网底层协议均是TCP。
TCP面向连接,提供端到端的数据可靠传输。连接时三次握手。断开是四次挥手。详细表现为:
1、 TCP对传输的数据做了序号标记,当中序号标记安装字节数增长。
TCP对端在接收到数据后发出一个ACK给对端(ACK中就包括序列号)。TCP使用确认和超时重传机制保障了数据的可靠性传输。
2、 因为发送和接收端的数据处理能力不同,为了避免数据发送过快而超过了对端的接收能力。TCP採用了流量控制机制,即在数据包的包头通告自身的接收窗体(可以最多接收的数据包)。
转折
TCP看上去已经非常完美。并且TCP開始应用与互联网,直到:
1986年10月,一件事情的发生使得TCP开启了一个新领域,从美国LBL到UC Berkeley的数据吞吐量从32Kbps下降到40bps,详细能够參见V. Jacobson的论文“Congestion Avoidance and Control”
WHY:为啥数据吞吐量下降得如此离谱?
原来TCP的控制机制仅仅考虑了接收端的接收能力。并未意识到网络本身的传输能力也有痛点。从而导致整个网络的崩溃。
拥塞
网络中的有限资源被多个用户使用,并且网络本身并无约束能力。
并且互联网的爆棚发展,不弄点东西协调受限的资源,结果就是大家都没法用。
做个啥呢
当然是能避则避,若是躲不了就勇敢面对。即,拥塞控制算法包含拥塞避免和拥塞控制。
打预防针。避免网络进入拥塞状态,尽量使得网络保持在高吞吐量和低延迟的状态;一旦生病。能够打吊瓶。使网络从拥塞状态中恢复出来。又一次进入高吞吐量和低延迟的状态。
拥塞控制算法
Jacobson 在1988年的论文中提出的TCP的拥塞控制由慢启动算法和拥塞避免组成,后 来增加了高速重传和高速恢复算法。而后还有大大小小的改进(略)。
TCP的拥塞控制主要依赖于拥塞窗体(cwnd)。窗体值的大小就代表可以发送出去的但还没有收到ACK的最大数据报文段。显然窗体越大那么数据发送的速度也就越快,可是也有越可能使得网络出现拥塞。假设窗体值为1,每发送一个数据,传输数据效率低下。
TCP的拥塞控制算法就是要选取权衡点,选取合适的拥塞窗体值。从而在不产生拥塞的情况下使得网络吞吐量最大化。
慢启动算法:
新建立的连接并不会一開始就发送大量的数据包。而是依据网络状况逐步递增每次发送的数量。
cwnd每次的增量为一个MSS,cwnd的值就随着网络往返时间(Round Trip Time,RTT)呈指数级增长。当cwnd的值大于慢启动门限(ssthresh。一般为65535)后,慢启动过程结束,进入拥塞避免阶段。
其实,慢启动的速度一点也不慢,仅仅是起点低。
拥塞避免:
拥塞避免的主要思想是加法增大,也就是cwnd的值不再指数级往上升。開始加法添加,这样就能够避免增长过快导致网络拥塞,慢慢的添加调整到网络的最佳值。
实际中,既要考虑拥塞控制。又要兼顾流量控制。因此。TCP真正的发送窗体是拥塞窗体和接收窗体的最小值。
那有个问题就是TCP怎样确定网络进入了拥塞状态呢?
当TCP数据包的定时器超时,且无ACK信号确认,TCP就会进行重传,此时出现拥塞的可能性就非常大。TCP的反应:
A、 把门限值ssthresh减少为窗体值cwnd的一半。
B、 把窗体又一次置为一个MSS
C、 整个状态又回到了起点---慢启动过程
准则:AIMD原则。和式添加,积式降低。由于一旦出现丢包,那么马上减半退避。能够给其它新建的流留有足够的空间,从而保证整个的公平性。
高速重传
TCP在收到乱序到达包时就会马上发送ACK,TCP利用3个同样的ACK来判定数据包的丢失,此时进行高速重传。高速重传做的事情有:
A、 把门限值ssthresh减少为窗体值cwnd的一半。
B、 把cwnd再设置为ssthresh的值(详细实现有些为ssthresh+3)
C、 又一次进入拥塞避免阶段
高速恢复
高速恢复算法是建立在高速重传的前提下。当收到3个反复ACK时,TCP最后进入的不是拥塞避免阶段。而是高速恢复阶段。
高速恢复的思想是“数据包守恒”原则,即同一个时刻在网络中的数据包数量是恒定的,仅仅有当“老”数据包离开了网络后。才干向网络中发送一个“新”的数据包。(假设发送方收到一个反复的ACK。那么依据TCP的ACK机制就表明有一个数据包离开了网络,于是cwnd递增)。
高速恢复的主要步骤:
1.当收到3个反复ACK时,把ssthresh设置为cwnd的一半,把cwnd设置为ssthresh+3,然后重传丢失的报文段。
2.再收到反复的ACK时。拥塞窗体添加1。
3.当收到新的数据包的ACK时,把cwnd设置为第一步中的ssthresh的值。
原因是由于该ACK确认了新的数据,说明从反复ACK时的数据都已收到,该恢复过程已经结束,再次进入拥塞避免状态。
TCP的缺陷:
Internet得到迅猛发展。从100Mbps到1Gbps到10Gbps,TCP的传统的拥塞控制算法根本无法适应。不仅窗体太小。并且将包的丢失解释为网络发生了拥塞。这在快速网络根本无法成立。
So 。怎么破?接着下一篇。
。
。
參考:http://www.cnblogs.com/fll/archive/2008/06/10/1217013.html
版权声明:本文博主原创文章。博客,未经同意不得转载。
TCP拥塞控制 (1)的更多相关文章
- TCP拥塞控制
TCP必须使用端到端拥塞控制而不是使网络辅助的拥塞控制,因为IP层不向端系统提供显式的网络拥塞反馈.TCP采用的方法是让每一个发送方根据所感知到的网络拥塞程度来限制其能向连接发送流量的速率. 几个相关 ...
- [置顶] NS2中TCP拥塞控制仿真过程中盲点解析
最近利用NS2做TCP拥塞控制协议的仿真,发现很多变量的方法含义都是解释的不清楚,给核心模块修改带来很多麻烦,所以决定用最准确的语言解释成员变量.方法,术语等的含义.限于个人水平,若有错误请留言指正! ...
- s6-8 TCP 拥塞控制
TCP 拥塞控制 虽然网络层也试图管理拥塞,但是,大多数繁重的任务是由TCP来完成的,因为针对拥塞的真正解决方案是减慢数据率 分组守恒:当有一个老的分组离开之后才允许新的分组注入网络 TC ...
- TCP/IP 笔记 - TCP拥塞控制
拥塞控制是TCP通信的每一方需要执行的一系列行为,这些行为有特定算法规定,用于防止网络因为大规模的通信负载而瘫痪.其基本方法是当有理由认为网络即将进入拥塞状态(或已由于拥塞而出现路由丢包情况)时减缓T ...
- TCP拥塞控制机制
研究TCP的拥塞机制,不仅仅是想了解TCP如何的精巧,更多的是领悟其设计思想,即在一般情况下,我们该怎样处理问题. 一.拥塞的发生与其不可避免 拥塞发生的主要原因:在于网络能够提供的资源不 ...
- 3.7 TCP拥塞控制
3.7 TCP拥塞控制 在3.5.5流量控制中有,接收方通过维护一个rwnd来控制流量,本节中考虑三个问题: 第一, 一个TCP发送方如何限制它向其他连接发送流量的速率. 第二, 一个TCP发送方 ...
- TCP拥塞控制及连接管理
在阅读此篇之前,博主强烈建议先看看TCP可靠传输及流量控制. 一.TCP拥塞控制 在某段时间,若对网络中某资源的需求超过了该资源所能提供的可用部分,网络的性能就要变坏——产生拥塞(congestion ...
- 牛客网Java刷题知识点之拥塞发生的主要原因、TCP拥塞控制、TCP流量控制、TCP拥塞控制的四大过程(慢启动、拥塞避免、快速重传、快速恢复)
不多说,直接上干货! 福利 => 每天都推送 欢迎大家,关注微信扫码并加入我的4个微信公众号: 大数据躺过的坑 Java从入门到架构师 人工智能躺过的坑 ...
- 计算机网络概述 传输层 TCP拥塞控制
TCP拥塞控制 计算机网络中的带宽.交换结点中的缓存和处理机等,都是网络的资源.在某段时间,若对网络中某一资源的需求超过了该资源所能提供的可用部分,网络的性能就会变坏.这种情况就叫做拥塞. 拥塞控制就 ...
- 现代互联网的TCP拥塞控制(CC)算法评谈
动机 写这篇文章本质上的动机是因为前天发了一个朋友圈,见最后的写在最后,但实际上,我早就想总结总结TCP拥塞控制算法点点滴滴了,上周总结了一张图,这周接着那些,写点文字. 前些天,Linux中国微信公 ...
随机推荐
- [置顶] 页面缓存,cache,设置缓存过期时间,OutputCache
页面缓存 方法一: protected void Page_Load(object sender, EventArgs e) { if (!IsPostBack) { //缓存有数据 if (Cach ...
- BZOJ 3218(a + b Problem-二分图套值域线段树)
出这题的人是怎么想出来的…… 言归正传,这题是二分图套值域线段树. 首先经过 @Vfleaking的神奇建图后,把图拆成二分图, 不妨利用有向图最小割的性质建图(以前我一直以为最小割和边的方向无关,可 ...
- 关于JAVA Project.waitfor()返回值是1
Project.waitfor()返回值是1,找了很久从网上没有发现关于1的说明. 这时对源代码调试了一下,发现Project=null.而去根目录下点击被调用的bat文件发现也可以被正确执行. 这时 ...
- RIA Test:try catch 对 Error #1009 (无法访问空对象引用的属性或方法)的处理
功能: 实现登录账户的强制登录, 用If 判断当前账户是否可用.若可用,则跳出if体直接登录,若不可用,则进入If体点击 “强制登录” 按钮. 问题:如果不可用,则if 条件中的对象不可见,这样程序会 ...
- 使用Visual Studio 创建新的Web Part项目
使用Visual Studio 创建新的Web Part项目 Web Part是你将为SharePoint创建的最常见的对象之中的一个.它是平台构建的核心基块. 1. 管理员身份打开Visual St ...
- android新浪分享实例
新浪分享比较简单,新浪有提供完整的demo. android实现新浪的分享功能,分3种分享情况: 纯文本的,带图片的,图片为本地图片(传入的是图片在手机的地址),第2种带图片的是,网络图片,图片地址为 ...
- hdu1876(dp)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1876 题意:问机器人到达终点的过程中最多有几次完全消耗完能量,消耗完这么多次能量的方式有几种. 分析: ...
- Java利用httpasyncclient进行异步HTTP请求
Java利用httpasyncclient进行异步HTTP请求 前段时间有个需求在springmvc mapping的url跳转前完成一个统计的业务.显然需要进行异步的处理,不然出错或者异常会影响到后 ...
- 谈Web应用系统的可维护性
每一个软件开发人员都十分清楚, 当软件构建得越来越复杂时, 可维护性就成了一个很突出的问题. 如何在构造软件系统的过程中始终保持可控制的可维护性呢? 一. 整体组织 ...
- Yii学习笔记之三(在windows 上安装 advanced )
首先说一下下载地址: http://www.yiiframework.com/download/ 然后将下载下来的文件进行解压到 你指定的文件夹 解压过程中假设报什么错误 直接忽略掉 我的解压文件夹是 ...