计算机网络(五)—— 运输层(4、5):TCP的流量控制、TCP的拥塞控制

计算机网络系列内容的学习目录 → \rightarrow 谢希仁计算机网络学习系列内容汇总

4. TCP的流量控制

  ■ 一般来说,我们总是希望数据传输得更快一些。
    ⋄ \diamond 但如果发送方把数据发送得过快,接收方就可能来不及接收,这就会造成数据的丢失。
  ■ 所谓流量控制(flow control)就是让发送方的发送速率不要太快,要让接收方来得及接收。
  ■ 利用滑动窗口机制可以很方便地在TCP连接上实现对发送方的流量控制。
    ⋄ \diamond TCP接收方利用自己的接收窗口的大小来限制发送方发送窗口的大小。
    ⋄ \diamond TCP发送方收到接收方的零窗口通知后,应启动持续计时器。持续计时器超时后,向接收方发送零窗口探测报文

  如下图所示,假设主机A和B是因特网上的两台主机,它们之间已经建立了TCP连接。A给B发送数据,B对A进行流量控制。对于主机A中待发送数据的字节序号,假设主机A发送的每个TCP报文段可携带100字节数据,因此图中每个小格子表示100个字节数据的序号。在主机A和B建立TCP连接时,B告诉A:“我的接收窗口为400“,因此主机A将自己的发送窗口也设置为400,这意味着主机A在未收到主机B发来的确认时,可将序号落入发送窗口中的全部数据发送出去。

在这里插入图片描述
  接下来举例说明主机B对A的流量控制。如下图所示,主机A将发送窗口内序号1 ~ 100的数据封装成一个TCP报文段发送出去,发送窗口内还有300字节可以发送。
  seq是TCP报文段首部中的序号字段,取值1表示TCP报文段数据载荷的第1个字节的序号是1;DATA表示这是TCP数据报文段。
  主机A将发送窗口内序号101 ~ 200的数据封装成一个TCP报文段发送出去,发送窗口内还有200字节可以发送。
  主机A将发送窗口内序号201 ~ 300的数据封装成一个TCP报文段发送出去,但该报文段在传输过程中丢失了,主机A发送窗口内还有100字节可以发送。
  主机B对主机A所发送的201号以前的数据进行累计确认,并在该累计确认中将窗口字段的值调整为300,也就是对主机A进行流量控制

在这里插入图片描述
  ACK是TCP报文段首部中的标志位,取值1表示这是一个TCP确认报文段;ack是TCP报文段首部中的确认号字段,取值201表示序号201之前的数据已全部正确接收,现在希望收到序号201及其后续数据;rwnd是TCP报文段首部中的窗囗字段,取值300表示自己的接收窗大小为300。
  主机A收到该累计确认后,将发送窗口向前滑动,使已发送并收到确认的这些数据的序号移出发送窗口。由于主机B在该累计确认中将自己的接收窗口调整为了300,因此主机A相应的将自己的发送窗口调整为300。目前主机A发送窗口内的序号为201 ~ 500,也就是主机A还可以发送这300字节,其中201 ~ 300号字节是已发送的数据。若重传计时器超时,它们会被重传。301 ~ 400号字节以及401 ~ 500号字节还未被发送,可被分别封装在一个TCP报文段中发送。主机A现在可将发送缓存中序号1 ~ 200个字节数据全部删除了,因为已经收到了主机B对它们的累计确认。主机A将发送窗口内序号301 ~ 400个数据封装成一个TCP报文段发送出去,发送窗口内还有100字节可以发送。主机A将发送窗口内序号401 ~ 500的数据封装成一个TCP报文段发送出去。至此,序号落在发送窗口内的数据已经全部发送出去了,不能再发送新数据了。
  现在,发送窗口内序号201 ~ 300这100个字节数据的重传计时器超时了,主机A将它们重新封装成一个TCP报文段发送出去,暂时不能发送其他数据。主机B收到该重传的TCP报文段后对主机A所发送的501号以前的数据进行累计确认,并在该累计确认中将窗口字段的值调整为100,这是主机B对主机A进行的第二次流量控制

