在介绍流量控制和拥塞控制之前首先不妨来想一下,接收方的接收能力受制于哪些因素。最重要的两个因素就是接收能力和网络情况。这两个因素就分别对应的流量控制和拥塞控制。
一、TCP流量控制
可以把流量控制理解为接收方的接收能力有限,因此要对发送方发送数据的数量进行控制。前面在TCP的报文格式中,我有介绍过,报文中存在一个接收窗口的字段,该字段的大小与流量控制有关。
发送方的数据到达接收方后,会首先存于接收方的缓存中,接收方以一定的速度从缓存中将数据取出,同时接收方会在给发送方的报文中将其当前缓存中空闲空间的大小返回。
为表示可用空间的大小,接收端维护以下变量:
1)RcvBuffer:接收端的缓存大小
2)LastByteRead:接收端的应用进程从缓存读取的数据流的最后一个字节的编号
3)LastByteRcvd:从网络中到达的并且已放入接收端接收缓存中的数据流的最后一个字节的编号。
由根据相关变量的定义可知:接收窗口rwnd的大小为
rwnd = RcvBuffer - (LastByteRcvd - LastByteRead)
文章图片
为防止数据溢出,必须保证rwnd > 0 ,因此发送方在其报文要将当前cwnd的值传输给发送方,发送方依据这个cwnd值的大小,决定发送数据的流量。如果cwnd = 0,那么发送方将不发送数据,仅在每一段时间间隔后发送一个只有一个字节的探测报文,用于探测当前cwnd值的大小,若此时cwnd大小不为0,则可以恢复发送,若依然为0,需要再过一段时间后,继续发送探测报文,探测报文发送的时间间隔为上一次时间间隔的2倍。
文章图片
二、拥塞控制
可以理解为网络情况限制了数据处理的速率,进而也影响着接收方的接收能力。接收方的接收能力必须与当前的网络情况相适应。
简单来说,发送方上来会先试探性的发送小流量的报文,若能在相应的时间间隔内收到应答报文,则加大发送的流量,直到出现网络拥塞。
拥塞控制可分为慢启动,拥塞避免,拥塞发生与重传三个步骤。
2.1慢启动
即拥塞窗口的大小为cwnd,cwnd的初始值是1,在慢启动阶段,发送方每收到一个接收方的确认应答报文,则窗口大小加1。
文章图片
2.2 拥塞避免
cwnd有一个阈值ssthresh,称作慢启动门限,cwnd超过这个阈值后,其增长速度要进行相应的调整,从原先的每收到一条应答报文cwnd = cwnd+1 变为每收到一条应答报文 cwnd = cwnd + 1/cwnd,此时拥塞窗口大小呈现出线性增长的趋势。
文章图片
2.3拥塞发生与重传
随着拥塞窗口的增大,受制于网络条件,某时刻,出现丢包,此时拥塞窗口退出拥塞避免状态,调整窗口大小,并进行重传。重传的方式通常有超时重传和快速重传。
对于超时重传和快速重传的介绍,可以参照我的另一篇博文TCP和UDP_流光亦流连的博客-CSDN博客
此处不再对超时重传和快速重传的原理进行赘述,只说发生超时重传和快速重传后拥塞窗口对应的变化:
当发生超时重传时,拥塞窗口cwnd的值变为1,慢启动门限ssthresh变为cwnd/2。
文章图片
当发生快速重传时,拥塞窗口cwnd变为cwnd/2+3,慢启动门限ssthresh变为cwnd/2。
文章图片
【计算机网络|TCP流量控制与拥塞控制】因此TCP接收端接收能力的大小同时受限于接收窗口和拥塞窗口,即接收的分组数量应取二者中的最小值,
推荐阅读
- 学习笔记|TCP协议——流量控制和拥塞控制
- 计算机网络|TCP的流量控制(滑动窗口)和拥塞控制
- 计算机网络|计算机网络 拥塞控制和流量控制,简述TCP的流量控制与拥塞控制
- 计算机网络梳理|四、TCP中的流量控制和拥塞控制
- tcp/ip|TCP流量控制和拥塞控制
- 计算机网络基础|TCP流量控制与拥塞控制总结
- Linux|Linux网络(传输层TCP/UDP)
- tcp/ip|IP地址的认识(一)
- 计算机网络|【计算机网络】第六章(应用层)