UniTO/anno2/YearI/FirstSem/CR/lesson18-01122017.md
Francesco Mecca 5e286062f8 MCAD 2019
2018-11-22 13:09:11 +01:00

197 lines
9.1 KiB
Markdown

# Sistema di controllo in tempo continuo - TCP (continua)
*(vedi slides)*
Modellando un sistema in cui un mittente che invia un pacchetto tramite router AQM con probabilita' di perdita `p(t)`, si puo' analizzare lo scenario **singolo collo di bottiglia**, in cui supponiamo:
* singolo link congestionato di capacita' C
* N flussi TCP infiniti che attraversano il link (seguendo un path punto-punto)
*(slides per formule RTT e throughput B)*
## Router RED
Se il router congestinato e' gestito con RED, possiamo collegare la probabilita' di perdita con la lunghezza della coda. RED infatti scarta i pacchetti in arrivo in base alla lunghezza attuale della coda, calcolata con **media mobile esponenziale**.
**Ignorando timeouts e slow start**:
Possiamo quindi scrivere un'**ODE** che descriva la dimensione della finestra del router congestionato, di modo da ottenere un sistema di ODE che descriva la **lunghezza istantanea della coda**. *(slides per formule)*
Due ODE: una per la window size, una per la lughezza della coda.
### Window size
Le equazioni sono costruite sommando le componenti di *additive increase* e *multiplicative decrease*. Abbiamo due *rate*: uno che descrive la ricezione di ACKs (e quindi pacchetti non persi) che implicano additive increase, mentre il secondo rate e' dipendente da `p(t)` e indica i pacchetti persi (multiplicative decrease).
Ignorando i feedback delay, possiamo semplificare ulteriormente la ODE. *(vedi slides)*
### Lunghezza istantanea della coda
Come per la window size, anche la lughezza della coda e' pilotata da due componenti: **traffico in ingresso** e **traffico in uscita**. Il traffico in ingresso e' ottenuto **aggregando i flussi che mandano pacchetti su una stessa coda**.
## Risoluzione Equilibrio (comportamento a regime)
Il sistema di ODE e' pensato per studiare l'evoluzione nel tempo, ma e' molto utile studiare la soluzione di equilibrio (derivata == 0). Cosi' facendo, ci riconduciamo alla **sqare root formula.**
## Risoluzione transitorio
Non calcolata a mano ma con un risolutore, di seguito la descrizione del sistema ottenuto.
### Evoluzione della media mobile esponenziale
*(vedi slides)*
### Evoluzione della probabilita di perdita
*(vedi slides)* Si utilizza la **chain rule**, dove `dp/dx` e' il profilo di RED.
### Equazioni accoppiate
Ottenute tutte le equazioni di interesse, si ottengono N+2 equazioni accoppiate, che possono essere messe a sistema, per ottenere la lughezza istantanea e mediata della coda, da cui posso ottenere la probabilita' di perdita.
## Multipli colli di bottiglia
E' possibile studiare una rete fatta da multipli colli di bottiglia, creando sistemi di equazioni che descrivano i singoli router. Si puo' quindi calcolare la **probabilita di perdita totale** su un percorso e il **RTT totale**.
*(vedi slides per formule)*
## Accuratezza del modello
L'accuratezza del modello proposto e' studiata supponendo:
* Una serie di link non congestionati di capacita' elevata
* Un link congestionato con capacita' ridotta, alimentato dai link
* Simulando flussi tcp, dopo un certo tempo (30 sec) si introduce un guasto della rete in cui i flussi dimezzano. Questo permette di **studiare il transitorio dell'oggetto (router RED) a seconda delle variazioni di carico**.
* Plottando il modello fluido calcolato e il modello simulato, si nota un **accordo evidente tra i risultati misurati e quelli calcolati**.
Il risultato e':
* Il modello cattura la dimensione della finestra **media** con un accuratezza molto elevata, supponendo una popolazione **omogenea** di flussi.
## Proprieta' di scalamento del modello
*(nota: OC-12 rappresenta una banda fisica, OC-48 = OC-12 x 4*
Immaginando di moltiplicare la quantita' di flussi e le capacita' per una costante `j`, possiamo simulare una situazione di **scalamento**, la finestra media dei flussi rimane invariata:
```
Wk(t) = Wj,k(t) W = window size
Qv(t) = Qj,v(t)/j q = lunghezza coda
```
Questo permette di **garantire lo stesso throughput** sotto ipotesi di scalabilita', il che e' molto utile nel caso di sistemi troppo grandi da essere simulati. Posso quindi **simulare un sistema scalato verso il basso**, perche' so che scalando mantengo il throughput.
*Nota: se il router e' RED, e' necessario scalare anche il profilo RED.*
## Altre applicazioni
* Il modello e' estendibile al caso di **code drop tail**.
* Il modello e' utile prettamente per studiare la stabilita' e la taratura di RED.
* Il modello e' usato anche per studiare il fenomeno della congestione dal punto di vista controllistico.
### Semplificazione del sistema di ODE
Utile in futuro.
```
dW/dt = W/R (1/W - p*W/2)
```
# TCP CUBIC
Implementazione di default in Linux.
* E' caratterizzato da un **fattore di decrease multiplicativo** `beta`, che ad ogni perdita diminuisce la dimensione della finestra di `beta*W`.
* In assenza di perdite, TCP CUBIC utilizza un polinomio di terzo grado per **predire l'evoluzione della finestra**:
```
W = C(t - K)^3 + Wmax
Dove:
t = tempo misurato dall'ultima perdita
K = cubicroot(Wmax*beta/C)
C = parametro limitato dalla curva cubica, dove consideriamo un decrease di beta*W ottenendo:
Wmax*(1-beta) = -C*K^3 + Wmax
=> beta*Wmax = C*K^3
Da cui si puo' ottenere C e K
L'unico parametro libero e' dato da dopo quanto tempo il valore della finestra torna a quello iniziale.
```
*(slides per plot)*
L'implementazione di TCP CUBIC e' migliore del modello *classico* a dente di sega perche', mentre nel modello classico il tempo di ritorno al valore precedente e' dipendente da W e RTT, in TCP CUBIC e' un parametro libero.
# Problematiche di TCP standard: scenario ad alte prestazioni
Considerando una singola connessione TCP standard con un throughput atteso altissimo (x Gbps), *(vedi slides)* scopriamo che TCP standard richiede una finestra media di congestione di 83333 segmenti.
Dato che la durata del dente di sega dipende dalla finestra media, otteniamo (applicando la square root formula) che la durata del dente di sega e' ~ di 1 ora e 40 minuti, a cui poi segue una nuova perdita (e quindi il ciclo ricomincia).
La quantita richiesta di tempo e' **troppa** per uno scenario ad alte prestazioni, perche' una grande quantita' di tempo e' passata con una window size sottodimensionata.
Il tempo T tra due segnali di congestione e' infatti proporzionale al throughput e RTT:
```
T = B*R^2 / c^2
```
Quindi: **throughput alto, tempo maggiore per la crescita della finestra**, rallentando le dinamiche di TCP.
**TCP non scala in scenari di altissimo throughput**.
*(vedi slides per calcoli, quella scritta a mano definita back-of-the-envelope computations*)
## Soluzione al problema
C'e' un ampio spettro di soluzioni:
* Apertura di **N connessioni TCP in parallelo**, ma richiede un middleware di divisione / riassemblaggio dei dati complicatissimo
* Uso di **MulTCP**, una singola connessione che ottiene un comportamento simile a multiple connessioni TCP virtuali. Questo implica una decrescita di `b*W`, con `b < 1/2`. L'idea e' di **rendere TCP piu' aggressivo**, limitando la decrescita del dente di sega.
Per migliorare la decrescita, si puo' calcolare la W partendo dalla ODE semplificata vista in precedenza. *(vedi slides)*
Altre soluzioni:
### Soluzioni a basso costo implementativo (cambiamenti marginali)
#### Highspeed TCP (TCP con parametri modificati)
Utilizza un additive increase, multiplicative decrease ma **gli incrementi e i decrementi dipendono dalla window size**. I cambiamenti sono segnati come parametri di una tabella, inclusa nell'implementazione di TCP.
Plottando il sending rate sul loss rate, vediamo che Highspeed TCP utilizza una pendenza modificata (0.15/p^0.82) rispetto alla pendenza di standard TCP ( 1.22/p^0.5)
Scalable TCP *(slides)* e CUBIC TCP utilizzano una pendenza ancora migliore *(vedi plot)*.
#### Scalable TCP (TCP con multiplicative increase)
L'utilizzo di multiplicative increase, multiplicative decrease:
```
W = W+a // per ogni ACK -> crescita geometrica se si considerano i RTT
W = W-b*W // per finestra di cui si rileva la perdita
```
Si nota che questo multiplicative increase, il tempo tra due segnali di perdita (aka durata del dente di sega) **non dipende piu' dal throughput**:
```
B = a/(R*b*p) => T = (b*R) / a
Questo risultato e' ottenuto a partire dall'ODE semplificata, ponendo la soluzione di equilibrio (quindi con la derivata nulla).
```
*(vedi slides per grafici di prestazioni di STCP)*
Scalable TCP e' stato creato nei primi 2000 ma non ha avuto una grossa considerazione. In compenso, **TCP CUBIC** ha utilizzato il suo stesso concetto di scalabilita'.
### TCP CUBIC: scalabilita'
Utilizzando una curva cubica, TCP CUBIC e' in grado di migliorare Scalable TCP (che invece sale esponenzialmente al punto di congestione), mantenendo comunque un **throughput proporzionale a** `1/p`.
Il miglioramento di Scalable TCP e' dovuto proprio alla stabilita' di una curva cubica (migliore fairness, migliore scalabilita') rispetto a una curva esponenziale, che si rivela molto piu' aggressiva.
### Altre soluzioni
* Protocolli di congestione **delay-based**, studiando il RTT posso regolare la finestra (TCP FAST, TCP VEGAS).
* Controllo di congestione supportato dai router: **XCP**.