TCP协议是我们学习工程实践的宝库,其中蕴含了很多重要的模型。有几个比较重要的机制可以研究:连接管理、可靠传输、流量控制和拥塞控制。在实现自己的功能模块的时候,可以借鉴其中的思想。
可靠传输采用自适应的超时计算方法。
流量控制使用一种基于滑动窗口协议的流量控制机制。包括接受窗口(rwnd)和发送窗口(也称为拥塞窗口:cwnd):rwnd限制发送方向网络注入报文的速率,cwnd根据对当前网络拥塞程度的估计而确定的窗口值。发送方的发送窗口实际大小是取rwnd和cwnd中最小值。
拥塞控制的四种算法:慢开始、拥塞避免、快重传、和快恢复。
慢开始算法要点:
1. TCP连接建立好,开始发送TCP报文段时,拥塞窗口cwnd=1;
2. 使用慢开始算法,每经过一个传输轮次,拥塞窗口cwnd就加倍,即cwnd大小就呈指数形式增长;
3. 当拥塞窗口cwnd增大到一个规定的慢开始门限(阈值),然后执行拥塞避免算法;
拥塞避免算法要点:
1. 加法增大:拥塞窗口每经过一个RTT(往返时间)就增大一个MSS,而不再是加倍;
2. 乘法减小:当出现一次超时(网络拥塞)时,将慢开始门限改为当先拥塞窗口cwnd的一半,拥塞窗口重新设置为1,执行慢开始算法;
根据cwnd的大小执行不同的算法,归结如下:
1. 当cwnd<ssthresh时,使用慢开始算法;
2. 当cwnd>ssthresh时,停止使用慢开始算法,而改为拥塞避免算法;
3. 当cwnd=ssthresh时,既可以使用慢开始算法,也可以使用拥塞避免算法;
经典的满开始和拥塞避免算法如下图所示:
快重传算法要点:
1. 冗余ACK检测丢包的发生(丢包意味着网络发生了拥塞);
2. 当发送方连续收到三个重复的ACK报文时,直接重传对方尚未收到的报文段,而不必等待那个报文段设置的重传计时器超时;
3. 理解本算法需要明确可靠传输的机制;
快恢复算法要点:
1. 当发送方连续收到三个重复的ACK报文时,执行乘法减小,把慢开始门限ssthresh减半;
2. 拥塞窗口设置为慢开始门限ssthresh减半后的数值(与慢开始算法不同,慢开始算法将拥塞窗口设置为1);
3. 然后执行加法增大,使拥塞窗口缓慢地线性增大;
4. 由于跳过了拥塞窗口cwnd从1起始的慢开始过程,所以称为快恢复;