在这里插入图片描述
  主机A收到该累计确认后,将发送窗口向前滑动,使已发送并收到确认的这些数据的序号移出发送窗口。由于主机B在该累计确认中将自己的接收窗口调整为了100,因此主机A相应的将自己的发送窗口调整为100。目前主机A发送窗口内的序号为501 ~ 600,也就是主机还可以发送这100字节。主机A现在可将发送缓存中序号201 ~ 500的字节数据全部删除了,因为已经收到了主机B对它们的累计确认。主机A将发送窗口内序号501 ~ 600的数据封装成一个TCP报文段发送出去。至此,序号落在发送窗口内的数据已经全部发送出去了,不能再发送新数据了。主机B对主机A所发送的601号以前的数据进行累计确认,在该累计确认中将窗口字段的值调整为0,这是主机B对主机A进行的第三次流量控制

在这里插入图片描述
  主机A收到该累计确认后,将发送窗口向前滑动,使已发送并收到确认的这些数据的序号移出发送窗口。由于主机B在该累计确认中将自己的接收窗口调整为0,因此主机A相应的将自己的发送窗口调整为0。目前,主机A不能再发送一般的TCP报文段了。主机A现在可将发送缓存中序号501 ~ 600的字节数据全部删除了,因为已经收到了主机B对它们的累计确认。
  假设主机B向主机A发送了零窗口的报文段后不久,主机B的接收缓存又有了一些存储空间,于是主机B向主机A发送了接收窗口等于300的报文段。然而,这个报文段在传输过程中丢失了,主机A一直等待主机B发送的非零窗口的通知,而主机B也一直等待主机A发送的数据。如果不采取措施,这种互相等待而形成的死锁局面将一直持续下去。

在这里插入图片描述
  为了解决这个问题,TCP为每一个连接设有一个持续计时器。只要TCP连接的一方收到对方的零窗口通知,就启动持续计时器。若持续计时器超时,就发送一个零窗口探测报文,仅携带一字节的数据。而对方在确认这个探测报文段时,给出自己现在的接收窗口值。如果接收窗口仍然是0,那么收到这个报文段的一方就要重新启动持续计时器;如果接收窗口不是0,那么死锁的局面就可以被打破了。

  在本例中,主机A收到零窗口通知时,就启动一个持续计时器。当持续计时器超时,主机A立刻发送一个仅携带一字节数据的零窗口探测报文段。假设主机B此时的接收窗口又为0了,主机B就在确认这个零窗口探测报文段时,给出自己现在的接收窗口值为0。主机A再次收到零窗口通知,就再次启动一个持续计时器。当持续计时器超时,主机A立刻发送一个零窗口探测报文段。假设主机B此时的接收缓存又有了一些存储空间,于是将自己的接收窗调整为300,主机B就在确认这个零窗口探测报文段时,给出自己现在的接收窗口值为300,这样就打破了死锁的局面。

在这里插入图片描述
  问题: 主机A所发送的零窗口探测报文段到达主机B时,如果主机B此时的接收窗口仍然为0,那么主机B根本就无法接受该报文段,又怎么会针对该报文段给主机A发回确认呢?
  实际上TCP规定:即使接收窗口为0,也必须接受零窗口探测报文段、确认报文段以及携带有紧急数据的报文段。

  思考: 如果零窗口探测报文段丢失了,会出现怎样的问题呢?还能否打破死锁的局面呢?

在这里插入图片描述
  回答是肯定的。因为零窗口探测报文段也有重传计时器,当重传计时器超时后,零窗口探测报文段会被重传。

  例: 主机甲和主机乙之间建立了一个TCP连接,TCP最大段长度为1000字节。若主机甲的当前拥塞窗口为4000字节,在主机甲向主机乙连续发送两个最大段后,成功收到主机乙发送的第一个段的确认段,确认段中通告的接收窗口大小为2000字节,则此时主机甲还可以向主机乙发送的最大字节数是( A )
      A.1000  B.2000  C.3000  D.4000
     分析:

