【问题标题】:TCP congestion window equations on slow-start慢启动 TCP 拥塞窗口方程
【发布时间】:2017-02-27 15:21:19
【问题描述】:

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 = cwnd + MSS”“指数地”加倍。当它只是一个线性增量时,我很难理解这是一个指数斜坡。

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

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

谢谢

【问题讨论】:

    标签: networking tcp congestion-control


    【解决方案1】:

    你是对的,如果你只执行一个公式 cwnd = cwnd + MSS 这不是指数的

    但关键是:你执行了多少次代码? 答案是“在每次 ack 到达时”

    所以首先 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 个 ACK​​S 并且下次会执行 4 次

    这就是为什么这是指数级的 希望这会有用

    Dom

    【讨论】:

      猜你喜欢
      • 2013-04-21
      • 2013-09-19
      • 1970-01-01
      • 1970-01-01
      • 2011-06-30
      • 1970-01-01
      • 2018-01-03
      • 2011-02-12
      • 2012-07-18
      相关资源
      最近更新 更多