您的位置:首页 > 理论基础 > 计算机网络

TCP的流量控制与拥塞控制

2015-06-23 09:41 603 查看
流量控制一般说来,我们总是希望数据传输得更快一些。但如果发送方把数据发送得过快,接收方就可能来不及接收,这就会造成数据的丢失。流量控制(flowcontrol)就是让发送方的发送速率不要太快,既要让接收方来得及接收,也不要使网络发生拥塞。

利用滑动窗口实现流量控制




利用滑动窗口机制可以很方便地在TCP连接上实现流量控制,通过控制TCP报文段的发送时机来达到控制的目的,控制发送时机的三种机制为:

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

第二种机制是由发送方的应用进程指明要求发送报文段,即TCP支持的推送(push)操作。

第三种机制是发送方的一个计时器期限到了,这时就把当前已有的缓存数据装入报文段(但长度不能超过MSS)发送出去。

注:持续计时器(persistencetimer):

TCP 为每一个连接设有一个持续计时器。只要TCP连接的一方收到对方的零窗口通知,就启动持续计时器。若持续计时器设置的时间到期,就发送一个零窗口探测报文段(仅携带1字节的数据),而对方就在确认这个探测报文段时给出了现在的窗口值。

若窗口仍然是零,则收到这个报文段的一方就重新设置持续计时器。若窗口不是零,则死锁的僵局就可以打破了。

拥塞控制的一般原理
产生拥塞

在某段时间,若对网络中某资源的需求超过了该资源所能提供的可用部分,网络的性能就要变坏——产生拥塞(congestion)。即出现资源拥塞的条件是:
对资源需求的总和>可用资源
若网络中有许多资源同时产生拥塞,网络的性能就要明显变坏,整个网络的吞吐量将随输入负荷的增大而下降。

开环控制和闭环控制

开环控制就是在设计网络时事先将有关发生拥塞的因素考虑周到,力求网络在工作时不产生拥塞。

闭环控制是基于反馈环路的概念。属于闭环控制的有以下几种措施:

监测网络系统以便检测到拥塞在何时、何处发生。

将拥塞发生的信息传送到可采取行动的地方。

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

拥塞控制所起的作用



注:拥塞控制与流量控制的关系

拥塞控制所要做的都有一个前提,就是网络能够承受现有的网络负荷。拥塞控制是一个全局性的过程,涉及到所有的主机、所有的路由器,以及与降低网络传输性能有关的所有因素。

流量控制往往指在给定的发送端和接收端之间的点对点通信量的控制。

拥塞控制方法慢开始 拥塞避免
快重传和快恢复


发送方维持一个叫做拥塞窗口cwnd(congestionwindow)的状态变量。拥塞窗口的大小取决于网络的拥塞程度,并且动态地在变化。发送方控制拥塞窗口的原则是:只要网络没有出现拥塞,拥塞窗口就再增大一些,以便把更多的分组发送出去。但只要网络出现拥塞,拥塞窗口就减小一些,以减少注入到网络中的分组数。

发送方的发送窗口大小由拥塞窗口和接收方窗口共同决定,其上限值应当取为接收方窗口rwnd和拥塞窗口cwnd这两个变量中较小的一个,即发送窗口的上限值=Min
[rwnd, cwnd]

当rwnd< cwnd
时,是接收方的接收能力限制发送窗口的最大值。

当cwnd< rwnd
时,则是网络的拥塞限制发送窗口的最大值。

慢开始

慢开始算法原理:

在主机刚刚开始发送报文段时可先设置拥塞窗口cwnd= 1,即设置为一个最大报文段MSS的数值为1。在每收到一个对新的报文段的确认后,将拥塞窗口加1,即增加一个MSS的数值。

因此使用慢开始算法后,每经过一个传输轮次,拥塞窗口cwnd就加倍。如下图



注:传输轮次

