从here获取状态驱动的代码:
# Initialization
cwnd = MSS # congestion window in bytes
ssthresh= swin # in bytes
# Ack arrival
if tcp.ack > snd.una : # new ack, no congestion
if cwnd < ssthresh :
# slow-start : increase quickly cwnd
# double cwnd every rtt
cwnd = cwnd + MSS
else:
# congestion avoidance : increase slowly cwnd
# increase cwnd by one mss every rtt
cwnd = cwnd+ mss*(mss/cwnd)
else: # duplicate or old ack
if tcp.ack==snd.una: # duplicate acknowledgement
dupacks++
if dupacks==3:
retransmitsegment(snd.una)
ssthresh=max(cwnd/2,2*MSS)
cwnd=ssthresh
else: # ack for old segment, ignored
dupacks=0
Expiration of the retransmission timer:
send(snd.una) # retransmit first lost segment
sshtresh=max(cwnd/2,2*MSS)
cwnd=MSS
有一些我不明白的事情。
如何用“cwnd = cwnd + MSS”将cwnd“指数地”加倍。当它只是一个线性增量时,我很难理解这是一个指数斜坡。
我也不明白“cwnd = cwnd + mss *(mss / cwnd)”背后的数学。 cwnd应该线性增加,当它看起来更像是一个方形进展(mss ^ 2 / cwnd)时,这个公式如何实现这个结果。
我对这些计算如何执行所描述的任务感到困惑。谁能解释一下他们是怎么做的?
由于
答案 0 :(得分:0)
您是对的,如果您执行公式,只需执行一个 cwnd = cwnd + MSS 这不是指数的
但是关键是:您执行代码多少次? 答案是“每次确认到达”
所以第一个cwnd = 1(MSS)
下次执行代码时,您收到1个ACK(对应于第一个MSS),因此现在cwnd = 1+ 1 = 2(MSS)因此,在此步骤中,您发送2个MSS,因此您将收到2个ACK >
因此,下次您执行两次代码 cwnd = 2 + 1 = 3 cwnd = 3 +1 = 4 因此,在第2步cwnd = 4时,您将发送4个MSS,因此下次执行4次时,您将收到4个ACKS响应
这就是为什么这是指数的 希望这会有用
Dom