在这里插入图片描述

4.1 课后练习

  1. 在采用TCP连接的数据传输阶段,如果发送端的发送窗口值由1000变为2000,那么发送端在收到一个确认之前可以发送( B )
    A. 2000个TCP报文段   B. 2000B   C. 1000B   D. 1000个TCP报文段
   分析: 在采用TCP连接的数据传输阶段,如果发送端的发送窗口值由1000变为2000,那么发送端在收到一个确认之前可以发送2000B。

  2. A和B建立了TCP连接,当A收到确认号为100的TCP确认报文段时,表示( C )
    A. 已收到99号TCP报文段
    B. 已收到100号TCP报文段
    C. 已收到数据载荷部分最后一字节序号为99的TCP报文段
    D. 已收到数据载荷部分最后一字节序号为100的TCP报文段
   分析: A和B建立了TCP连接,当A收到确认号为100的TCP确认报文段时,表示已收到数据载荷部分最后一字节序号为99的TCP报文段。

  3. 在TCP协议中,发送方的窗口大小取决于( C )
    A. 仅接收方允许的窗口
    B. 接收方允许的窗口和发送方允许的窗口
    C. 接收方允许的窗口和拥塞窗口
    D. 发送方允许的窗口和拥塞窗口
   分析: 在TCP协议中,发送方的窗口大小取决于接收方允许的窗口和拥塞窗口。

  4. 主机甲和主机乙之间建立了一个TCP连接,TCP最大段长度为1000字节,若主机甲当前发送窗口为6000字节,不考虑拥塞窗口,在主机甲向主机乙连续发送三个最大段后,成功收到主机乙发送的第一个段的确认段,确认段中通告的接收窗口大小为4000字节,则此时主机甲还可以向主机乙发送的最大字节数是( B )
    A. 1000   B. 2000   C. 3000   D. 4000

5. TCP的拥塞控制

  ■ 在某段时间,若对网络中某一资源的需求超过了该资源所能提供的可用部分,网络性能就要变坏。这种情况就叫做拥塞(congestion)。
    ⋄ \diamond 在计算机网络中的链路容量(即带宽)、交换结点中的缓存和处理机等,都是网络的资源。
  ■ 若出现拥塞而不进行控制,整个网络的吞吐量将随输入负荷的增大而下降。

在这里插入图片描述
  ■ 四种拥塞控制算法: 慢开始、拥塞避免、快重传、快恢复。
     下面介绍这四种拥塞控制算法的基本原理,假定如下条件:
     1. 数据是单方向传送,而另一个方向只传送确认。
     2. 接收方总是有足够大的缓存空间,因而发送方发送窗口的大小由网络的拥塞程度来决定。
     3. 以最大报文段MSS的个数为讨论问题的单位,而不是以字节为单位。

  如下图所示,假设左右分别是TCP的发送方和接收方,发送方给接收方发送TCP数据报文段,接收方收到后,给发送方发送TCP确认报文段。发送方要维护一个叫做拥塞窗口的状态变量,其值取决于网络的拥塞程度,并且动态变化。拥塞窗口的维护原则是只要网络没有出现拥塞,拥塞窗口就再增大一些,但只要网络出现拥塞,拥塞窗口就减小一些。

