浅谈TCP优化
2017-12-18
流量控制
传输数据的时候,如果发送方传输的数据量超过了接收方的处理能力,那么接收方会出现丢包。为了避免出现此类问题,流量控制要求数据传输双方在每次交互时声明各自的接收窗口rwnd大小,用来表示自己最大能保存多少数据,这主要是针对接收方而言的,通俗点说就是让发送方知道接收方能吃几碗饭,如果窗口衰减为0,那么就说明吃饱了,必须消化,否则就会丢包。
慢启动
虽然流量控制可以避免发送方过载接收方,但是却无法避免过载网络,这是因为接收窗口rwnd值反映了服务器个体的情况,却无法反应网络整体的情况。
为了避免过载网络的问题,慢启动引入了拥塞窗口cwnd的概念,用来表示发送方在得到接收方确认前,最大允许传输的未经确认的数据量。cwnd与rwnd相比,不同点是:它只是发送方的一个内部参数,无序通知给接收方,其初始值往往比较小,然后随着数据包被接收方确认,窗口指数被扩张,有点类似全集比赛,开始时不了解敌情,往往是次拳试探,慢慢心里有底了,开始逐渐加大重拳进攻力度。
在慢启动过程中,随着cwnd的增加,可能会出现网络过载,器外在表现就是丢包,一旦出现此类问题,cwnd的大小会迅速衰减,以便网络能够缓过来。
说明:网络中实际传输的未经确认的数据大小取决于rwnd和cwnd中的小值。
拥塞避免
从慢启动的介绍中,我们可以看到,发送方通过对cwnd大小的控制,能够避免网络过载,在此过程中,对包与其说是一个网络问题,倒不如说是一种反馈机制,通过它我们可以感知到网络拥塞,进而调整数据传输策略,实际上,这里还有一个慢启动阈值ssthread的概念,如果cwnd小于ssthread,那么表示在慢启动阶段;如果cwnd大于ssthread,那么表示在拥塞避免阶段,此时cwnd不再像慢启动阶段那样呈指数级增长,而是趋向于一个线性增长,以避免网络拥塞,该阶段与很多中实现算法,通常保持缺省即可。