1. 拥塞控制的四种算法
所谓拥塞控制,是指防止过多的数据注入网络,保证网络中的路由器或链路小致过载。出现拥塞时,端点并不了解到拥塞发生的细节,对通信连接的端点来说,拥塞往往表现为通信时延的增加。当然,拥塞控制和流量控制也有相似的地方,即它们都通过控制发送方发送数据的速率来达到控制效果。
拥塞控制与流量控制的区别:拥塞控制是让网络能够承受现有的网络负荷,是一个全局性的过程,涉及所有的主机、所有的路由器,以及与降低网络传输性能有关的所有因素。相反,流量控制往往是指点对点的通信量的控制,即接收端控制发送端,它所要做的是抑制发送端发送数据的速率,以便使接收端来得及接收。
1、慢开始算法(接收窗口rwnd,拥塞窗口cwnd)
在TCP 刚刚连接好并开始发送TCP 报文段时,先令拥塞窗口cwnd = 1, 即一个最大报文段长度MSS 。每收到一个对新报文段的确认后,将cwnd 加1, 即增大一个MSS 。用这样的方法逐步增大发送方的拥塞窗口cwnd, 可使分组注入网络的速率更加合理。使用慢开始算法后,每经过一个传输轮次(即往返时延RTT), 拥塞窗口cwnd 就会加倍,即cwnd 的大小指数式增长。这样,慢开始一直把拥塞窗口cwnd 增大到一个规定的慢开始门限ssthresh(阔值),然后改用拥塞避免算法。
2、拥塞避免算法
拥寒避免算法的做法如下:发送端的拥塞窗口cwnd 每经过一个往返时延RTT 就增加一个MSS的大小,而不是加倍,使cwnd 按线性规律缓慢增长(即加法增大),而当出现一次超时(网络拥塞)时,令慢开始门限ssthresh 等于当前cwnd 的一半(即乘法减小)。
3、快重传
快重传技术使用了冗余ACK 来检测丢包的发生。同样,冗余ACK 也用千网络拥塞的检测(丢了包当然意味着网络可能出现了拥塞)。快重传并非取消重传计时器,而是在某些情况下可更早地重传丢失的报文段。当发送方连续收到三个重复的ACK 报文时,直接重传对方尚未收到的报文段,而不必等待那个报文段设置的重传计时器超时。
4、快恢复
快恢复算法的原理如下:发送端收到连续三个冗余ACK (即重复确认)时,执行“乘法减小”算法,把慢开始门限ssthresh 设置为出现拥塞时发送方cwnd 的一半。与慢开始(慢开始算法将拥塞窗口cwnd 设置为1) 的不同之处是,它把cwnd 的值设置为慢开始门限ssthresh 改变后的数值,然后开始执行拥塞避免算法("加法增大")'使拥塞窗口缓慢地线性增大。由于跳过了cwnd 从1 起始的慢开始过程,所以被称为快恢复。
2. 为何不采用“三次握手“释放连接,且发送最后一次握手报文后要等待2MSL 的时间
原因有两个:
1) 保证A 发送的最后一个确认报文段能够到达B 。如果A 不等待2MSL, 若A 返回的最后确认报文段丢失,则B 不能进入正常关闭状态,而A 此时已经关闭,也不可能再重传。
2) 防止出现“已失效的连接请求报文段“。A 在发送最后一个确认报文段后,再经过2MSL可保证本连接持续的时间内所产生的所有报文段从网络中消失。服务器结束TCP 连接的时间要比客户机早一些,因为客户机最后要等待2MSL 后才可进入CLOSED状态。
3. 为什么不采用“两次握手”建立连接呢
这主要是为了防止两次握手情况下已失效的连接请求报文段突然又传送到服务器而产生错误。考虑下面这种情况。客户A 向服务器B 发出TCP 连接请求,第一个连接请求报文在网络的某个结点长时间滞留, A 超时后认为报文丢失,千是再重传一次连接请求, B 收到后建立连接。数据传输完毕后双方断开连接。而此时,前一个滞留在网络中的连接请求到达服务器B, 而B 认为A 又发来连接请求,此时若使用“三次握手”,则B 向A 返回确认报文段,由于是一个失效的请求,因此A 不予理睬,建立连接失败。若采用的是“两次握手”,则这种情况下B 认为传输连接已经建立,并一直等待A 传输数据,而A 此时并无连接请求,因此不予理睬,这样就造成了B的资源白白浪费。