TCP流量控制和拥塞避免

TCP的流量控制

所谓的流量控制就是让发送方的发送速率不要太快,让接收方来得及接受。利用滑动窗口机制可以很方便的在TCP连接上实现对发送方的流量控制。TCP的窗口单位是字节,不是报文段,发送方的发送窗口不能超过接收方给出的接收窗口的数值。

如图所示,说明了利用可变窗口大小进行流量控制。设主机A向主机B发送数据。双方确定的窗口值是400.再设每一个报文段为100字节长,序号的初始值为seq=1,图中的箭头上面大写ACK,表示首部中的却认为为ACK,小写ack表示确认字段的值。

接收方的主机B进行了三次流量控制。第一次把窗口设置为rwind=300,第二次减小到rwind=100最后减到rwind=0,即不允许发送方再发送过数据了。这种使发送方暂停发送的状态将持续到主机B重新发出一个新的窗口值为止。

假如,B向A发送了零窗口的报文段后不久,B的接收缓存又有了一些存储空间。于是B向A发送了rwind=400的报文段,然而这个报文段在传送中丢失 了。A一直等待收到B发送的非零窗口的通知,而B也一直等待A发送的数据。这样就死锁了。为了解决这种死锁状态,TCP为每个连接设有一个持续计时器。只 要TCP连接的一方收到对方的零窗口通知,就启动持续计时器,若持续计时器设置的时间到期,就发送一个零窗口探测报文段(仅携带1字节的数据),而对方就在确认这个探测报文段时给出了现在的窗口值。

TCP报文段发送时机的选择

TCP报文段发送时机主要有以下几种选择途径。

1)TCP维持一个变量,它等于最大报文段长度MSS,只要缓存中存放的数据达到MSS字节就组装成一个TCP报文段发送出去。

2)由发送方的应用程序指明要求发送报文段,即TCP支持的推送操作

3)是发送方的一个计时器期限到了,这时就把当前已有的缓存数据装入报文段发送出去。

TCP的拥塞控制

1.拥塞控制的原理

在某段时间,若对网络中的某一资源的需求超过了该资源所能提供的可用部分,网络的性能就要变化,这种情况叫做拥塞。网络拥塞往往是由许多因素引起的,简单的提高节点处理机的速度或者扩大结点缓存的存储空间并不能解决拥塞问题。拥塞问题的是指往往是整个系统的各个部分不匹配,只有各个部分平衡了,问题才会得到解决。

2.拥塞控制和流量控制的差别

所谓拥塞控制就是防止过多的数据注入到网络中,这样可以使网络中的路由器或链路不致过载。拥塞控制所要做的都有一个前提,就是网络能承受现有的网络负荷。拥塞问题是一个全局性的问题,涉及到所有的主机、所有的路由器、以及与降低网络传输性能有关的所有因素。流量控制往往指的是点对点通信量的控制,是个端到端的问题。流量控制所要做的就是控制发送端发送数据的速率,以便使接收端来得及接受。

3.拥塞控制设计

拥塞控制是很难设计的,因为它是一个动态的问题,许多情况下,甚至正是拥塞控制机制本身成为引起网络性能恶化甚至死锁的原因。从控制理论的角度来看拥塞控制这个问题,可以分为开环控制和闭环控制两种方法。开环控制就是在设计网络时事先将有关拥塞发生的所有因素考虑周到,一旦系统运行起来就不能在中途改正。

闭环控制是基于反馈环路的概念,包括如下措施:

1)监测网路系统以便检测拥塞在何时、何地发生

2)把拥塞发生的信息传送到可采取行动的地方

3)调整网络系统的行动以解决出现的问题。

4.拥塞控制方法

  因特网建议标准RFC2581定义了进行拥塞控制的四种算法,即慢开始(Slow-start)、拥塞避免(Congestion Avoidance)、快重传(Fast Restrangsmit)和快回复(Fast Recovery)。我们假定

1)数据是单方向传送,而另外一个方向只传送确认

2)接收方总是有足够大的缓存空间,因为发送窗口的大小由网络的拥塞程度来决定。

