TCP的拥塞控制:
当网络中数据过多时,就会出现拥塞, 很多数据被丢弃->需要重传->更多的数据涌入->恶性循环。
与可靠传输一样,拥塞控制也是计算机网络所必要解决的问题。
拥塞控制的前提是发现拥塞,拥塞发生在交换机与路由器等网络设备中,
但是网络设备无法把发生拥塞的信息通知TCP实体,这是因为TCP实体仅仅存在于计算机中,
网络设备中没有TCP实体,虽然2001年的协议对TCP/IP协议做了改进,使得路由器能够把发生堵塞的信息通知给TCP实体,
但这仅仅是一个选项而且默认不开启(尼玛坑爹啊)。
TCP必须自己独立的去发现拥塞。
拥塞发生时数据会被丢弃,这就是TCP判断拥塞是否发生的依据。
数据被丢弃就没有ACK,所以:当一个报文段需要超时重传时,TCP就认为网络发生了拥塞。
(现在通信线路质量极好,报文段因为发生差错被重传的概率极小)所以这个方法是靠谱的。
拥塞发生后的对策很简单,就是降低发送速率,为此TCP设置了一个拥塞窗口, 拥塞窗口的含义与TCP首部中 的接收窗口是一样的。
即:已发送未确认的数据量不能超过拥塞窗口大小,这样,就有了TCP接收 和 拥塞 两个窗口。
其中较小的窗口起作用,即:已发送未确认的数据量不能超过这两个里面更小的那一个。接收方使用接收窗口控制发送方的发送速率,
发送方则是使用拥塞窗口控制自己的发送速率。
当拥塞发生时,TCP就减少拥塞窗口,从而降低发送速率,之后拥塞窗口逐渐增大,直到拥塞再次发生。这时拥塞窗口再次变小