一个传输轮次所经历的时间其实就是往返时间RTT。“传输轮次”更加强调:把拥塞窗口cwnd所允许发送的报文段都连续发送出去,并收到了对已发送的最后一个字节的确认。例如,拥塞窗口cwnd=
4,这时的往返时间RTT就是发送方连续发送4个报文段,并收到这4个报文段的确认,总共经历的时间。

设置慢开始门限状态变量ssthresh:

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

当cwnd> ssthresh
时,停止使用慢开始算法而改用拥塞避免算法。

当cwnd= ssthresh
时,既可使用慢开始算法,也可使用拥塞避免算法。

拥塞避免
拥塞避免算法原理:加法增大+乘法减小

加法增大(additiveincrease):

“加法增大”是指每经过一个往返时间RTT就把发送方的拥塞窗口cwnd加1,而不是加倍,使拥塞窗口cwnd按线性规律缓慢增长,以防止网络过早出现拥塞。

乘法减小(multiplicativedecrease)


“乘法减小“是指不论在慢开始阶段还是拥塞避免阶段,只要出现一次超时(即出现一次网络拥塞),就把慢开始门限值ssthresh设置为当前的拥塞窗口值乘以0.5(但不能小于2),然后把拥塞窗口cwnd重新设置为1,执行慢开始算法。这样做的目的就是要迅速减少主机发送到网络中的分组数,使得发生拥塞的路由器有足够时间把队列中积压的分组处理完毕。

慢开始和拥塞避免算法的实现举例:



当TCP连接进行初始化时,将拥塞窗口置为1。图中的窗口单位不使用字节而使用报文段。慢开始门限的初始值设置为16个报文段,即ssthresh=
16。发送端的发送窗口不能超过拥塞窗口cwnd和接收端窗口rwnd中的最小值。我们假定接收端窗口足够大,因此现在发送窗口的数值等于拥塞窗口的数值。在执行慢开始算法时,拥塞窗口cwnd的初始值为1,发送第一个报文段M0。 发送端每收到一个确认,就把
cwnd加1。于是发送端可以接着发送M1和M2两个报文段。 接收端共发回两个确认。发送端每收到一个对新报文段的确认,就把发送端的cwnd加1。现在cwnd从2增大到4,并可接着发送后面的4个报文段。 发送端每收到一个对新报文段的确认,就把发送端的拥塞窗口加1,因此拥塞窗口cwnd随着传输轮次按指数规律增长。 当拥塞窗口cwnd增长到慢开始门限值ssthresh时(即当cwnd=
16 时),就改为执行拥塞避免算法,拥塞窗口按线性规律增长。 假定拥塞窗口的数值增长到24时,网络出现超时,表明网络拥塞了。 更新后的ssthresh值变为12(即发送窗口数值24的一半),拥塞窗口再重新设置为1,并执行慢开始算法。 当cwnd=
12 时改为执行拥塞避免算法,拥塞窗口按按线性规律增长,每经过一个往返时延就增加一个MSS的大小。

: “拥塞避免”并非指完全能够避免了拥塞。利用以上的措施要完全避免网络拥塞还是不可能的。“拥塞避免”是说在拥塞避免阶段把拥塞窗口控制为按线性规律增长,使网络比较不容易出现拥塞。

快重传

快重传算法首先要求接收方每收到一个失序的报文段后就立即发出重复确认,发送方只要一连收到三个重复确认就应当立即重传对方尚未收到的报文段。这样做可以让发送方及早知道有报文段没有到达接收方,而且快重传并非取消重传计时器,而是在某些情况下可更早地重传丢失的报文段。



快恢复

(1)当发送端收到连续三个重复的确认时,就执行“乘法减小”算法,把慢开始门限ssthresh减半。

(2)由于发送方现在认为网络很可能没有发生拥塞,因此现在不执行慢开始算法,即拥塞窗口cwnd现在不设置为1,而是设置为慢开始门限ssthresh减半后的数值,然后开始执行拥塞避免算法(“加法增大”),使拥塞窗口缓慢地线性增大。

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: