流量控制:
流量控制是为了控制发送方发送速率,保证接收方来得接收。
接收方发送的确认报文中的窗口字段可以用来控制发送方窗口大小,从而影响发送方的发送速率。将窗口字段设置为 0,则发送方不能发送数据。
拥塞控制:
如果网络出现拥塞,分组将会丢失,此时发送方会继续重传,从而导致网络拥塞程度更高。因此当出现拥塞时,应当控制发送方的速率。这一点和流量控制很像,但是出发点不同。流量控制是为了让接收方来得及接受,而拥塞控制是为了降低整个网络的拥塞程度。
TCP主要通过四种算法来进行拥塞控制:慢开始、拥塞避免、快重传、快恢复。发送方需要维护一个叫做拥塞窗口的状态变量。注意拥塞窗口与发送方窗口的区别,拥塞窗口只是一个状态变量,实际决定发送方能发送多少数据的是发送方窗口。
1、慢开始与拥塞避免
发送的最初执行慢开始,令拥塞窗口=1,发送方只能发送1个字节;当收到确认报文后,将拥塞加倍,因此之后发送的字节数为:2 4 8.....;设置一个慢开始门限ssthresh,当拥塞窗口>=ssthresh时,进入拥塞避免,每个轮次只将拥塞窗口加1;如果出现超时,则令ssthresh=拥塞窗口/2,然后重新执行慢开始。
2、快重传与快恢复
在接收方,每次要求接收方收到报文段都应该发送对已经收到有序字节的确认,例如已经接收到a1、a2,此时收到a4,应当发送对a2的确认;在发送方,如果收到3个重复确认,那么就可以确认下一个字节丢失,例如收到了3个a2,则a3丢失,此时快重传,立即重传下一个字节;在这种情况下,只是丢失个别字节,而不是网络拥塞,因此执行快恢复,令ssthresh=拥塞窗口/2,拥塞窗口=ssthresh,直接进入拥塞避免。