分类: LINUX
2013-01-22 21:40:38
先举两个事实:
1.TCP的发送窗口是一个滑动窗口,详见《TCP/IP详解:卷一》,成块数据流一章
2.TCP的发送窗口在Linux中的实现,称为tp->snd_cwnd,也就是发送端的拥塞窗口
(这里先不讨论接收端的通告窗口)
对初学者带来的问题是,cwnd每隔一个RTT增加一倍,这个说法很容易给人带来误解,以为窗口是分解不连续的,因而存在窗尾的概念。这样的理解与滑动窗口的连续性是矛盾的。因为滑动窗口是随时间改变的连续函数,每接收一个ACK,窗口就应该增加1。
举个例子来详说:
称前一个rtt的发送窗口为cwnd1,第二个rtt的发送窗口为cwnd2,按照初学者的理解,一般会认为,两个窗口之间必须间隔一个rtt,上一个窗口最后的ACK返回,下一个窗口才能发生,这样是不对的,最直观的反证就是cwnd的增长曲线是连续函数,而非分段函数。
实际的增长过程,并没有“窗间”的概念,因为窗口是连续增长,一直有新的包入队列,同时有包出队列。cwnd每隔一个RTT增长一倍,这个说法,应该理解成,每收到一个ACK,窗口就递增,如果不丢包,中间不间断。
滑动窗口这个概念,最早见于链路层流量控制,后来在TCP层和拥塞窗口一起实现。在NS2中,使用trace文件观察到的包发送过程往往不是连续,但不连续并不能说明这些包处在单独窗口内,只是出队列的时间有先后而已。
滑动窗口在TCP理解中,至关重要,这对于分析拥塞窗口初始值调整带来的问题,也很重要。