TCP中的流量控制和拥塞控制

来源:互联网 发布:头像加v软件 编辑:程序博客网 时间:2024/06/06 17:40

一、流量控制

流量控制就是让发送方的发送速率不要太快,要让接收方来得及接收。

1、利用滑动窗口实现流量控制
所谓流量控制,主要是接收方传递信息给发送方,使其不要发送数据太快,是一种端到端的控制。主要的方式就是返回的ACK中会包含自己的接收窗口的大小,并且利用大小来控制发送方的数据发送(即发送方的数据窗口是根据接收方的数据窗口大小来决定的)

下图中a是发送方,b是接收方,b在一开始告诉发送方,其数据接收窗口为400,a开始发送数据

注:每一个报文段为100字节长,而数据报文段序号的初始值设为1。
在箭头上面大写ACK表示首部中的确认位ACK,小写ack表示确认字段的值(可以理解为接收方希望发送方下次发送的数据初始位置),只有ACK=1时确认号字段才有意义,后面的rwnd是指数据窗口。这样可保证数据丢失后能及时重传,保证数据传输的可靠性
这里写图片描述

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

2.持续计数器
存在一种情况:在图中,B向A发送的带有新的接收窗口值的报文段丢失,A一直等待收到B发送的非零窗口的通知,而B也一直等待A发送的数据,如果没有没有其他措施,这种相互等待的死锁局面将一直延续下去。
为了这个问题,持续计时器就来了。TCP为每一个连接设有一个持续计时器。
(1)只有TCP连接的一方收到对方的零窗口通知,就启动持续计时器
(2)若持续计时器设置的时间到期,就发送一个零窗口探测报文段,而对方就在确认这个探测报文段时给出了现在的窗口值。
(3)如果窗口仍然是零,那么收到这个报文段的一方就重新设置持续计时器。如果窗口不是零,那么死锁的僵局就可以打破了。

3.Nagle算法
若发送应用进程把要发送的数据逐个字节地送到TCP的发送缓存,则发送方就把第一个数据字节先发送出去,把后面到达的数据字节都缓存起来
当发送方接收对第一个数据字符的确认后,再把发送缓存中的所有数据组装成一个报文段再发送出去,同时继续对随后到达的数据进行缓存。只有在收到对前一个报文段的确认后才继续发送下一个报文段。当数据到达较快而网络速率较慢时,用这样的方法可明显地减少所用的网络带宽。
Nagle算法还规定:当到达的数据已达到 发送窗口大小的一半或已达到报文段的最大长度时,就立即发送一个报文段

糊涂窗口:
TCP接收方的缓存已满,而交互式的应用进程一次只从接收缓存中读取1字节(这样就使接收缓存空间每次仅腾出1字节),然后向发送方发送确认,并把窗口设置为1个字节(但发送的数据报为40字节的的话)。接收,发送方又发来1个字节的数据(发送方的IP数据报是41字节)。接收方发回确认,仍然将窗口设置为1个字节。这样,网络的效率很低。
要解决这个问题,可让接收方等待一段时间,使得或者接收缓存已有足够空间容纳一个最长的报文段,或者等到接收方缓存已有一半空闲的空间。只要出现这两种情况,接收方就发回确认报文,并向发送方通知当前的窗口大小。此外,发送方也不要发送太小的报文段,而是把数据报积累成足够大的报文段,或达到接收方缓存的空间的一半大小。

二、拥塞控制

拥塞控制和流量控制的关系密切,它们之间也存在一些差别。
所谓拥塞控制就是防止过多的数据注入到网络中,这样可以使网络中的路由器或者链路不致过载。拥塞控制所要做的都有一个前提,就是网络锁能够承受现有的网络负荷,是一个全局性的过程。

这里写图片描述

1、慢开始和拥塞避免

慢开始的慢并不是指cwnd的增长速率慢,而是在TCP开始发送报文段时先设置cwnd=1,使得发送方再开始时只发送一个报文段(目的是试探一下网络拥塞情况),然后逐渐增大cwnd

为了防止cwnd增长的过大引起网络拥塞,还需要设置一个慢开始门限ssthrensh状态变量。ssthresh的用法:
当 cwnd < ssthresh 时,使用上述的慢开始算法。
当 cwnd > ssthresh 时,停止使用慢开始算法而改用拥塞避免算法。
当 cwnd = ssthresh 时,既可使用慢开始算法,也可使用拥塞控制避免算法。

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

慢开始门限的设置:
无论在慢开始阶段还是在拥塞避免阶段,只要发送方判断网络出现拥塞(其根据就是没有按时收到确认),就要把慢开始门限ssthresh设置为出现拥塞是cwnd的一半(但是不能小于2),然后把cwnd重新设置为1,执行慢开始算法。
这样做的目的:要迅速减少主机发送到网络中的分组数,使得发生拥塞的路由器有足够的时间把队列中积压的分组处理完毕。

2、快重传和快恢复

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

与快重传配合使用的还有快会发算,其过程有以下两个算法:

(1)当发送方连续收到三个重复确认时,就执行“乘法减小算法”,把慢开始门限减半,这是为了防止网络发生拥塞。注意,接下去不执行慢开始算法

(2)执行快恢复算法,把cwnd值设置为慢开始门限ssthresh减半后的数值,然后开始执行拥塞避免算法,使的拥塞窗口缓慢地线性增大。