Webpagetest utilizza Dummynet per il traffico che modella la connessione (solo l'ultimo miglio però). Dummynet è stato originariamente costruito per testare i protocolli di rete e svolge un ottimo lavoro nella costruzione di una rete virtuale che si comporta come il mondo reale ed è praticamente lo standard di riferimento per il traffic shaping (che include iniezione di latenza, ottimizzazione della larghezza di banda e perdita di pacet). Era originariamente parte di BSD ma da allora è stato portato su Linux e Windows ed è anche utilizzato da Apple per lo strumento di traffic sha per Mac in XCode.
Dummynet funziona a livello di pacchetto e ti consente di costruire "pipe" arbitrarie per i pacchetti da passare (e puoi anche concatenarli insieme). Assegnate a ciascuna di queste pipe una latenza, larghezza di banda, perdita di pacchetti e dimensione del buffer. I pacchetti vengono aggiunti alle pipe in base alle regole che si definiscono (regole di corrispondenza dei pacchetti ipfw) e se il buffer di una pipe è pieno il pacchetto verrà rilasciato (come nei router del mondo reale). A intervalli regolari (dipende dall'impostazione del kernel Hz ma è meglio se è 1ms o più veloce), Dummynet controlla ogni pipe per vedere se i pacchetti dovrebbero uscire (se sono stati in attesa abbastanza a lungo e se lasciare che il pacchetto rimanga sotto il configurato limite di larghezza di banda).
Nel caso di Webpagetest, sono configurate 2 pipe. Uno per i pacchetti in uscita e uno per i pacchetti in entrata con la larghezza di banda appropriata su ciascuno e la latenza viene divisa tra di loro (25 ms in ogni direzione per la configurazione DSL 50 ms predefinita).
È importante simulare solo l'ultimo miglio del collegamento perché la rete diventa DAVVERO complicata oltre a quella a meno che tutti i tuoi contenuti provengano da un singolo server (i CDN e i contenuti di terze parti di solito provengono da percorsi diversi). Teoricamente potresti costruire una simulazione completa in dummynet ma sarebbe un bel casino.
Plugin come Charles si avvicinano il più possibile dal livello dell'applicazione. Generalmente useranno una logica simile ma la applicheranno durante la scrittura dei dati sulla connessione TCP. A seconda di come il tuo browser effettua le connessioni al plug-in e di come quel plugin rende le connessioni con il mondo esterno, i risultati potrebbero essere diversi da quelli che vedresti applicandoli a livello di pacchetto. È un'approssimazione ragionevole, ma consiglio vivamente di utilizzare un simulatore a livello di pacchetto quando possibile.