流量控制
TCP协议提供了流量控制的服务。TCP协议是基于滑动窗口机制的,在TCP连接建立时双方会约定最大报文段 MSS,并告知对方各自的接收窗口 rwnd 大小,在拥塞避免中还有一个拥塞窗口 cwnd(初始为 1,实际单位为为字节)和慢开始阀值 ssthresh(建立连接时约定,实际单位为字节)。发送窗口的大小 rwnd = Min (rwnd,cwnd)。
慢开始和拥塞避免
cwnd 初始为 1 个 MSS 大小,处于慢开始阶段,当确认的数据大小达到了一个 MSS,完成一个传输轮次,此时 cwnd 加 1 变成 2 个 MSS 大小,开始下一轮次;当确认数据大小超过了 2 个 MSS 大小,完成本传输轮次,cwnd 加 2 变成 4 个 MSS,开始下一轮次。如此重复,此过程 cwnd 不能大于 ssthresh,若 cwnd 大于 ssthresh,则将 cwnd 设为 ssthresh。
当 cwnd 大于等于 ssthresh,进入拥塞避免过程。此过程,每当完成一个传输轮次,将 cwnd 增加 1 个 MSS。
无论慢启动开始阶段还是在拥塞避免阶段,当发送方判断网络出现拥塞(其根据就是没有收到确认),就要把慢启动门限 ssthresh 设置为拥塞时 cwnd 的一半(但不能小于 2)。然后把拥塞窗口 cwnd 重新设置为 1,执行慢启动算法。
注释:传输轮次指把当前拥塞窗口 cwnd 所允许发送的大小的报文段都连续发送出去,并收到了对已经发送的最后一个字节的确认。而一个传输轮次的最短时间约等于一个往返时间 RTT。
从传输轮次来看,慢开始过程 cwnd 是指数增长的,而实际上,cwnd 的大小并不是一直都是 MSS 的整数倍大小,也不是只在完成一个传输轮次时才发生改变,而是根据当前已经确认的数据大小实时变化。
快重传和快恢复
快重传算法首先要求接收方每收到一个失序的报文段后就立即发出重复确认,而不要等到自己发送数据时才进行捎带确认。发送方只要一连收到三个重复确认就应当立即重传对方尚未收到的报文段,而不必继续等待重传计时器超时。
快恢复要求,当发送方连续收到三个重复确认,就执行“乘法减小”算法,将 ssthresh 减半。这是为了预防网络发生拥塞,接下去不执行慢开始算法,cwnd 从减半后的 ssthresh 开始执行拥塞避免算法。