Уравнения окна перегрузки TCP при медленном старте
Взяв код, управляемый государством, отсюда:
# 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 = cwnd + MSS". Мне трудно понять, как это экспоненциальное линейное изменение, когда это просто линейное увеличение.
Я также не понимаю математику "cwnd = cwnd+ mss*(mss/cwnd)". Предполагается, что cwnd увеличивается линейно, как эта формула достигает этого результата, когда она больше похожа на квадратную прогрессию (mss^2/cwnd).
Я немного запутался в том, как эти вычисления выполняют описанные задачи. Кто-нибудь может объяснить, как они это делают?
Спасибо
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 ACKS, и в следующий раз будет выполнено 4 раза
Вот почему это экспоненциально. Надеюсь, это будет полезно.
Дом