In termini TCP / IP, come funziona un limitatore di velocità di download in un ufficio?


8

Supponiamo che un ufficio di persone voglia limitare i download HTTP a una larghezza di banda massima del 40% della velocità della loro connessione Internet in modo da non bloccare altro traffico.

Diciamo "non è supportato nel tuo firewall" e dicono l'inevitabile linea "eravamo abituati a farlo con il nostro Netgear / DLink / DrayTek".

A pensarci bene, un download è così:

HTTP GET request
Server sends file data as TCP packets
Client acknowledges receipt of TCP packets
Repeat until download finished.

La velocità è determinata dalla velocità con cui il server ti invia i dati e dalla velocità con cui li riconosci.

Quindi, per limitare la velocità di download, hai due possibilità:

1) Indica al server di inviarti i dati più lentamente - e non credo che ci sia alcuna funzione di protocollo per richiederlo in TCP o HTTP.

2) Riconoscere i pacchetti più lentamente limitando la velocità di upload e anche rovinando la velocità di upload.

Come fanno i dispositivi a limitare questo? C'è un modo standard?


La velocità che limita la velocità di trasmissione dei pacchetti ricevuti dal firewall sulla LAN provoca riconoscimenti più lenti e la gestione della congestione nello stack TCP del server di invio riduce la velocità di invio. Grazie. Posso farlo funzionare così con tessitura. Ho valutato diverse risposte, ma posso solo segnarne una come risposta.
TessellatingHeckler,

Risposte:


11

TCP stesso implementa il controllo della congestione.

Questi limitatori di velocità semplicemente gettano i pacchetti oltre il limite. TCP lo gestisce, garantendo che tutti i pacchetti arrivino e arrivino tutti in ordine; il client non ACK per i pacchetti rilasciati e vengono rinviati dal server.

Lo stack TCP del server rinvierà i pacchetti e comporterà anche un po 'di arretramento sulla sua velocità di invio perché indica che c'è congestione tra esso e il client. Accelererà fino a quando il limitatore di velocità non rilascerà nuovamente i pacchetti e così via.


Quindi dovrei applicare una tariffa QoS che limiti la velocità con cui il firewall sputa il traffico HTTP sull'interfaccia / LAN /? E poi lascia che TCP lo gestisca. "comporterà anche un po 'di arretramento sulla velocità di invio" è un'altra parte che mi mancava.
TessellatingHeckler,

2
Sì, esatto. Il server potrebbe semplicemente continuare a lanciare dati sul tuo link, saturandoli prima dell'applicazione del QoS - ma, fintanto che è un buon cittadino TCP, la sua velocità di invio stabilirà un equilibrio approssimativo con la velocità con cui i suoi dati stanno effettivamente attraversando il limitazione della velocità.
Shane Madden,

Sì, TCP implementa il proprio controllo della congestione, ma non è necessariamente così efficace. Chiunque abbia esperienza con i torrent lo sa. Fondamentalmente, la maggior parte delle implementazioni del controllo della congestione TCP si interrompe quando ci sono centinaia di connessioni attive sulla rete.
user606723

1
@ user606723 Se i torrent rappresentano un problema, è necessario utilizzare uno shaper di pacchetti all'uscita per eliminare quel traffico. Ciò interromperà il torrenter dal tracker e impedirà ad altre persone di scaricare lo stesso torrent di inondare il tuo ingresso con connessioni. Problema risolto.
MDMarra,

1
@ user606723 Perché sì, il controllo della congestione avrà una lotta in salita quando migliaia di connessioni vengono avviate continuamente con TCP ad avvio rapido, poiché le nuove connessioni non sanno nulla dello stato della connessione che stanno costruendo. Centinaia di connessioni attive, però? Forse questo impantanerà un collegamento domestico lento ..
Shane Madden,

5

La migliore descrizione che io abbia mai sentito dire che aveva senso del metodo di limitazione intrinseca di TCP era fuori da un recente podcast di Security Now . Per citare Steve Gibson:

Quindi, di comune accordo, essendo TCP un protocollo molto intelligente, fa qualcosa chiamato "avvio lento". In genere viene concesso il permesso di inviare un numero di pacchetti senza conferma. Quindi l'idea è, facciamo solo muovere le cose qui. E in genere quel numero è due. E così quando TCP si avvia, può inviare due pacchetti, uno dopo l'altro. Senza il primo riconoscimento, verrà inviato il secondo. Ma poi aspetta. E quindi la regola per la limitazione è consentire al numero di pacchetti non riconosciuti di aumentare di uno per ogni riconoscimento ricevuto.

