1

这里获取状态驱动代码:

# 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)。

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

谢谢

4

1 回答 1

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 个 ACK​​S 下一次将是执行 4 次

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

多姆

于 2019-10-09T05:26:38.530 回答