@(计算机网络)
在普通的拥塞控制算法中,我们总是粗粒度的关注每个RTT拥塞窗口的变化,比如初始报文段MSS = 1KB,在慢开始阶段增长规律是1→2→4→8...1\rightarrow 2\rightarrow 4 \rightarrow 8...1→2→4→8...
这种指数级增长的规律用着很简洁。但是直到刚刚为止我才意识到为什么是指数级,以及cwnd是如何增长的。
很多题目中告知的是对每一个段进行确认,注意是每一个段。那么确认的时候,一定告诉了当前rwnd的大小,那么这个时刻的cwnd增长不是粗粒度,而是每收到一个确认,cwnd就加一个MSS.
数据链路层的RTT是往返时延,而TCP中的RTT是一个传输轮次。就是当前发送窗口全部发出并全部得到确认。
因此,假设当前发送窗口是4,那么全部发出再全部确认,且此时还是在慢开始阶段,就意味着一个RTT后,发送窗口大小是8.
具体过程是这样的:
所以一个比较细致的过程是对一个MSS一个MSS增长的。
而达到门限值时,一个RTT才增长一个MSS,就不是每收到一个段的确认就加一个MSS那么快了。
分析一道题目:
(2016.41)H3与主机S建立TCP连接,S的接收缓存是20KB,S对每个收到的段进行确认,并通告新的接收窗口(rwnd)。最大段长MSS = 1KB,平均往返时间RTT = 200ms。H3持续以MSS大小的段向S发送数据。拥塞窗口初始值阈值是32KB。S的接收缓存的数据只输入不取出。
(2)H3在收到第8个确认帧时,所通告的接收窗口是多少?此时H3的拥塞窗口是多少?H3的发送窗口是多少?
分析:先只关注这个题目。
如果只是粗粒度的掌握cwnd
的变化曲线,那么这个问题将会陷入死胡同。只有理解到cwnd
一个MSS
一个MSS
的增长时,才能精确解出。
这里初始时发送1KB
,接收缓存收到后,确认帧告知H3: rwnd = 19
.
一个RTT
后发送2KB
,接收缓存收到后,确认帧告知H3: rwnd = 17
.
两个RTT
后发送4KB
,接收缓存收到后,确认帧告知H3: rwnd = 13
.
注意下一次就不是以一个发送轮次计算了,因为现在接收缓存已经收到了7KB
,且发送了7个确认。7个确认帧回来,每回来一个cwnd+1
,回来7个就+7。当第8个段发过去时cwnd = 8,接收缓存收到第8个段并存起来,rwnd = 12,第8个确认帧发回到H3,cwnd又加1,变为9.
当然也可以直接说,每确认一个段就加1,因此8个段都确认了,就是cwnd = 1+8 = 9KB.
而发送窗口 = min(cwnd, rwnd) = min(12KB, 9KB) = 9KB
.
题目会往更加细节的地步考察,因此只掌握大概的理论就是半瓶子醋,根本没用。需要仔细拓展,深化知识点间的关系。
2016.12.12 update:
看到之前挖了一个坑,待解决的问题现在补充说明。
之前说**TCP
中的RTT
不同于数据链路层的RTT
**,确实定义不同,但也不是差别特别大。至少都是往返时延,都是对时间的计量。
TCP中的往返时延是:记录每个报文段发出的时间以及收到相应的确认报文段的时间。两个时间差就是报文段的往返时延。
而将每个报文段的往返时延加权平均,就可以得出报文段的平均往返时延。之所以要计算平均值,是因为TCP架构在互联网环境下,RTT的变化范围比较大,所以采用平均的方式会更加具有适应性。
而计算公式有一个常见的:RTT=(1−α)RTT旧+αRTT新RTT = (1-\alpha)RTT_旧+\alpha RTT_新RTT=(1−α)RTT旧+αRTT新
这个RTT也是作为RTO(超时计时器重传时间)的比较标准,RTO取的略大于RTT即可。
特别需要补充的是,对传输轮次的理解。在慢开始阶段,就是指数增长阶段,每经过一个传输轮次,拥塞窗口cwnd就加倍。这个我们非常熟悉了。详细一点,上面提到了,TCP对每一个段进行确认。所以增长并不是说,以RTT为一个时间单位跳动,而是离散但是近似连续的增长。而根据RTT的定义,是发送一个报文段开始计时到收到对这个报文段的确认。如果按照这个推演,可以想到,发送窗口中的一个报文段,按下秒表,再等到它的确认回来时,按住表,得到一个时间差。这个按照定义是RTT。在等待它的确认报文段的过程中,发送窗口中的剩下的报文也陆续出发了,假设这个陆续出发消耗一定的时间,那么等到最后一个确认报文段回来时,表示这轮才传输结束时,总的经历时间其实已经大于RTT了。But,根据很多书上的定义:
一个传输轮次所经历的时间其实就是往返时间RTT。
但我们知道,这其实绝不是个等号,最多是个近似值。如果连续发送耗时极短,则发送第一个报文和最后一个报文段时间忽略不计,那么第一个报文到达目的地时,第二个报文段也是紧随其后,这样,“几乎”可以认为一个传输轮次用时等于RTT了。
更严格的推导我还没怎么见过,但是如果认为一个传输轮次就是一个RTT也更能简化问题。
END.