Quindi pensiamo a quello. Consentiamo di aumentare il numero di pacchetti non riconosciuti di uno per ogni riconoscimento ricevuto. Quindi per prima cosa spediamo due pacchetti come il nostro inizio concordato. Vengono riconosciuti. Quindi abbiamo il nostro primo riconoscimento. Ci stavamo concedendo di inviarne due. Ora, con la ricezione di questo primo riconoscimento, lo aumentiamo di uno a tre. Quindi ora possiamo inviare altri tre pacchetti senza ulteriori conferme. Quando viene restituito un riconoscimento per tutto ciò che abbiamo inviato in precedenza, lo aumentiamo a quattro. Questa è nota come "finestra di congestione". Non è una finestra mai inviata sulla linea, cioè non è come la finestra di ricezione, che è 16 bit dell'intestazione TCP che ci dice quanti dati siamo in grado di inviare in anticipo. Questo è - è una finestra. E'

Se continuiamo ad aumentare il numero di pacchetti non riconosciuti che possiamo inviare da uno ogni volta che riceviamo un riconoscimento, ad un certo punto raggiungeremo un limite. E la bellezza di questo sistema è che, quando inizieremo a provare a inviare pacchetti più velocemente del collegamento più debole, collegherò letteralmente, tra router, a un certo punto troviamo il punto in cui si rompe il collegamento più debole. Rilascia i pacchetti che stiamo cercando di inviare perché stiamo cercando di inviarli troppo velocemente. Quindi i riconoscimenti dall'altra parte si interrompono perché i dati non vengono più trasmessi.

E quello che fa TCP è, se non è riuscito a ricevere - e questo varia nelle strategie. Nel corso del tempo, la strategia, l'attuale strategia di prevenzione della congestione è variata molto. Ci sono nomi come Tahoe e Reno, e un sacco di altri che vedrai se fai qualche googling e Wikipedia, che specificano esattamente quale sia il comportamento. Ma l'idea è che, quando il mittente si rende conto che i suoi dati non vengono più trasmessi perché manca di riconoscimenti, riduce rapidamente la sua velocità di invio. In genere, lo divide a metà. Quindi lo ridimensiona drasticamente, e poi torna ad aumentarlo.

Quindi, in sostanza, ciò significa che la perdita dei pacchetti è la funzione di segnalazione per "Non è possibile inviare i dati più velocemente" e che i mittenti TCP alle estremità di una connessione, su Internet, sono sempre una specie di - loro " stai cercando di andare più veloce della velocità massima disponibile tra i due endpoint, ovvero il collegamento più debole, ovunque si trovi, e lo spingono sempre al limite. Quindi, dato che esiste un punto più debole della loro capacità di inviare pacchetti, lo troveranno perché pomperanno i pacchetti. Fintanto che ci sono dati da inviare e hanno una connessione ad alta larghezza di banda, il mittente aumenterà la velocità di invio, ovvero il numero di pacchetti in sospeso, i pacchetti che possono essere disponibili al volo come riconoscimenti ritorno, continua a spostare aggressivamente quel numero verso l'alto fino a quando non lo spinge troppo lontano. Quindi indietreggia molto e poi si sposta di nuovo in avanti.

Quindi questo è ciò che sta realmente accadendo tra le connessioni TCP che, come, probabilmente, non so quale percentuale, ma la percentuale enormemente maggiore di traffico su Internet avviene attraverso le connessioni TCP. Tutti i nostri sistemi operativi nel kernel, nel cosiddetto stack TCP, hanno questi contatori. E quando inviamo un file, quando stiamo caricando un file di grandi dimensioni o stiamo ricevendo una pagina Web, il server all'altro capo fa la stessa cosa. Spinge, su una base di connessione individuale, il maggior numero di pacchetti che non sono stati ancora riconosciuti come possibile, aumentando la velocità dei pacchetti fino a raggiungere il punto in cui inizia a fallire o balbettare. Quindi si arresta, per consentire in qualche modo di ripristinare le cose, quindi ricomincia a funzionare.

E così finisce per essere una sorta di sistema auto-strozzante che, dati i vincoli, voglio dire, sembra davvero un po 'funky e rozzo. "


3

Quindi, per limitare la velocità di download, hai due possibilità:

1) Indica al server di inviarti i dati più lentamente - e non credo che ci sia alcuna funzione di protocollo per richiederlo in TCP o HTTP.

2) Riconoscere i pacchetti più lentamente limitando la velocità di upload e anche rovinando la velocità di upload.