慢开始和拥塞避免

  发送方维持一个叫做拥塞窗口cwnd(congestion window)的状态变量。拥塞窗口的大小取决于网络的拥塞程度,并且动态地在变化。发送方让自己的发送窗口等于拥塞窗口,另外考虑到接受方的接收能力,发送窗口可能小于拥塞窗口。发送方控制拥塞窗口的原则是:只要网络没有出现拥塞,拥塞窗口就增大一些,以便把更多的分组发送出去。但是只要网络出现拥塞,拥塞窗口就减小一些,以减少注入到网络的分组数。

慢开始算法的思路就是:最初的TCP在连接建立成功后会向网络中发送大量的数据包,这样很容易导致网络中路由器缓存空间耗尽,从而发生拥塞。因此新建立的连接不能够一开始就大量发送数据包,而只能根据网络情况逐步增加每次发送的数据量,以避免上述现象的发生。具体来说,当新建连接时,cwnd初始化为1个最大报文段(MSS)大小,发送端开始按照拥塞窗口大小发送数据,每当有一个报文段被确认,cwnd就增加至多1个MSS大小。用这样的方法来逐步增大拥塞窗口CWND。

这里用报文段的个数的拥塞窗口大小举例说明慢开始算法,实时拥塞窗口大小是以字节为单位的。如下图:

为了防止cwnd增长过大引起网络拥塞,还需设置一个慢开始门限ssthresh状态变量。ssthresh的用法如下:

  当cwnd<ssthresh时,使用慢开始算法。

  当cwnd>ssthresh时,改用拥塞避免算法。

  当cwnd=ssthresh时,慢开始与拥塞避免算法任意。

   拥塞避免算法思路:让拥塞窗口缓慢增长,即每经过一个往返时间RTT就把发送方的拥塞窗口cwnd加1,而不是加倍。这样拥塞窗口按线性规律缓慢增长。

无论是在慢开始阶段还是在拥塞避免阶段,只要发送方判断网络出现拥塞(其根据就是没有收到确认即超时,虽然没有收到确认可能是其他原因的分组丢失,但是因为无法判定,所以都当做拥塞来处理),就把慢开始门限设置为出现拥塞时的发送窗口大小的一半。然后把拥塞窗口设置为1,执行慢开始算法。这样做的目的就是要迅速减少主机发送到网络中的分组数,使得发生拥塞的路由器有足够时间把队列中积压的分组处理完毕。
  如下图:

乘法减小和加法增大

  乘法减小:是指不论在慢开始阶段还是拥塞避免阶段,只要出现超时,就把慢开始门限减半,即设置为当前的拥塞窗口的一半(于此同时,执行慢开始算法)。当网络出现频繁拥塞时,ssthresh值就下降的很快,以大大将小注入到网络中的分组数。

  加法增大:是指执行拥塞避免算法后是拥塞窗口缓慢增大,以防止网络过早出现拥塞。

快重传和快恢复

  一条TCP连接有时会因等待重传计时器的超时而空闲较长的时间,慢开始和拥塞避免无法很好的解决这类问题,因此提出了快重传和快恢复的拥塞控制方法。快重传算法并非取消了重传机制,只是在某些情况下更早的重传丢失的报文段(如果当发送端接收到三个重复的确认ACK时,则断定分组丢失,立即重传丢失的报文段,而不必等待重传计时器超时)。

  快重传要求接收方在收到一个失序的报文段后就立即发出重复确认(为的是使发送方及早知道有报文段没有到达对方)而不要等到自己发送数据时捎带确认(ACK延迟算法)。快重传算法规定,发送方只要一连收到三个重复确认就应当立即重传对方尚未收到的报文段,而不必继续等待设置的重传计时器时间到期。如下图:

  快重传配合使用的还有快恢复算法,有以下两个要点:

  ①当发送方连续收到三个重复确认时,就执行“乘法减小”算法,把ssthresh门限减半。但是接下去并不执行慢开始算法。

  ②考虑到如果网络出现拥塞的话就不会收到好几个重复的确认,所以发送方现在认为网络可能没有出现拥塞。所以此时不执行慢开始算法,而是将cwnd设置为ssthresh减半后的大小,然后执行拥塞避免算法。如下图:

  在采用快恢复算法时,慢开始算法只是在TCP连接建立时和网络出现超时时才使用。

  接受窗口又称为通知窗口。因此从接收方对发送方的流量控制角度考虑,发送方的发送窗口一定不能超过对方给出的接受窗口的RWND。

  也就是说:发送窗口的上限=Min[rwnd,cwnd].