在这里插入图片描述
  判断出现网络拥塞的依据是没有按时收到应当到达的确认报文段,也就是发生了超时重传。发送方将拥塞窗口作为发送窗口,也就是发送窗口等于拥塞窗口。发送方还需要维护一个叫做慢开始门限的状态变量,当拥塞窗口小于慢开始门限时,使用慢开始算法;当拥塞窗口大于慢开始门限时,停止使用慢开始算法,而改用拥塞避免算法;当拥塞窗口等于慢开始门限时,既可以使用慢开始算法,也可以使用拥塞避免算法。

  ■ 发送方维护一个叫做拥塞窗口cwnd的状态变量,其值取决于网络的拥塞程度,并且动态变化。
    ⋄ \diamond 拥塞窗口cwnd的维护原则: 只要网络没有出现拥塞,拥塞窗口就再增大一些;但只要网络出现拥塞,拥塞窗口就减少一些。
    ⋄ \diamond 判断出现网络拥塞的依据:没有按时收到应当到达的确认报文(即发生超时重传)。
  ■ 发送方将拥塞窗口作为发送窗口swnd,即swnd = cwnd。
  ■ 维护一个慢开始门限ssthresh状态变量:
    ⋄ \diamond 当cwnd < ssthresh时,使用慢开始算法;
    ⋄ \diamond 当cwnd > ssthresh时,停止使用慢开始算法而改用拥塞避免算法;
    ⋄ \diamond 当cwnd = ssthresh时,既可使用慢开始算法,也可使用拥塞避免算法。

5.1 慢开始(slow-start)

  对于慢开始算法,为了更清楚的显示出拥塞控制过程,可以绘制如下所示的拥塞窗口随传输轮次变化的图,横坐标为传输轮次。传输轮次是指发送方给接收方发送数据报文段后,接收方给发送方发回相应的确认报文段,一个传输轮次所经历的时间其实就是往返时间。请注意,往返时间并非是恒定的数值。使用传输轮次是为了强调把拥塞窗口所允许发送的报文段都连续发送出去,并收到了对已发送的最后一个报文段的确认。
  纵坐标是拥塞窗口,它会随网络拥塞程度以及所使用的拥塞控制算
法动态变化。在TCP双方建立逻辑连接关系时,拥塞窗口的值被设置为1。在图上标出传输轮次0时的拥塞窗口值为1。另外,还需设置慢开始门限的初始值,本例采用16,并将它在图中标出。在执行慢开始算法时,发送方每收到一个对新报文段的确认时,就把拥塞窗口值加1,然后开始下一轮的传输。当拥塞窗口值增长到慢开始门限值时,就改为执行拥塞避免算法。由于发送方当前的拥塞窗口值是1,而发送窗口值等于拥塞窗口值,因此发送方当前只能发送一个TCP数据报文段。换句话说,拥塞窗口值是几,就能发送几个数据报文段。

在这里插入图片描述
  如图所示,发送方发送0号数据报文段,接收方收到后给发送方
发回对0号报文段的确认报文段,发送方收到该确认报文段后,将拥塞窗口值加1增大到2,在图中标出该值。这意味着发送方现在可以发送1 ~ 2号共两个数据报文段,接收方收到后给发送方发回对1 ~ 2号报文段的确认报文段,发送方收到后将拥塞窗口值加2增大到4,在图中标出该值。发送方现在可以发送3 ~ 6号共4个数据报文段,接收方收到后给发送方发回对3 ~ 6号报文段的确认报文段,发送方收到后将拥塞窗囗值加4增大到8,在图中标出该值。发送方现在可以发送7 ~ 14号共8个数据报文段,接收方收到后给发送方发回对7 ~ 14号报文段的确认报文段,发送方收到后将拥塞窗口值加8增大到16,在图中标出该值。

在这里插入图片描述
  发送方当前的拥塞窗口值已经增大到了慢开始门限值,之后我们要改用拥塞避免算法,也就是每个传输轮次结束后,拥塞窗口值只能线性加1,而不像慢开始算法那样,每个传输轮次结束后,拥塞窗口值按指数规律增长。

