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)

时间: 2024-10-09 18:34:05

TCP拥塞控制 (1)的相关文章

TCP拥塞控制

TCP必须使用端到端拥塞控制而不是使网络辅助的拥塞控制,因为IP层不向端系统提供显式的网络拥塞反馈.TCP采用的方法是让每一个发送方根据所感知到的网络拥塞程度来限制其能向连接发送流量的速率. TCP限制向其连接发送流量 TCP连接的每一端都是由一个接收缓存.一个发送缓存和几个变量组成.运行在发送方的TCP拥塞控制机制跟踪一个额外的变量,拥塞窗口(cwnd),它对一个TCP发送方能向网络中发送流量的速率进行了限制:在一个发送方中未被确认的数据量不会超过cwnd和rwnd中的最小值,即 LastBy

《网络协议》TCP 拥塞控制

TCP 拥塞控制主要有几种:慢启动.拥塞避免.快重传 以及 快恢复. 慢启动 为了防止网络拥塞,TCP 采用了一种慢启动算法,对发送数据量进行控制.为了调节发送端的数据发送量,引入了拥塞窗口,在慢启动时,将这个拥塞窗口设为 1 个报文段发送数据,之后每收到一次确认应答,拥塞窗口的值就加 1 个报文段.在发送数据包时,将拥塞窗口的大小与接收端主机通知的窗口大小进行比较,然后选择较小的值来控制数据量的发送.拥塞窗口是发送端使用的流量控制,而通告窗口则是接收端使用的流量控制. 慢启动算法步骤如下(cw

linux内核工程导论-网络:tcp拥塞控制

这篇文章本来是在tcp那篇里面的,但是那篇太长了,不专一.就完善了一下提取出来了. TCP拥塞控制 拥塞控制讨论的是很多个同时存在的tcp连接应该怎么规划自己的数据包发送和接收速度,以在彼此之间共享带宽,同时与其他实体的机器公平的竞争带宽,而不是自己全占. 拥塞控制的核心是AIMD(additive-increase/multiplicative-decrease ),线性增加乘性减少.为啥不用线性增加线性减少,或者是乘性增加乘性减少呢?这个有人专门研究过,只有AIMD可以收敛聚合使得链路公平.

TCP拥塞控制 2

解决传统TCP缺陷: 1.窗口太小,最大65535. TCP利用了选项功能,其头部存在预留项,用于扩展等用途.窗口扩大选项增加了额外的16位来表示窗口大小,窗口的值由首部的16位大小和选项的16位值共同组成. 不过不是用加法组成的,而是利用移位窗口值的幂来表示的,也就是说如果移位窗口值为 10,那么窗口的最大值就是65535*210,这个值就比较大了,足够表示窗口的大小了. 2.数据包丢失,即认定为网络出现了拥塞 在高速网络中,这种假设是不成立的.如果笼统地认为分组丢失就是拥塞所引起的,从而降低

TCP 拥塞控制

TCP 拥塞控制 相关名词 滑动窗口 tcp通过滑动窗口进行流量控制,所谓的窗口可以理解为接收端所能提供的缓冲区大小. TCP是一个滑动窗口协议,即一个TCP连接的发送端在某个时刻能发多少数据是由滑动窗口控制的 RTT(Round trip time) 表示从发送端到接收端的一去一回需要的时间. TCP在数据传输过程中会对RTT进行采样(即对发送的数据包及其ACK的时间差进行测量,并根据测量值更新RTT值) RTO (Retransmission TimeOut) 发送数据包,启动重传定时器,重

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

TCP拥塞控制 计算机网络中的带宽.交换结点中的缓存和处理机等,都是网络的资源.在某段时间,若对网络中某一资源的需求超过了该资源所能提供的可用部分,网络的性能就会变坏.这种情况就叫做拥塞. 拥塞控制就是防止过多的数据注入网络中,这样可以使网络中的路由器或链路不致过载.拥塞控制是一个全局性的过程,和流量控制不同,流量控制指点对点通信量的控制. 拥塞控制 和 流量控制 的区别? 1. 拥塞控制:拥塞控制是作用于网络的,它是防止过多的数据注入到网络中,避免出现网络负载过大的情况: 2. 流量控制:流量

TCP拥塞控制及连接管理

在阅读此篇之前,博主强烈建议先看看TCP可靠传输及流量控制. 一.TCP拥塞控制 在某段时间,若对网络中某资源的需求超过了该资源所能提供的可用部分,网络的性能就要变坏——产生拥塞(congestion).出现资源拥塞的条件:对资源需求的总和 > 可用资源:拥塞带来的问题:若网络中有许多资源同时产生拥塞,网络的性能就要明显变坏,整个网络的吞吐量将随输入负荷的增大而下降. 1. 拥塞的控制方法一(慢开始和拥塞避免) 发送方维持一个叫做拥塞窗口 cwnd (congestion window)的状态变

TCP拥塞控制机制

我们知道TCP是拥有拥塞控制机制的,而UDP是没有的,为什么需要拥塞控制机制呢,就是防止丢包过多导致传输效率低下.网络中传输的包太多,路由器的缓存又不够,每一个发送端都以自己想要的发送速率发送包,自然会导致网络拥塞.所以我TCP就包括了拥塞控制机制. 有几种拥塞控制方法? 2种 1.端到端拥塞控制.网络层没有显示的告知传输层此时网络出现拥塞了,传输层通过报文段的丢失(超时或3次冗余确认得知)认为网络出现拥塞了,TCP会缩减其拥塞窗口,减小发送速率. 2.网络辅助的拥塞控制.网络层显示的告知发送端

TCP拥塞控制ABC(Appropriate Byte Counting)的利弊说

TCP在慢启动阶段,每一个RTT拥塞窗口按指数级增长,TCP在拥塞避免阶段,每一个RTT拥塞窗口线性增加1.这些都是书上讲的,不必太认真,真实的情况要比这个复杂的多!        首先我们看大部分的资料里讲的TCP是怎么实现每RTT增窗的,一切都是扯理论,没什么现实意义!        在慢启动阶段,每收到一个ACK(数据包从发出到收到其ACK,就是一个RTT),窗口增加1,在拥塞避免阶段,每收到前一窗口整窗的ACK,窗口增加1,也就是说,每收到一个ACK,窗口增加1/cwnd!然而这都是理想