tcp拥塞控制作用就是提高网络利用率、降低丢包率、并保证网络资源对每条数据流的公平性。
拥塞控制有四部分组成,慢启动、拥塞避免、快速重传 快速恢复。
拥塞控制的最终受控变量是发送端向网络一次连续写入(收到第一个数据的确认之前)的数据量 我们称之为 SWND(发送窗口),发送端最终以TCP报文段来发送数据,所以SWND限制了连续发送报文段的数量,这些报文段的最大长度称之为SMSS,其值一般小于MSS。
接收方可以通过接收通告窗口(RWND)来控制SWND,但显然不够,引入CWND(拥塞控制窗口)这个状态变量。 而SWND,往往是RWND和CWND中的较小值。
慢启动与拥塞避免
TCP建立连接好了以后,CWND 就被设置成初始值为IW,其大小为2~4个SMSS.
以后发送端每接收到接收端的一个确认,那么CWND就以如下增长方式增长
CWND+=min(N,SMSS)
N为此次确认中包含的之前未被确认的字节数。这样一来,CWND将按照指数形式扩大。这就是所谓的慢启动,慢启动算法的理由是TCP模块刚开始发送数据的时候根本不知道网络的实际状况,需要一种试探的方式平滑的增加CWND的大小。
但如果不施加其他方法,慢启动必须使得CWND很快膨胀(可见慢启动其实并不慢)
为此CWND超过慢启动阀门值时,TCP拥塞控制将进入拥塞避免状态。
拥塞避免算法使得CWND以线性增长,从而减缓其扩大,拥塞避免有两种实现方式
每个RTT时间内按照CWND+=min(N,SMSS)计算新的CWND,而不论该RTT时间内发送端收到多少个确认。
每收到一个对新数据的确认报文段,就按照CWND+=SMSS*SMSS/CWND来更新CWND。
判断发送端拥塞发生的依据有如下两个:
- 传输超时或者TCP重传定时器溢出
- 接收到重复报文段
在很多情况下,发送端可能接收到重复的确认报文段,比如tcp报文丢失,或者是接收端接收到乱序TCP报文段,并重新排之。
拥塞控制算法就需要判断当收到重复的确认报文段时,网络是否发生了真正发生了拥塞,或者TCP报文段发生了丢失。
具体做法就是发送端如果连续收到3个重复的确认报文段,就认为是拥塞发生了。就启用快速重传和快速恢复。
快速重传和快速恢复完成之后,拥塞控制将恢复到拥塞避免状态