【网路通信基础与实践番外二】TCP协议的流量控制和拥塞控制以及二者区别和例题

TCP协议是端对端的协议,因此在数据进行传输的过程受发送方,数据通道,接收方三方状态的影响。我们用水龙头来比喻数据发送方,水管来比喻数据通道,水桶来表示数据接收方。

图(a)表示水桶太小,来不及接受注入水桶的水,而传输网络保持畅通,这时只能请求管水龙头的人把水龙头拧小一些,以减缓放水的速率,这就相当于是流量控制。

图(b)表示虽然水桶足够大,但是管道中有很狭窄的地方,使得管道不通畅,水流被堵塞,这种情况反馈到管水龙头的人那里,请求把水龙头拧小一些,以减缓放水的速率,为的减缓水管的堵塞状态,这就相当于是拥塞控制。

一、流量控制

在每一个TCP连接的一侧主机都会有一个socket缓冲区,缓冲区会为每个连接设置接收缓存和发送缓存,当TCP建立连接后,从应用程序产生的数据就会到达接收方的接收缓冲区中,接收方的应用程序并不一定会马上读取缓冲区的数据,他需要等待操作系统分配时间片。如果此时发送方的应用程序产生数据过快,而接收方读取接收缓冲区的数据相对较慢的话,那么接受方中缓冲区的数据就会溢出。

TCP的流量控制本质上是一个速度匹配服务,匹配发送方发送率和接收方的接受速率,避免出现发送方发送过快而接收方接受过慢的情况,从而消除缓冲区溢出的情况。

TCP通过使用一个接收窗口(receive window)来提供流量控制。在TCP报文结构中首部有一个接收窗口变字段,接收端通过向发送端发送报文,报文中就包含了接受窗口变量,接收窗口会给发送方一个指示到底还有多少可用的缓存空间。发送方发送不能超过这个限额的数据,这样发送方会根据接收端的实际接受能力来控制发送到数据量。

那么知道了接收窗口(receive window)之后,它具体是如何用来流量控制呢?

如上图所示,发送端主机会定期向接收端主机发送一个窗口探测包,这个包用于探测接收端主机是否能够接收数据,当接收端的缓冲区一旦面临数据溢出的风险,窗口大小的值也随之被设置为一个更小的值通知到发送端,从而控制数据发送量。

开始的窗口大小设置为3000,发送方每次发送报文长度为1000的报文,当接收端B收到2000-2999的报文之后缓冲区已满,不得不暂停接收数据。然后主机A发送窗口探测包,窗口探测包是一个非常小的字节,然后主机B更新缓冲区接受窗口大小并发送窗口更新通知到主机A,然后主机A再继续发送报文段。在上面的发送过程中,窗口更新通知可能会丢失,一旦丢失发送端就不会发送数据,所以窗口探测包会随机发送,以避免这种情况发生。

二、拥塞控制

有了TCP窗口控制机制之后,使得计算机网络中两个主机之间不再是以单个数据段的形式发送了,而是能够连续发送大量的数据包。但是发送大数据包的时候也面临着例如网络负载、网络拥堵的问题。TCP为了防止这类问题的出现,使用了拥塞控制机制,会在面临网络拥塞时遏制发送方的数据发送。

拥塞控制主要有两种方法:

端到端的控制:因为网络层没有为运输层拥塞控制提供显示支持,IP层不会向端系统提供有关网络拥塞的反馈信息。如果超时或者三次冗余确认就被认为是网络拥塞,TCP会减小窗口的大小,或者增加往返时延来避免。

网络辅助的拥塞控制:在网络辅助的拥塞控制中,路由器会向发送方提供有关网络中拥塞状态的反馈。这种反馈信息就是一个比特信息,它指示链路中的拥塞情况。

TCP发送方通过超时或者三个冗余ACK来感知网络拥塞,通过拥塞窗口cwnd来限制TCP在接收到ACK之前可以发送到网络的数据量。

一般来说,发送方未确认的数据量不得超过cwnd和rwnd的最小值,即:

LastByteSent - LastByteAcked <= min(cwnd, rwnd)

由于每个数据包往返时间为诶RTT,我们假设接受空间有足够的缓存用来接收数据,即只考虑cwnd,那么发送方的发送速率为cwnd/RTT 字节/秒,通过调节cwnd,发送方就可以调节它向连接发送数据的速率。

TCP进行拥塞控制的算法有四种:慢开始(slow start),拥塞避免(congestion avoidance),快重传(fast retransmit)和快恢复(fast recovery)

(1)慢开始

当一条TCP开始建立连接时,cwnd的值会初始化一个MSS的较小值。在慢启动的方式中,cwnd的值会初始化为一个MSS,并且每次传输报文确认后会增加一个MSS,cwnd的值会变成2个MSS,这两个报文段都传输成功后每个报文段加一,会变成4个MSS,以此类推,每成功一次cwnd的值会翻倍。

(2)拥塞避免

为了防止cwnd增长过大引起网络拥塞,还需要设置一个慢开始门限ssthresh状态变量。当cwnd > ssthresh时停用慢开始算法而改用拥塞避免算法,具体表现为加法线性规律缓慢增大。

(3)快重传和快恢复

有时候个别报文段就会在网络中意外丢失,但是实际上网络并未发生拥塞。如果发送方迟迟收不到确认,就会产生超时,并误认为网络发生了拥塞。这就导致发送方错误地开启慢启动模式,又将拥塞窗口设置为1,不必要的降低了传输效率。

快重传算法规定发送方只要一连收到3个重复确认,就可以知道现在并未出现网络拥塞,而只是接收方少收到一个报文段,并对此报文段进行重传。

在3-ACK点处发送方知道现在只是丢失了个别的报文段,于是不启动慢开始,而是执行快恢复算法。这时发送方第二次调整门限值,使ssthresh = cwnd / 2,开始执行拥塞避免算法。

 

三、流量控制和拥塞控制的区别

四、例题

 超时之后ssthresh = cwnd / 2 = 16 / 2 =8,之后执行慢开始,第一个RTT是2,第二次RTT是4,第三个RTT是8,此时cwnd = ssthresh = 8,执行拥塞避免算法,每次增长1,第四个RTT是9

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值