Bandwidth vs TCPWindowSize ovvero la lunga storia della banda larga e della latenza
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!