3) Il dispositivo router / firewall inserisce i dati in arrivo in un bucket QoS e svuota quel bucket solo alla velocità richiesta. I dati in arrivo si adatteranno a quella velocità poiché i computer interni vedranno solo la ricevuta di conferma a quella velocità. Inoltre, il pacchetto saltato occasionalmente (intenzionalmente) funziona davvero bene per rallentare una connessione.

Quando si tenta di trovare un dispositivo in grado di gestirlo, cercare QoS (Qualità del servizio) nella configurazione / documentazione. Anche le scatole Linux (o BSD) sono utili per questo.


Questo ha quasi senso - quindi la tecnica è limitare il tasso di riconoscimenti e farlo fingendo al dispositivo LAN che il server sta inviando più lentamente di quanto non sia in realtà? Quindi ci sarà uno scoppio che riempie la connessione all'inizio, poi non dopo?
TessellatingHeckler,

1
@TessellatingHeckler Sì, tutto qui. Inoltre, il "burst" non dovrebbe essere un grande burst per gentile concessione di en.wikipedia.org/wiki/Slow-start .
Jeff Ferland,

2

Si utilizza un firewall o un dispositivo che supporta la limitazione della qualità del servizio.

È possibile creare un sistema Linux che funga da gateway dell'ufficio e che utilizzi la modellazione del traffico per raggiungere questo obiettivo. Ha solo bisogno di più schede di rete installate e quindi ogni macchina punta è come un gateway.

Come bonus, puoi configurare un server proxy su di esso per facilitare anche il traffico. Qualcosa come Squid. Potrebbero esserci anche distribuzioni di dispositivi di routing chiavi in ​​mano che possono farlo.


In che modo aiuta QoS? Quando il tuo dispositivo è in grado di applicare QoS a un download, il traffico in entrata è già arrivato sulla connessione Internet e potenzialmente lo ha bloccato. Il QoS può essere applicato al traffico in uscita, ma non può fare nulla per il traffico in entrata perché quando vede il traffico è troppo tardi.
TessellatingHeckler,

3
Può modellare il traffico dove puoi controllarlo. Non è possibile dire a un server remoto di limitare la velocità con cui si ottengono i dati, ma è possibile abbassarli nel punto di ingresso. Altrimenti, dovresti parlare con il tuo fornitore della modellizzazione del traffico nella loro rete al tuo feed.
Bart Silverstrim,

Anche il server proxy può aiutare ad alleviare un po 'di congestione. Ma per il resto, dovrai modellarlo nel punto di ingresso.
Bart Silverstrim,

La mia domanda originale era: sembra che non si possa modellare in corrispondenza del punto di ingresso, poiché qualsiasi controllo che si può applicare si verifica dopo che il traffico è passato attraverso il collo di bottiglia, come può far fronte qualsiasi quantità di tecnologia? "Applicare QoS, ad esempio con Linux" e "usare il traffic shaping" potrebbe essere praticamente cosa fare, ma stavo cercando una spiegazione di come ciò possa eventualmente aiutare. (e ora ne ho alcune in altre risposte).
TessellatingHeckler,

@TessellatingHeckler: Il metodo che mi piace anche consente l'uso di ECN che in realtà fa dire al server di invio di rallentare senza perdere pacchetti. Questo metodo consiste nell'applicare il limitatore di velocità come ROSSO ai pacchetti che escono sull'interfaccia LAN, invece di provare a utilizzare un filtro di ingresso sull'interfaccia WAN.
Zan Lynx,

2

Il protocollo HTTP non fornisce funzionalità per limitare la larghezza di banda utilizzata e, anche in tal caso, sarebbe un'impostazione sul lato client, sulla quale gli amministratori di rete non potrebbero avere alcun controllo.

La limitazione della larghezza di banda (nota anche come "Qualità del servizio") viene generalmente gestita su router / firewall, che gestiscono tutto il traffico in entrata e in uscita verso / da una rete; quelli che lo supportano di solito consentono di configurare criteri come "consentire a un singolo computer client di utilizzare al massimo il 10% di tutta la larghezza di banda disponibile" o "dare priorità SMTP su FTP in modo che le e-mail possano fluire anche quando qualcuno sta eseguendo un download pesante ".

Il modo esatto in cui ciò avviene dipende dal router / firewall utilizzato, ma il modo più semplice è semplicemente di eliminare i pacchetti che superano i limiti configurati; TCP assicurerà che vengano ritrasmessi e alla fine sarà in grado di superare il collo di bottiglia.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.