【笔试面试】关于TCP流量控制和拥塞控制的一点理解
TCP协议是传输层的一个面向连接的协议。其中有两个特性 流量控制
和 拥塞控制
比较相似,以前一直没有深入探究这两者的区别。今天研究了下王道上的内容,有了比以前更深的理解,在此记录下。
目的
首先,从目的上来说
- 流量控制是为了防止接收方的缓冲区大小不够发生溢出,所以减小接收窗口(rwnd)。
- 拥塞控制是防止过多的数据注入网络,造成网络中的路由器过载。
方式
- 流量控制:接收方在TCP报文的窗口字段限制发送方的发送速率。
- 拥塞控制:发送方自己检测网络的状态,如遇到超时、重复确认包时,对拥塞窗口进行调整。
其实真正的发送窗口只有一个,发送窗口选取的是接收窗口和拥塞窗口中较小的一个。比如网络状况较好,传输速率为10G/S,那么网络拥塞这一因素就不是主要的影响,主要看接收方的缓冲区大小。相反,如果链路的传输速率只有10M/S,又有大量的节点在传输,此时拥塞控制就成了主要因素。
流量控制是点对点的通信量控制,拥塞控制是考虑了全局的网络负荷,是一个全局性的概念。
拥塞控制
流量控制的内容不多,不展开讲了。下面讲下拥塞控制的几个过程:
- 慢开始
- 拥塞避免
- 快重传
- 快恢复
先讲解下拥塞控制的整个过程。直接百度盗的示意图。以下拥塞窗口(cwnd)简称窗口,门限阈值(ssthresh)简称阈值。
- 最开始时拥塞窗口(cwnd)设置为1。
- 经过一个传输轮次(RTT),拥塞窗口加倍(最大不超过阈值)。
- 拥塞窗口到达初始阈值(ssthresh),启动拥塞避免算法。
- 拥塞避免算法后每轮窗口值只增加1。
- 如果遇到超时*现象,则将阈值设为当前窗口值的一半,窗口值设为1,重新开始慢启动过程。
- 如果遇到重复确认*现象,则将阈值设为当前窗口值的一半,窗口值设为新阈值,开始拥塞避免。
上文中提到的超时是指数据报发出后,超过了超时重传时间(RTO)而触发的;重复确认其实就是重传的一种手段–冗余ACK,如果未收到一个包,就重复发送收到的上一个包的确认信息。如果连续收到相同的三个确认包,则表示下一个包丢失了,可以快速重传,然后启动快恢复过程。
其中,三个重复确认的时间会比超时重传的时间更短。我的理解是重复确认可以看作是偶尔丢失了一个包,所以使用快恢复过程。而超时说明是更严重的拥堵,需要使用慢开始过程,减少网络中的拥堵。