缓慢启动的TCP拥塞窗口方程

时间:2017-02-27 15:21:20

标签: networking tcp congestion-control

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

有一些我不明白的事情。

  1. 如何用“cwnd = cwnd + MSS”将cwnd“指数地”加倍。当它只是一个线性增量时,我很难理解这是一个指数斜坡。

  2. 我也不明白“cwnd = cwnd + mss *(mss / cwnd)”背后的数学。 cwnd应该线性增加,当它看起来更像是一个方形进展(mss ^ 2 / cwnd)时,这个公式如何实现这个结果。

  3. 我对这些计算如何执行所描述的任务感到困惑。谁能解释一下他们是怎么做的?

    由于

1 个答案:

答案 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