TCP 流量控制
TCP 通过滑动窗口机制和流量拥塞算法来达到控制流量的目的。
滑动窗口机制是指发送方每次可以发送的多少字节的数据(即所谓的窗口大小),这个窗口大小是由接收方告诉发送方的(取决于接收方的剩余缓冲区大小)。
那假设接收方告诉发送方,下次我可以接收 40 字节的数据,那发送方是不是就可以发满 40 字节的数据呢?答案是不一定。因为对于发送方来说,这 40 个字节的窗口得包括两个部分 —— 已发送未收到确认的数据和未发送的数据。
为什么要让这部分已发送未收到确认的数据来占据宝贵的发送窗口呢?那是因为 TCP 是可靠连接,当发送的数据丢失的时候,需要再次发送。所以这也就会出现一个问题,即当已发送未收到确认的数据达到 40 字节的时候,就会出现窗口为 0 的情况,也就是不发送数据了。解决方法是给每段发送的数据设置个超时时间,当超时还未收到确认的情况下就再次发送,这样只要网络还是可用的,总归会有部分数据得到确认,从而逐步释放窗口。
流量拥塞算法则是发送方对网络状况的一个适应,刚开始建立连接发送数据,这时候由于不知道网络拥塞情况,所以有个慢启动机制。在慢启动阶段,发送能力按 1、2、4、8 成倍增加,直到达到慢启动门限,然后发送能力进入线性增加,即每次加 1。随着发送能力不断增加,网络拥塞情况也越来越严重,最终会出现丢包现象,这时候就要降低发送能力。
降低发送能力有两种策略 —— 快速重传和超时重传。
当接到三次相同数据确认的时候,说网络可用,只是速度很慢,这时候可采用快速重传策略,即发送能力减半,慢启动门限变成减半后的发送能力;如果在设定时间内一个确认包都没收到,则触发超时重传策略,直接将发送能力重置为 1,然后慢启动门限变为当前发送能力的一半。