Congestion control
Este un algoritm executat independent pentru fiecare conexiune. Acesta ajustează CWND (Congestion Window) folosind feedback-ul din rețea (ACK-uri).
Algoritmul New RENO
Inițial slow_start_threshold are valoarea infinit.
- ON_ACK():
if(CWND < ssthresh) //slow-start CWND++; //creștere exponențială else //congestion avoidance CWND += 1/CWND;
- ON_LOSS():
CWND /= 2; ssthresh = CWND;
- ON_TIMEOUT():
ssthresh = CWND/2; CWND = 1;
Fairness (Chiu-Jain diagram)
Reprezintă un grafic în care apare CWND a doi senderi.
W (RTT) = o unitate pentru fiecare pachet
Pentru linerate avem:
- (BDP + BUFFER) / 2 >= BDP
- BUFFER >= BDP
Generez loss pentru a vedea ce capacitate am. Pentru echitabilitate(fairness) scad rata de transmisie, dar buffer-ul trebuie să fie foarte mare ca să nu pierd performanță.
BW = CWND * MSS / RTT
1 loss la w + w + 1 + ... + 2w pachete => w * 3w / 4 pachete transmise
p = 1 / (3 * w^2 / 4) => w^2 = 4 / 3p => w = √ (4 / 3p) <=> aceeași fereastră pentru ambii senderi; aceeași pierdere și același throughput
p * CWND = probabilitatea să pierd un pachet
∆ = (1 - p) * 1 - p * CWND * (CWND / 2), p ≈ 0
∆ = 0 => se scoate CWND
Exerciții:
-
B = 1 Gbps
S1, S2, RTT 10 ms
BS1, BS2 = ?
CWNDS1 = CWNDS2 = √ (2 / p) => BS1 = BS2 = √ (2 / p) * MSS / RTT
BS1 + BS2 = B -
Diferă RTT:
RTTS1 = 1 ms
RTTS2 = 10 ms
CWNDS1 = CWNDS2 = CWND = √ (2 / p) => BS1 = BS2 = √ (2 / p)
BS1 = CWND * MSS / 1ms (1)
BS2 = CWND * MSS / 10ms (2)
Din (1) și (2) => BS1 / BS2 = 10
RTT mic => B mai mare (trimite mai repede)
RTT = 1ms
C1 + C3 <= 1 Gbps
C2 + C3 <= 1 Gbps
C1 =
√ (2 / p1)
* MSS / RTT (1)
C2 =
√ (2 / p2)
* MSS / RTT (2)
C3 =
√ (2 / (p1 + p2))
* MSS / RTT (3)
Din (1), (2) și (3) => C1, C2 ≈
√ (2 / p)
;
C3 ≈
√ (1 / p)
=> C1 / C3 = C2 / C3 =
√ 2
=>
C3 * (
√ 2
+ 1) = 1 Gbps => C3 = 1000 Mbps / 2,41 => nu se împarte egal