5.2 拥塞避免(congestion avoidance)

  发送方现在可以发送15 ~ 30号共16个数据报文段,接收方收到后给发送方发回对15 ~ 30号报文段的确认报文段,发送方收到后将拥塞窗口值加1增大到17,在图中标出该值。发送方现在可以发送31 ~ 47号共17个数据报文段,接收方收到后给发送方发回对31 ~ 47号报文段的确认报文段,发送方收到后将拥塞窗口值加1增大到18,在图中标出该值。

在这里插入图片描述
  随着传输轮次的增加,拥塞窗口值每轮次都线性加1。例如当前拥塞窗口值增加到了24,发送方现在可以发送171 ~ 194号共24个数据报文段。假设这24个数据报文段在传输过程中丢失了几个,这必然会造成发送方对这些丢失报文段的超时重传。

在这里插入图片描述
  发送方以此判断网络很可能出现了拥塞,需要进行以下工作:
   1. 将慢开始门限值更新为发生拥塞时拥塞窗口值的一半。网络发生拥塞时的拥塞窗口值是24,因此更新慢开始门限值为该值的一半,即12,如图所示。

在这里插入图片描述
   2. 将拥塞窗口值减小为1,并重新开始执行慢开始算法。当慢开始算法执行到拥塞窗口值增大到新的慢开始门限值时,就停止使用慢开始算法,转而执行拥塞避免算法,如图所示。

在这里插入图片描述
  通过本例可以看出,TCP发送方一开始使用慢开始算法让拥塞窗口值从1开始按指数规律增大,当拥塞窗口值增大到慢开始门限值时,停止使用慢开始算法,转而执行拥塞避免算法,让拥塞窗口值按线性加1的规律增大。当发生超时重传时,就判断网络很可能出现了拥塞,采取相应的措施。一方面将慢开始门限值更新为发生拥塞时拥塞窗口值的一半;另一方面将拥塞窗口值减小为1,并重新开始执行慢开始算法。拥塞窗口值又从1开始按指数规律增大,当增大到了新的慢开始门限值时,停止使用慢开始算法,转而执行拥塞避免算法,让拥塞窗口值按线性加1的规律增大。

在这里插入图片描述
  ■ “慢开始”是指一开始向网络注入的报文段少,而并不是指拥塞窗口值增长速度慢。
  ■ “拥塞避免”也并非指完全能够避免拥塞,而是只在拥塞避免阶段,将拥塞窗口值控制为按线性规律增长,使网络比较不容易出现拥塞。
  ■ 慢开始和拥塞避免是1988年就提出的TCP拥塞控制算法(TCP Tahoe版本)。
  ■ 1990年又增加了两个新的拥塞控制算法,以便改进TCP的性能,这就是快重传快恢复(TCP Reno版本)。
    ⋄ \diamond 有时,个别报文段会在网络中丢失,但实际上网络并未发生拥塞。
     ∘ \circ 这将导致发送方超时重传,并误认为网络发生了拥塞;
     ∘ \circ 例如,在之前的例子中,当拥塞窗口值增大到24时,发生了超时重传,而网络此时并没有发生拥塞,但是发送方却误认为网络发生了拥塞,于是发送方把拥塞窗口值减小为1,并错误的启动慢开始算法,因而降低了传输效率。

在这里插入图片描述
  ■ 采用快重传算法可以让发送方尽早知道发生了个别报文段的丢失。

