上两章讲了TCP连接和关闭,今天讲讲传输过程中的问题:拥塞控制。 首先讲讲什么是拥塞:一段时间内,当网络中的资源已经不足以供网络当前运行需求的资源时,网络的性能就会下降。 这些资源包括:带宽,节点缓存 拥塞避免就是为了将资源的消耗得到控制,避免网络性能下降。 拥塞控制分为:
慢开始拥塞避免快速重传快恢复 首先我们了解几个名词:cwnd拥塞窗口 :发送方维持的一个变量,随着网络情况而有所变化,这个变量用来限制发送方能发送分组的上限。ssthresh慢开始门限:慢启动到拥塞避免到阈值,超过这个值就进入拥塞避免。 慢开始:刚开始的时候将cwnd设置为1,当收到接收回复时,则将cwnd*2作为新的cwnd,这样能发送的分组将持续变大。而称为慢开始是因为cwnd刚开始设置为1,而不是cwnd的增长的很慢。这里避免开始就发送很大的数据量直接把资源用光。当cwnd>ssthresh时就会进入拥塞避免。 拥塞避免:进入拥塞避免后,cwnd增长的数额将变成1。这样cwnd 的增长比较平稳。当出现网络拥塞时就将ssthresh设置成当前cwnd的一半,并且将cwnd设置为1.重新进入慢开始。拥塞避免并不能完全避免拥塞,只是通过限制cwnd的增长速度延迟拥塞到来的时间。快速重传:发送方尽快重传而不等待超时重传。当发送方发送了1,2,3,三个包之后。连续收到了3个1的ACK包。这时发送包认为2,3的包都丢失了,会马上重传2,3两个包,而不是等待超时重传。快速重传的作用是避免连接因为长时间等待超时重传而消耗资源。
快恢复: 当出现了连续的3个ACK包时,认为要进入快恢复。这时并不是所有的包都丢失,而是部分丢失。这时将cwnd和ssthresh都设置为当前的一半,并进入拥塞避免。这里的作用是当出现了拥塞的前兆时,及时调整但又不需要从1开始。比慢开始的性能要好一点。
还是用AB两个水罐之间的水管来举例哟! 拥塞: 当水管里面的水流太大的时候可能会在一些连接不紧密的地方漏出一些水出来。 **拥塞控制:**避免水流太大,导致太多的水流出来,对方接收不到。 慢开始: 当A水管要放水时,刚开始慢慢的拧开水龙头(cwnd)。当B水管管理员告诉A管理员收到时,A管理员则逐步将水龙头拧大。 拥塞避免: 之前的管理员记录有一个水龙头的刻度,超过这个刻度就只能慢慢的拧,避免水太大。 快重传:当A水管这边放了三种颜色的水过去时,而B那边只收到一种颜色,当B管理员回了三遍只收到了红色的水,则A管理员就认为水漏出去了只能重新再把其他的水再发一遍。 **快恢复:**当收了三遍同样的确认时,A管理员就认为水管开始漏水了,这个时候必须把水龙头拧小一点,并且把刻度也变小,然后又开始慢慢拧。
当cwnd==ssthresh时既可进入慢开始又可进入拥塞避免。
入门:《图解TCP/IP》,《TCP/IP网络编程》
深入:《Unix 高级环境编程》,《Unix 网络编程》 第 1 卷 套接口 API 、第 2 卷 进程间通信
TCP参数控制
ps:IT10分钟会持续更新,有兴趣的同学可以关注一下,有想了解的知识点可以评论。