Взяв управляемый состоянием код из здесь:
# 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).
Меня немного смущает, как эти вычисления выполняют описанные задачи. Может ли кто-нибудь объяснить, как они это делают?
Спасибо