随机早期检测RED

以上的拥塞避免算法并没有和网络层联系起来,实际上网络层的策略对拥塞避免算法影响最大的就是路由器的丢弃策略。在简单的情况下路由器通常按照先进先出的策略处理到来的分组。当路由器的缓存装不下分组的时候就丢弃到来的分组,这叫做尾部丢弃策略。这样就会导致分组丢失,发送方认为网络产生拥塞。更为严重的是网络中存在很多的TCP连接,这些连接中的报文段通常是复用路由路径。若发生路由器的尾部丢弃,可能影响到很多条TCP连接,结果就是这许多的TCP连接在同一时间进入慢开始状态。这在术语中称为全局同步。全局同步会使得网络的通信量突然下降很多,而在网络恢复正常之后,其通信量又突然增大很多。

为避免发生网路中的全局同步现象,路由器采用随机早期检测(RED:randomearly detection)。该算法要点如下:

使路由器的队列维持两个参数,即队列长队最小门限min和最大门限max,每当一个分组到达的时候,RED就计算平均队列长度。然后分情况对待到来的分组:

  ①平均队列长度小于最小门限——把新到达的分组放入队列排队。

  ②平均队列长度在最小门限与最大门限之间——则按照某一概率将分组丢弃。

  ③平均队列长度大于最大门限——丢弃新到达的分组。

RED不是等到已经发生拥塞后才把所有队列尾部的分组全部丢弃,而是在检测到网络拥塞的早期征兆时(即路由器的平均队列长度超过一定门限值时),以概率p随机丢弃分组,让拥塞控制只在个别的TCP连接上执行,因而避免全局性的拥塞控制。

RED的关键就是选择三个参数最小门限、最大门限、丢弃概率和计算平均队列长度。最小门线必须足够大,以保证路由器的输出链路有较高的利用率。而最大门限和最小门限只差也应该足够大,是的在一个TCP往返时间RTT中队列的正常增长仍在最大门限之内。经验证明:使最大门限等于最小门限的二倍是合适的。

  平均队列长度采用加权平均的方法计算平均队列长度,这和往返时间(RTT)的计算策略是一样的。

原文地址:https://www.cnblogs.com/fchy822/p/8836850.html

时间: 2024-10-12 02:03:41

TCP流量控制和拥塞避免的相关文章

TCP流量控制与拥塞解决

滑动窗口 但要提高网络利用率: nagle算法 - 延迟 慢启动.拥塞避免 发送端主导cwnd init  set  ssthresh  &  cwnd = swnd loop : 网不阻塞  (cwnd  < ssthresh)(cwnd  > ssthresh)(cwnd  == ssthresh) cwnd*2 cwnd ++   都可以 网阻塞  set: ssthresh = cwnd / 2        cwnd = 1 快重传.快恢复 快重传:接收端,三次重复确认i:

TCP流量控制与拥塞控制

 一.TCP建立连接后,通信双方都同时可以进行数据的传输:在保证可靠性上,采用超时重传和捎带确认机制:在流量控制上,采用滑动窗口协议,协议中规定,窗口内未经确认的分组需要进行重传:在拥塞控制上,采用慢启动算法. (一)拥塞控制: 1. TCP慢启动.拥塞避免.快速重传.快速回复 为了防止网络的拥塞现象,TCP提出了一系列的拥塞控制机制.最初由V. Jacobson在1988年的论文中提出的TCP的拥塞控制由"慢启动(Slow start)"和"拥塞避免(Congestio

TCP 流量控制和拥塞控制中的重要机制

停止等待协议: 放送方发送一个数据包,要收到接收方对该包的确认后,才发送下一个数据包. 缺点:慢,信道利用率低. ARQ Automatic Repeat reQuest 接收方采用累加确认的方式,接收方不必对每一个分组进行缺,只需要对按序到达的最后一个分组发送确认. 缺点:当发送方发送了5个分组,中间第3个丢失,那么接收方只对前两个分组进行确认.发送方只好把后面的3个分组都重传一次.这叫做Go-back-N(回退N) 选择确认 selective ack 接收方对接收到的数据字节流中,若有中间

