<!-- @page { size: 21cm 29.7cm; margin: 2cm } P { margin-bottom: 0.21cm } H1 { margin-bottom: 0.21cm } H1.western { font-family: "Nimbus Sans L", "Arial", sans-serif; font-size: 16pt } H1.cjk { font-family: "Tahoma"; font-size: 16pt } H1.ctl { font-family: "Tahoma"; font-size: 16pt } H2 { margin-bottom: 0.21cm } H2.western { font-family: "Nimbus Sans L", "Arial", sans-serif; font-size: 14pt; font-style: italic } H2.cjk { font-size: 14pt; font-style: italic } H2.ctl { font-size: 14pt; font-style: italic } -->
前言:
tcp协议有非常多的变体。产生这些变体的原因在于网络传输中的拥塞控制是个非常复杂也非常重要的问题,特别是在高速高延迟的网络中,这个问题犹为重要。目前也不存在一个完美的解决办法。
Tahoe:
慢启动,基于丢包的拥塞避免和快速重传,Tahoe采用的这些拥塞控制算法为其他各种TCP所采用。对于传统低速而稳定的网络(局域网)而言,Tahoe的性能是可以接受的。
Reno:
Tahoe对丢包非常敏感,1%的丢包率会导致吞吐率降低50%-%75。Reno在Tahoe基础上增加了快速恢复,可以一定程度上缓解这一问题。
NewReno:
Reno的快速恢复算法在“快速恢复”了第一个丢失的segment,即收到一个非重复、有效的ack之后就退出了快速恢复。这样当同一个窗口中有多个segment丢失时,该算法只能对第一个丢失的包进行快速恢复,导致性能降低。Newreno的快速恢复算法做了小小的改进:在收到非重复、有效的ack之后,只有这个ack对发生丢包的窗口内的所有数据做了确认,才退出快速恢复算法。
这种改进进一步增强了TCP的抗丢包能力。
注意:Reno和Newreno所做改进都是发生在发送端,对接收端透明。
SACK:
SACK(选择确认)是解决丢包导致吞吐率下降的另外一种方法。在以往的确认方式(累积确认)下,接收方发回的ACK报文携带的信息量很少,使得发送方无法及时准确的得到报文丢失情况,从而无法准确及时的进行数据重传。而SACK的接收方的ACK报文带有更多信息。
比如下面这种情况,发送方发出数据ABCDE,传输过程中B和D丢失,接收方只收到A、C和E。
如果采用累积确认,接收方只能告诉发送方收到A,等收到发送方重传的B之后才能发送收到C的确认,再要等发送方重传D之后才能发送E的确认。
如果采用SACK,接收方可以在第一条ACK报文里就告知发送方已经收到ACE,发送方直接重传B和D就行了。
SACK要求接收方和发送方都支持SACK选项。目前主流的TCP协议栈都支持SACK。
HSTCP, STCP:
都是Reno算法的变形。针对在大带宽高延迟链路情况下,通过提高拥塞避免阶段窗口增长的速度,减小丢包发生时拥塞窗口减小的速度,来提高吞吐率。
Vegas:
Vegas对传统TCP做了相当大的改进,具体如下:
更快速的重传
为了避免对操作系统粗粒度时钟的依赖,Vegas在每次重复的ACK到来时,都检查对应的segment是否已经可以超时重传。
另外,发生重传时,如果重传的segment是在上一个大小的拥塞窗口下发送的,则不对拥塞窗口做减半操作。这么做可以避免拥塞窗口被过分减小导致传输性能下降。
拥塞预测
利用吞吐率的变化调整拥塞窗口,而不是利用丢包来检测拥塞。每收到一个有效的ACK,计算如下三个值:
Expected = WindowSize/BaseRTT
Actual = SentData/ActualRTT
Diff = Expected - Actual
其中,BaseRTT是该连接上观测到的最小的RTT值;ActualRTT是被确认segment被 发送到收到ACK的时间间隔;SentData是ActualRTT内发送的数据量。
Vegas定义两个常量a,b(a,当Diff 时,则线性增加拥塞窗口;当Diff > b时,线性减少拥塞窗口。
这种拥塞控制方式是在拥塞将要发生时控制,而不是在拥塞发生后控制。正因为如此,Vegas的吞吐率不会象上面几种TCP,会有较大的波动。这种控制方式在高速高延迟的网络中,对性能的提升非常明显。
慢启动的改进
与拥塞预测的改进机制类似,通过监视吞吐率的变化来决定是否离开慢启动模式。
通过以上三方面的改进,Vegas可以提高带宽的利用率,减少重传次数,减少超时次数。这些改进主要针对大带宽高延迟的链路。
Westwood:
在无线网络下,丢包通常是由于网络传输出错,而不是网络拥塞,造成的。传统TCP把丢包当作网络拥塞的标志而减小拥塞窗口,在这种情况下就会导致吞吐量的大幅下降。Westwood通过持续测量连接的速度,在重传发生时,更“准确”的设置ssthresh和cwnd,从而改善了在无线网络下的吞吐率。
Fast:
Fast“似乎”是对Vegas的进一步改进,它同样是利用网络延迟来推断网络拥塞。Fast把Reno的问题归结如下:
- 拥塞控制阶段拥塞窗口增长过慢,减少过快,即加法增长乘法减少AIMD。
- 丢包导致拥塞窗口维持在较高数值上的概率非常低
- 拥塞窗口的大小无法稳定在合适的值上,而是上下波动。
Fast的拥塞避免算法基于一系列数学计算公式。一个公式给出TCP传输的平衡点,另外一个公式给出当前状态远离平衡点的距离。拥塞控制的目标是使传输状态逼近平衡点,在平衡点上,TCP达到链路所能稳定支持的最大吞吐量(即不往路由器队列中增加包的最大吞吐量)。它利用当前状态远离平衡点的距离大小来决定调整的方向和幅度。
Fast的另一个特点是采用Pacing。Pacing的采用是有争议的,早期的观点认为采用Pacing并不会提高TCP传输效率,相反,会降低吞吐率。其原因简单的说是因为Pacing导致路由器的队列里均匀分布着来自多个TCP连结的数据包,当队列满时,会导致多个TCP连接丢包,进而引起吞吐率的下降。
但是对于Fast这类采用基于延迟拥塞控制的TCP协议而言,它并不会在路由器的队列里塞过多的包,这样路由器上丢包的可能性会大大降低。
根据Fast的模拟结果,当网络中采用Pacing的TCP从0增加到100%时,Pacing TCP和非Pacing TCP的吞吐率都是单调增加的。并且在某个点上,所有TCP的吞吐率都高于未加入Pacing TCP之前的吞吐率。
Fast在Sun的Solaris 10中被采用,据评测是最快的TCP协议(跨洲际的大文件传输测试)。