流量控制
1、 流量控制的目标是接收端:怕接收端来不及处理数据
2、 流量控制的机制是丢包
3、 接收端抑制发送端的机制:接收端缓冲区的大小
滑动窗口
滑动窗口是用来告诉发送端可以发送数据的大小
窗口大小
接收端向发送端主机通知自己可以接受数据的大小,这个大小限制即为窗口大小(通过TCP首部中的2个字节)
最大窗口大小为64k,在早期是够用的。
窗口字段指出了现在允许对方发送的数据量,窗口值是动态变化的。
窗口扩大因子
用来扩大窗口,相当于窗口的最大值增大到了2^(16+14)-1 = 2 ^ 30 -1。
机理
1、 接收端将自己可以接收的缓冲区大小放入TCP首部的“窗口大小”字段,通过第二次握手的ack响应通知给发送端;
2、 接收端一旦发现自己的缓冲区快满了,就会设置一个更小的“窗口大小”的值发送给发送端,发送端会根据这个值来减慢发送速度;
3、 若接收端缓冲区满了,就会将窗口置为0,此时发送端不再发送数据,但是会定期发送一个窗口探测数据段,让接收端把窗口大小告诉发送端;
拥塞控制
慢启动+拥塞避免
1、 慢启动:
刚开始时不知道网络的负荷情况,先定义拥塞窗口cwnd的大小为1,按照指数规律增大拥塞窗口的大小,当cwnd的大小达到一个门限值ssthresh,改用拥塞避免算法。
2、 拥塞避免:
让拥塞窗口缓慢地增大,即cwnd+1
3、 无论在慢开始阶段还是在拥塞避免阶段,只要发送方没有收到确认,就认为这时候拥塞了,就要把慢开始门限ssthresh设置为此时发送方窗口值的一半(上例中是把发送方窗口值24修改为12)。然后把拥塞窗口cwnd重新设置为1,执行慢开始算法(重新慢启动)。
快重传和快回复
快重传:指发送端收到三个以上的重复ack,不需要等重传定时器溢出就会重新传递。
在慢启动和拥塞避免中,一旦出现超时重传,TCP会把慢启动的门限sshresh的值设置为cwnd的一半,同时cwnd设置;
但快速恢复中
一旦出现超时重传,或者收到三个重复的ack(快重传),TCP会将慢启动的门限sshresh设置为cwnd的一半,同时cwnd = ssthresh,转入拥塞避免算法。