- 论坛徽章:
- 1
|
回复 #17 eexplorer 的帖子
感谢eexplorer的说明,其实我一直对tcp的拥塞控制原理缺乏真正清晰的认识,反复看了几遍和拥塞控制相关的rfc文档,我发觉自己还是糊涂,所以希望eexplorer能进一步帮我指正,下面我先描述下我的问题:(均以我在此帖中举出的S1,S2,S3分段丢失为例)
1、因重传超时定时器到时所引发的分段丢失事件,将怎样导致发送方进行重传和恢复? 具体说就是重发丢失分段后能否继续发送新分段?
2、因连续收到3个重复ACKs所引发的分段丢失事件,将怎样导致发送方进行重传和恢复? 具体说就是重发丢失分段后能否继续发送新分段?
3、为啥在无SACK支持下,存在如下一个由FF96文献所描述的固有性能低下问题,描述如下:
-----------------------------------------------------
[FF96]-- Simulation-based Comparisons of Tahoe, Reno, and SACK TCP
In the absence of SACK, both Reno and New-Reno senders can retransmit at most one dropped packet per round-trip time, even if senders recover from multiple drops in a window of data without waiting for a retransmit timeout.
>> 译文:在无SACK下,Reno和New-Reno发送方在每个RTT时间内,只能重发一个丢失的分段,即便发送方从一个窗口内有多个分段丢失情况下进行恢复时,不需要等待超时重发定时器到时。
上文说明了,如果一个窗口内有多个分段丢失,效率就很低下了,理想情况是能在一个RTT内尽量重发出多个丢失分段,而不是每次必须等待一个RTT才能重发一个丢失分段。 相反,若一个窗口内只有一个分段丢失,则反正只有一个丢失的,因此在一个RTT内重发一个就不会有性能问题了
-----------------------------------------------------
目前我参考了rfc2001, rfc2581, rfc2582,[FF96]中关于拥塞控制部分的描述,但是看完这些资料后,我自己忽然发觉更加昏了,落实到具体的慢启动,拥塞避免,快速重传/快速恢复算法描述中时(rfc2001, rfc2581,rfc2582),我始终无法完全确认如下两个问题:
a、重发丢失分段后(分两种情况,超时重发,3-dup ACKs),到底能否立刻发送下一新分段?
b、为啥在一个窗口中有多个分段丢失时,TCP存在性能问题,FF96中我不能理解体现上述缺陷的描述。
总之,我感觉我现在没有理解的根本原因就是,在收到连续3个重复ACKs,或者超时重发到时后,具体的处理细节到底怎样的,我始终没有真正掌握,希望大家能帮我解答,谢谢!
作为一个对照,请看eexplorer的解释(造成我发晕的一个原因)
>> 一旦发生retrans timeout的话,tcp立即进入loss状态,所有从snd_una -> high_seq之间的包都会被认为是丢失了。然后tcp把cwnd设成1,使用slow start重发所有>>丢失的包。也就是说,假设S1 timeout了,TCP先发S1,收到ack后,cwnd加1,然后发送S2, S3。
这里eexplorer说明了在重发S1后,需要等待该重发ack到来后,cwnd+1,然后才能发送S2, S3,但是在那几个rfc文档中我似乎没有看到需要等待重发分段到达后才能发新数据的描述,如下面文档的描述
另外,在“TCP and Successive Fast Retransmits”一文中(FF96的作者的另外一篇文章)有如下一段描述:
With Reno implementations, the source essentially assumes that only one packet has been dropped, retransmits that dropped packet, and instead of waiting for the ACK to be received, continues transmitted new packets.
显然此文表示了Reno算法在重发丢失分段后,并不是立刻停下来等待此丢失分段的ACK,而是可以继续发送新分段
还有在rfc2581中有如下描述:
----------------------------------------
1. When the third duplicate ACK is received, set 【ssthresh】 to no more
than the value given in equation 3.
>> 注意,此时没有发生重传超时事件,仅3个连续重复ACKs到来事件发生
2. 【Retransmit】 the lost segment and set 【cwnd】to ssthresh plus 3*SMSS.
This artificially "inflates" the congestion window by the number
of segments (three) that have left the network and which the
receiver has buffered.
>> 重发丢失分段,并且修改cwnd=ssthresh+3*SMSS(此时显然cwnd不为0,即允许发送端继续发送新数据,对比下面步骤4)
3. For each additional 【duplicate】 ACK received, 【increment】cwnd by
SMSS. This artificially inflates the congestion window in order
to reflect the additional segment that has 【left】the network.
>> 这些额外的仍然重复的ACK是因为在进入快速重发前发送方仍然在发送新的分段, 并且这些分段正确到达了接收方,此时可以增加cwnd
4. 【Transmit】a segment, if allowed by the new value of cwnd and the
receiver's advertised window.
>> 注意上述2,3,4步骤的顺序,即首先立刻重发,然后每收到一个重复ACK,就增加cwnd一个SMSS单位,此时可以发送新的分段(如果cwnd和rwnd允许的话)
显然步骤4中发送新分段并不需要等待重发分段的ACK的到来,并且步骤4和步骤3之间也无前后顺序关系
5. When the next ACK arrives that acknowledges 【new】 data, set cwnd to
ssthresh (the value set in step 1). This is termed "deflating"
the window.
>> 当上述第2步重发分段到达接收方后,接收方才能确认新的数据
-----------------------------------------------------------------
所以我现在很晕,望大家不吝赐教,待我彻底清楚后,写一个总结帖来回报大家的帮助,谢谢!
PS:
为了便于大家阅读,我上传了附件FF96
[ 本帖最后由 jiufei19 于 2009-10-2 17:06 编辑 ] |
|