Wireshark(五):TCP窗口与拥塞处理

原文出处: EMC中文支持论坛 TCP通过滑动窗口机制检测丢包,并在丢包发生时调整数据传输速率.滑动窗口机制利用数据接收端的接收窗口来控制数据流. 接收窗口值由数据接收端指定,以字节数形式存储于TCP报文头,并告知传输设备有多少数据将会存储在TCP缓冲区.缓冲区就是数据暂时放置的地方, 直至传递至应用层协议等待处理.因此,发送端每次只能发送Window Size字段指定的数据量.为了使发送端继续传送数据,接收端必须发送确认信息:之前的数据接收到了.同时必须对占用缓冲区的数据进行处理以释放缓存空

TCP流量控制

一般说来,我们总是希望数据传输得更快一些.但如果发送方把数据发送得过快,接收方就可能来不及接收,这就会造成数据的丢失. 流量控制(flow control)就是让发送方的发送速率不要太快,既要让接收方来得及接收,也不要使网络发生拥塞. 利用滑动窗口机制可以很方便地在 TCP 连接上实现流量控制. A 向 B 发送数据.在连接建立时,B 告诉 A:"我的接收窗口 rwnd = 400(字节) TCP 为每一个连接设有一个持续计时器. 只要 TCP 连接的一方收到对方的零窗口通知,就启动持续计时器.

TCP流量控制和拥塞控制

TCP的流量控制 所谓的流量控制就是让发送方的发送速率不要太快,让接收方来得及接受.利用滑动窗口机制可以很方便的在TCP连接上实现对发送方的流量控制.TCP的窗口单位是字节,不是报文段,发送方的发送窗口不能超过接收方给出的接收窗口的数值. 如图所示,说明了利用可变窗口大小进行流量控制.设主机A向主机B发送数据.双方确定的窗口值是400.再设每一个报文段为100字节长,序号的初始值为seq=1,图中的箭头上面大写ACK,表示首部中的却认为为ACK,小写ack表示确认字段的值. 接收方的主机B进行了

TCP 流量控制、拥塞控制

流量控制: 流量控制是为了控制发送方发送速率,保证接收方来得接收. 接收方发送的确认报文中的窗口字段可以用来控制发送方窗口大小,从而影响发送方的发送速率.将窗口字段设置为 0,则发送方不能发送数据. 拥塞控制: 如果网络出现拥塞,分组将会丢失,此时发送方会继续重传,从而导致网络拥塞程度更高.因此当出现拥塞时,应当控制发送方的速率.这一点和流量控制很像,但是出发点不同.流量控制是为了让接收方来得及接受,而拥塞控制是为了降低整个网络的拥塞程度. TCP主要通过四种算法来进行拥塞控制:慢开始.拥塞避免

一站式学习Wireshark(五):TCP窗口与拥塞处理

TCP通过滑动窗口机制检测丢包,并在丢包发生时调整数据传输速率.滑动窗口机制利用数据接收端的接收窗口来控制数据流. 接收窗口值由数据接收端指定,以字节数形式存储于TCP报文头,并告知传输设备有多少数据将会存储在TCP缓冲区.缓冲区就是数据暂时放置的地方,直至传递至应用层协议等待处理.因此,发送端每次只能发送Window Size字段指定的数据量.为了使发送端继续传送数据,接收端必须发送确认信息:之前的数据接收到了.同时必须对占用缓冲区的数据进行处理以释放缓存空间.下图显示了接收窗口是如何工作的:

TCP的流量控制和拥塞控制

一.首先和UDP作比较谈谈TCP的特点 (1)UDP是数据报协议,每个数据报都有长度,数据报的长度和数据一起发送和接受,各个数据报的发送和接受相互独立,互不影响.而TCP是字节流协议,所有经TCP发送的数据没有记录边界. (2) UDP是无连接.不可靠的协议,而TCP是有连接,可靠协议.TCP的可靠性主要指经TCP发送的数据要么准确无误的发送到了对端,要么发送失败并且以合适的方式通知应用程序,也就是可靠的传输数据和可靠地报告错误,TCP协议每一次发送数据以后先暂时将数据保存在缓存区,直到接收到对