5.3 快重传(fast retransmit)

  ■ 所谓快重传,就是使发送方尽快进行重传而,不是等超时重传计时器超时再重传。
    ⋄ \diamond 这就要求接收方不要等待自己发送数据时才进行捎带确认,而是要立即发送确认;
    ⋄ \diamond 即使收到了失序的报文段也要立即发出对已收到的报文段的重复确认。
    ⋄ \diamond 发送方一旦收到3个连续的重复确认,就将相应的报文段立即重传,而不是等该报文段的重传计时器超时再重传。
    ⋄ \diamond 对于个别丢失的报文段,发送方不会出现超时重传,也就不会误认为出现了拥塞(进而降低拥塞窗口cwnd为1)。使用快重传可以使整个网络的吞吐量提高约20%。

  举例说明快重传算法。
  发送方发送1号数据报文段,接收方收到后,给发送方发回对1号报文段的确认。
  在该确认报文段到达发送方之前,发送方还可以将发送窗口内的2号数据报文段发送出去,接收方收到后,给发送方发回对2号报文段的确认。
  在该确认报文段到达发送方之前,发送方还可以将发送窗口内的3号数据报文段发送出去,但该报文段丢失了,接收方自然不会给发送方发回针对该报文段的确认。
  发送方还可以将发送窗口内的4号数据报文段发送出去,接收方收到后,发现这不是按序到达的报文段,因此给发送方发回针对2号报文段的重复确认,表明:“我现在希望收到的是3号报文段,但是我没有收到3号报文段,而是收到了未按序到达的报文段。”
  发送方还可以将发送窗口内的5号数据报文段发送出去,接收方收到后,发现这不是按序到达的报文段,因此给发送方发回针对2号报文段的重复确认。
  发送方还可以将发送窗口内的6号数据报文段发送出去,接收方收到后,发现这不是按序到达的报文段,因此给发送方发回针对2号报文段的重复确认。
  至此,发送方会收到3个连续的对2号报文段的重复确认,就立即重传3号报文段,接收方收到后,给发送方发回针对6号报文段的确认,表明序号到6为止的报文段都正确接收了。这样就不会造成对3号报文段的超时重传,而是提早进行了重传。

在这里插入图片描述
  对于个别丢失的报文段,发送方不会出现超时重传,也就不会误认为出现了拥塞而错误的降低拥塞窗口值为最小值1。使用快重传可以使整个网络的吞吐量提高约20%。

5.4 快恢复(fast recovery)

  ■ 发送方一旦收到3个重复确认,就知道现在只是丢失了个别的报文段。于是不启动慢开始算法,而执行快恢复算法;
    ⋄ \diamond 发送方将慢开始门限ssthresh值和拥塞窗口cwnd值调整为当前窗口的一半,开始执行拥塞避免算法。
    ⋄ \diamond 也有的快恢复实现是把快恢复开始时的拥塞窗口cwnd值再增大一些,即等于新的ssthresh + 3。
     ∘ \circ 既然发送方收到3个重复的确认,就表明有3个数据报文段已经离开了网络;
     ∘ \circ 这3个报文段不再消耗网络资源而是停留在接收方的接收缓存中;
     ∘ \circ 可见现在网络中不是堆积了报文段,而是减少了3个报文段,因此可以适当把拥塞窗口扩大些。

  接下来,给出TCP拥塞窗口值在拥塞控制时的变化情况举例,里面包含了TCP拥塞控制的四种算法。TCP发送方一开始使用慢开始算法,让拥塞窗口值从1开始按指数规律增大,当增大到慢开始门限初始值时,停止使用慢开始算法,转而执行拥塞避免算法,让拥塞窗口值按线性加1的规律增大。当发生超时重传时,就判断网络可能出现了拥塞,采取相应的措施。一方面,将慢开始门限值更新为发生拥塞时拥塞窗囗值的一半;另一方面,将拥塞窗口值减小为1,并重新开始执行慢开始算法。拥塞窗口值又从1开始按指数规律增大,当增大到了新的慢开始门限值时,停止使用慢开始算法,转而执行拥塞避免算法,让拥塞窗口值按线性加1的规律增大。当发送方收到3个重复的确认时,就进行快重传和快恢复,也就是更新慢开始门限值为当前拥塞窗口值的一半,并将拥塞窗口值也取为新的慢开始门限值,转而执行拥塞避免算法,让拥塞窗口值按线性加1的规律增大。

在这里插入图片描述
  例: 一个TCP连接总是以1KB的最大段长发送TCP段,发送方有足够多的数据要发送。当拥塞窗口为16KB时发生了超时,如果接下来的4个RTT(往返时间)内的TCP段的传输都是成功的,那么当第4个RTT时间内发送的所有TCP段都得到肯定应答时,拥塞窗口大小是( C )
     A. 7KB  B. 8KB  C. 9KB  D. 16KB
    分析:

在这里插入图片描述

5.5 课后练习

  1. 以下关于TCP窗口与拥塞控制概念的描述中,错误的是( C )
    A. 接收窗口通过TCP首部中的窗口字段通知数据的发送方
    B. 发送窗口确定的依据是:发送窗口=min[接收窗口,拥塞窗口]
    C. 拥塞窗口是接收端根据网络拥塞情况确定的窗口值
    D. 拥塞窗口大小在开始时可以按指数规律增长
   分析: 拥塞窗口是发送端根据网络拥塞情况确定的窗口值,发送端在真正确定发送窗口时,应该取“通知窗口”和“拥塞窗口”的最小值。

  2. 一个TCP连接总是以1KB的最大段长发送TCP段,发送方有足够多的数据要发送。当拥塞窗口为34KB时发生了超时,如果接下来的4个RTT内的TCP段的传输都是成功的,那么当第4个RTT时间内发送的所有TCP段都得到肯定应答时,拥塞窗口的大小是( C )
    A. 8KB   B. 9KB   C. 16KB   D.17KB
   分析: 当拥塞窗口为34KB时发生了超时,ssthresh更新值=34/ 2 = 17,更新cwnd的值为1,并开始重新执行慢开始算法。接下来的4个RTT内的TCP段的传输都是成功的,拥塞窗口的大小依次是1→2→4→8→16。

  3. 设TCP拥塞窗口的慢开始门限初始值为8(单位为TCP报文段),当拥塞窗口上升到12时发生超时,则第13个传输轮次时拥塞窗口的大小为( D )
    A. 4   B. 5   C. 6   D. 7
   分析: TCP拥塞窗口的慢开始门限初始值为8,当拥塞窗口上升到12时发生超时,ssthresh更新值=12/ 2 = 6,更新cwnd的值为1,并开始重新执行慢开始算法。13个传输轮次时拥塞窗口的大小依次是1→2→4→8→9→10→11→12→1→2→4→5→6→7。

  4. 一个TCP连接总是以1KB的最大段长发送TCP段,发送方有足够多的数据要发送。当拥塞窗口为34KB时收到了3个重复的ACK报文,如果接下来的4个RTT内的TCP段的传输都是成功的,那么当第4个RTT时间内发送的所有TCP段都得到肯定应答时,拥塞窗口的大小是( D )
    A. 8KB   B. 16KB   C. 20KB   D. 21KB
   分析: 当拥塞窗口为34KB时收到了3个重复的ACK报文,ssthresh更新值=34/ 2 = 17,更新cwnd的值为ssthresh的值
,转而执行拥塞避免算法。接下来的4个RTT内的TCP段的传输都是成功的,拥塞窗口的大小依次是17→18→19→20→21。

  5. 主机甲和乙建立了TCP连接,甲始终以1KB大小的段发送数据,并一直有数据发送;乙每收到一个数据段都会发出一个接收窗口为10KB的确认段。若甲在t时刻发生超时的时候拥塞窗口为16KB,则从t时刻起,不再发生超时的情况下,经过10个RTT后,甲的发送窗口是( A )
    A. 10KB   B. 12KB   C. 14KB   D. 15KB
   分析: 若甲在t时刻发生超时的时候拥塞窗口为8KB,把慢开始门限值设为当前窗口的一半,即ssthresh=16/2 =8KB,更新cwnd的值为1,并开始重新执行慢开始算法。拥塞窗口的大小依次是1→2→4→8→9→10→…,经过5个RTT cwnd=10KB, 因为发送端不能超过接收端10KB,此后拥塞窗口一直保持cwnd=10KB。
       发送窗口大小=min(接收窗口,拥塞窗口)=10KB。

  • 4
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值