拥塞控制不同于流量控制,拥塞控制是在拥塞发生时,发送方根据一定的反馈,主动调节自己的发送速率,以防止拥塞恶化的行为。

1.   网络拥塞

路由器是网络中的关键组件,其内部有一定量的缓冲区,用于缓存来不及转发(forward,或称transmit)出去的packet。如果将网络看成一个整体,那么一个网络的链路容量(link capacity)就取决于网络中的路由器的缓冲区大小。链路容量越大,整个网络可容纳的outstanding(即在网络中propagate)的packet就越多。

当网络中的packet较少时,每个packet进入路由器,会较快被转发出去,几乎没有延迟。而当网络中的packet过多时,路由器来不及转发,大量的packet就会在路由器中排队,等待转发(FIFO),此时packet就有较长的延迟,当缓冲区满时,后进来的packet甚至会被丢弃(lost packet)。这就是拥塞现象(congestion)。

2.   Duplicate ACK

由TCP的Acknowledgement机制可知,receiver期待能按序地(in sequence)接受下一个packet。当out-of-order packet(乱序包)发生时,receiver(虽然会缓存乱序包)不会将错就错地回复乱序的包,而是坚持请求之前期待的包。receiver会在对应的ACK中指明未接受的packet中序号最小的一个(也就是一直期待的packet),而不是与错误的packet的相邻的下一个。这样以来,receiver每收到一个乱序包,都会发送一个与上一个ACK内容相同的ACK,直到收到所期待的packet为止,这就形成了重复ACK(duplicate ACK)。

重复ACK是网络拥塞情况的一个体现,当重复ACK出现时,说明出现了乱序包或者丢包,而乱序包和丢包又是网络拥塞所导致的,因此重复ACK越频繁,网络拥塞越严重。

在对网络拥塞的影响程度上,乱序包和丢包是不同的。前者仅仅意味着packet不是按序到达receiver,被跳过的packet很可能会在后面陆续到达,而后者意味着packet不会再到达了,因为已经在网络上被丢弃了。

可以看出,对于乱序包,sender是不需要做任何处理的,而对于丢包,sender需要负责重传丢失的packet。sender为了有针对性地处理两种情况,首先要采取一定的机制区分两种情况。统计发现,乱序包造成的重复ACK一般都是1~2个,而丢包造成的重复ACK则是3个及以上。因此,sender可以根据收到的重复ACK的个数,判断是否发生了乱序包或者丢包。

3.   Retransmission Timeout

TCP可靠传输的核心是重传机制。当一个packet没有被receiver接收到时,sender需要重传该packet,直到receiver接收到packet为止。

触发重传有两种情况,且都与ACK有关。最经典的触发重传的情况是超时。当sender发送一个packet之后,即开启timer,等待对应的ACK,如果在timer结束前收到ACK,则认为paceket发送成功,否则认为发送失败,继而进行重传。可以看出timer的超时时间(RTO, Retransmission Timeout)是触发重传的关键,那么sender是如何合理地设置RTO的呢?很显然,RTO是与当前网络环境相关的一个变量,需要实时计算得到。联想到RTT,可以猜测RTO与RTT存在一定的联系,事实上RTO就是基于SRTT(smoothed RTT)计算得到的,两者存在线性关系。每当发送一个新的packet时,timer就被设置为当前RTO,之后每隔500ms更新一次,当收到相应的ACK时,timer就被停止,否则直到timer递减到0并触发重传。计算RTO的具体算法参考RFC6298。

4.   拥塞控制

Congestion Control不同于Flow Control,Congestion Control是在拥塞发生时,sender根据一定的反馈,主动调节自己的发送速率,以防止拥塞恶化的行为。

sender会根据两种现象探测拥塞的发生:

如果收到来自receiver的3个重复ACK(算上原始ACK,实际上有4个相同的ACK),则认为发生了拥塞,并且知道ACK中指明的即为lost packet。

如果ACK超时(超过RTO仍未收到ACK),也认为发生了拥塞,并且这种情况说明拥塞更加严重(因为连重复ACK都没收到)。

TCP引入了两个变量:rwnd和cwnd,用于拥塞控制。rwnd是receiver的接收窗口(receive window)的大小,也是它所建议的sender的发送窗口的大小,此变量最初目的是用于flow control中,协调双方的发送/接收速率。cwnd是sender的拥塞窗口的大小,sender所能发送的packet被限制在该窗口内,考虑到Flow Control里的发送窗口,sender最终的发送窗口被定义为min{cwnd, rwnd},因此LastByteSent – LastByteAcked  <= min{cwnd, rwnd}.

