Bandwidth vs TCPWindowSize

Tags: CCNP

Bandwidth vs TCPWindowSize ovvero la lunga storia della banda larga e della latenza

Bandwidth_tcp_windowsize
Ormai non passa giorno in cui non riceva una nuova offerta commerciale da parte di un operatore fisso o mobile: sconti, nuovi piani tariffari e servizi da ultimo grido sono solo alcuni tra gli argomenti su cui fanno leva per incentivare il sottoscritto all’acquisto.

Ma il vero specchietto per le allodole è sempre il solito: la banda!

Non si contano le offerte ad alta velocità FttC FttH dove vengono millantati 50 o addirittura 100 Mbit/s.
E sapete la novità? Questi valori sono reali! Il last mile a “centomega” è ormai realtà e gli operatori offrono davvero la banda riportata nel contratto.


E allora dove sta l’inganno?

Dunque – ricordate a cosa serve la TCP WindowSize ?
La WindowSize indica il numero di bytes che posso inviare al mio interlocutore, prima di aspettare la ricezione di un ACK.

Di conseguenza l’efficienza TCP dipende dal RoundTripTime (RTT) che, a sua volta, non è subordinato solo all’ampiezza di banda, bensì alla latenza, ovvero al tempo impiegato dai nostri bit per giungere a destinazione e viceversa.
Il traffico web utilizza come protocollo di trasporto TCP e quest’ultimo, durante la three-way-handshake, negozia il WindowScale.

La WinScale è il valore in cui viene moltiplicata la WindowSize predefinita dal nostro sistema operativo a 65536 Bytes.
Per cui, in teoria, potremmo concordare col nostro server una WindowSize superiore al parametro di default e aumentare così il throughput effettivo.
La parte divertente è che con un paio di conti possiamo verificare il nostro limite reale in termini di bandwidth.

Come prima cosa determiniamo il nostro average RTT verso internet (ho utilizzato i Google DNS per comodità)

C:\Users\mmalvica>ping -n 10 8.8.8.8
Pinging 8.8.8.8 with 32 bytes of data:
Reply from 8.8.8.8: bytes=32 time=42ms TTL=39
Ping statistics for 8.8.8.8:
Packets: Sent = 10, Received = 10, Lost = 0 (0% loss)
Approximate round trip times in milli-seconds:
Minimum = 40ms, Maximum = 43ms,
Average = 41ms

41 ms = 0.041 secondi

A questo punto possiamo utilizzare la formula:

TCP WindowSize in bits
___________________ =  Bits per second throughput
 Latency in seconds

Applicando il valore di default di WindowSize e convertendolo da bytes a bits.

(65536)*8
_________ = 12787512
 0.041

Scopriamo dunque che la banda massima è inferiore a 13 Mbit/s – un bel collo di bottiglia rispetto ai 100 Mbit/s del nostro last mile.

A questo punto è il WindowScaling a venirci in soccorso, permettendoci di ottenere valori di banda multipli al default.
Tutto questo è però dipendente dall’ implementazione del DynamicWindowScaling sia sul nostro device che sul server con cui abbiamo stabilito la sessione TCP.
Possiamo quindi catturare con Wireshark alcuni minuti di navigazione http e filtrare il traffico con:

tcp.options.wscale.shift == x (dove x è il numero di bit definiti dal moltiplicatore . Es. se x=3 avremo un valore 8 volte la WS).

Abbiamo così un campione di traffico da cui possiamo estrapolare i valori medi di throughput della nostra connessione.

That’s all folks!