1.概述算法
所谓的流量控制就是让发送方的发送速率不要太快,让接收方来得及接受。利用滑动窗口机制能够很方便的在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字节的数据),而对方就在确认这个探测报文段时给出了如今的窗口值。
2.TCP报文段发送时机的选择
TCP豹纹短短发送时机主要有如下几种选择途径。
1)TCP维持一个变量,它等于最大报文段长度MSS,只要缓存中存放的数据达到MSS字节就组装成一个TCP报文段发送出去。
2)由发送方的应用程序指明要求发送报文段,即TCP支持的推送操做
3)是发送方的一个计时器期限到了,这时就把当前已有的缓存数据装入报文段发送出去。
在某段时间,若对网络中的某一资源的需求超过了该资源所能提供的可用部分,网络的性能就要变化,这种状况叫作拥塞。
网络拥塞每每是由许多因素引发的,简单的提升节点处理机的速度或者扩大结点缓存的存储空间并不能解决拥塞问题。例如
1)当某个结点缓存容量扩展到很是大,因而凡到达该结点的分组都可在结点的缓存队列中排队,不受任何限制。因为输出链路的容量和处理机的速度并未提升,所以在这队列中的绝大多数的分组在排队等待时间会大大增长,结果上层软件只好把他们进行重传。
所以,问题的是指每每是整个系统的各个部分不匹配,只有各个部分平衡了,问题才会获得解决。
2.拥塞控制和流量控制的差异
所谓拥塞控制就是防止过多的数据注入到网络中,这样可使网络中的路由器或链路不致过载。拥塞控制所要作的都有一个前提,就是网络能承受现有的网络负荷。
流量控制每每指的是点对点通讯量的控制,是个端到端的问题。流量控制所要作的就是控制发送端发送数据的速率,以便使接收端来得及接受。
3.拥塞控制设计
拥塞控制是很难设计的,由于它是一个动态的问题,许多状况下,甚至正式拥塞控制机制自己成为引发网络性能恶化甚至死锁的缘由。从控制理论的角度来看拥塞控制这个问题,能够分为开环控制和闭环控制两种方法。开环控制就是在设计网络时事先将有关拥塞发生的全部因素考虑周到,一旦系统运行起来就不能在中途改正。
闭环控制是基于反馈环路的概念,包括以下措施:
1)监测网路系统以便检测拥塞在什么时候何地发生
2)把拥塞发生的信息传送到可采起行动的地方
3)调整网络系统的行动以解决出现的问题。
4.拥塞控制方法
因特网建议标准RFC2581定义了进行拥塞控制的四种算法,即慢开始(Slow-start),拥塞避免(Congestion Avoidance)快重传(Fast Restrangsmit)和快回复(Fast Recovery)。咱们假定
1)数据是单方向传送,而另一个方向只传送确认
2)接收方老是有足够大的缓存空间,由于发送窗口的大小由网络的拥塞程度来决定。
--慢开始和拥塞避免
发送报文段速率的肯定,既要根据接收端的接收能力,又要从全局考虑不要使网络发生拥塞,这由接收窗口和拥塞窗口两个状态量肯定。接收端窗口(Reciver Window)又称通知窗口(Advertised Window),是接收端根据目前的接收缓存大小所许诺的最新窗口值,是来自接收端的流量控制。拥塞窗口cwnd(Congestion Window)是发送端根据本身估计的网络拥塞程度而设置的窗口值,是来自发送端的流量控制。
慢启动原理:
1)当主机开始发送数据时,若是当即将较大的发送窗口的所有数据字节都注入到网络中,那么因为不清楚网络的状况,有可能引其网络拥塞
2)比较好的方法是试探一下,即从小到达逐渐增大发送端的拥塞控制窗口数值
3)一般在刚刚开始发送报文段时可先将拥塞窗口cwnd设置为一个最大报文段的MSS的数值。在每收到一个对新报文段确认后,将拥塞窗口增长至多一个MSS的数值,当rwind足够大的时候,为了防止拥塞窗口cwind的增加引发网络拥塞,还须要另一个变量---慢开始门限ssthresh
拥塞控制具体过程为:
1)TCP链接初始化,将拥塞窗口设置为1
2)执行慢开始算法,cwind按指数规律增加,知道cwind == ssthress开始执行拥塞避免算法,cwnd按线性规律增加
3)当网络发生拥塞,把ssthresh值更新为拥塞前ssthresh值的一半,cwnd从新设置为1,按照步骤(2)执行。
--快重传和快恢复
一条TCP链接有时会因等待重传计时器的超时而空闲较长的时间,慢开始和拥塞避免没法很好的解决这类问题,所以提出了快重传和快恢复的拥塞控制方法。
快重传算法并不是取消了重传机制,只是在某些状况下更早的重传丢失的报文段(若是当发送端接收到三个重复的确认ACK时,则判定分组丢失,当即重传丢失的报文段,而没必要等待重传计时器超时)。慢开始算法只是在TCP创建时才使用
快恢复算法有如下两个要点:
1)当发送方连续收到三个重复确认时,就执行“乘法减少”算法,把慢开始门限减半,这是为了预防网络发生拥塞。
2)因为发送方如今认为网络极可能没有发生拥塞,所以如今不执行慢开始算法,而是把cwnd值设置为慢开始门限减半后的值,而后开始执行拥塞避免算法,是拥塞窗口的线性增大。