cwnd和rwnd的单位是MSS(maximum segment size),表示TCP允许的最大单个报文的长度,不包括TCP头部信息。

可以粗略地认为发送窗口的大小就是cwnd。TCP一般在一个 RTT内,将发送窗口里的packet全部发送出去,因此发送速率为cwnd/RTT。因此,sender调节自己的发送速率实际上就是调整cwnd的大小。

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

  1. 计算机网络(10)-----TCP的拥塞控制

    TCP的拥塞控制 拥塞(congestion) 在某段时间,若对网络中某一资源的需求超过了该资源所能提供的可用部分,网络的性能就要变坏. 拥塞控制 拥塞控制就是防止过多的数据注入到网络中,这样可以使网 ...

  2. TCP网络拥塞控制

    拥塞控制过程 数据吞吐量 TCP窗口大小,窗口流量控制,慢启动对TCP的成块数据传输综合作用,可能对TCP的数据传输有意想不到的影响. RTT(Round-Trip Time) :往返时间.是指一个报 ...

  3. TCP/IP拥塞控制

    TCP/IP拥塞控制包括:慢启动和拥塞避免.其操作流程如下所述: 初始化.拥塞窗口cwnd = 1,慢启动门限ssthresh = 65535 如果没有发生拥塞 若 cwnd < ssthres ...

  4. TCP的拥塞控制

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

  5. TCP的拥塞控制(转载)

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

  6. [转]TCP的拥塞控制

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

  7. [计算机网络] TCP的拥塞控制

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

  8. 【TCP】拥塞控制

    TCP拥塞控制 出现拥塞           ∑对资源的需求 > ∑可用资源 拥塞控制是防止过多的数据注入到网络中,使网络中的路由器或链路不过载,这是一个全局性的. 流量控制是点对点的通信量的控 ...

  9. 【网络协议】TCP的拥塞控制机制

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

随机推荐

  1. bootstrap 4 panels已被card替换

    https://www.zhihu.com/question/34838389?sort=created 解决问题的思路不对,不应该搜不到就各种着急,应该理清思路, 既然 bootstrap4没有了3 ...

  2. Ajax在Django中的应用

    一.什么是Ajax AJAX(Asynchronous Javascript And XML)翻译成中文就是“异步Javascript和XML”.即使用Javascript语言与服务器进行异步交互,传 ...

  3. Delphi 中的 RectTracker - 原创

    本文算是副产品,正品是利用 FFmpeg 从任意视频中生成GIF片段的小程序,写完了就发. V2G 正品已出炉,虽然不大像样,但好歹是能用,请见:用 Delphi 7 实现基于 FFMS2 的视频转 ...

  4. python基础知识-03-字符串

    python其他知识目录 1.for循环遍历字符串中单个字符 s_str="mcw" for i in s_str: print(i) -----------结果: m c w 2 ...

  5. ES6的新特性(13)——Symbol

    Symbol 概述 ES5 的对象属性名都是字符串,这容易造成属性名的冲突.比如,你使用了一个他人提供的对象,但又想为这个对象添加新的方法(mixin 模式),新方法的名字就有可能与现有方法产生冲突. ...

  6. loadrunner socket协议问题归纳(2)

    编写步骤 1.建立与服务端的连接 rc=lrs_create_socket(“socket0”,”TCP”,”LocalHost=0”,”RemoteHost=127.0.0.1:8808”,LrsL ...

  7. MathExam第二次作业(升级版)

    MathExamLv2——林华伟 211506319 陈珍 211406263   一.预估与实际 PSP2.1 Personal Software Process Stages 预估耗时(分钟) 实 ...

  8. 团队Alpha冲刺(三)

    目录 组员情况 组员1(组长):胡绪佩 组员2:胡青元 组员3:庄卉 组员4:家灿 组员5:凯琳 组员6:丹丹 组员7:家伟 组员8:政演 组员9:鸿杰 组员10:刘一好 组员11:何宇恒 展示组内最 ...

  9. struts2文件上传突破2M限制

    struts配置文件 <action name="upload" class="strutsFileUpload"> <result name ...

  10. HDU 5229 ZCC loves strings 博弈

    题目链接: hdu:http://acm.hdu.edu.cn/showproblem.php?pid=5229 bc:http://bestcoder.hdu.edu.cn/contests/con ...