2010-05-05 18 views
8

Ultimamente ho chiesto la domanda this. Ma la risposta non soddisfa le mie richieste e so che i provider di file hosting riescono a limitare la velocità. Quindi mi chiedo quale sia l'algoritmo/metodo generale per farlo (intendo lo che scarica la tecnica), in particolare limitando la singola connessione/velocità di download dell'utente.Come è possibile limitare la velocità di download?

@ back2dos Voglio dare a un utente particolare una velocità di download particolare (corrispondente alle capacità hardware ovviamente) o in altre parole dare all'utente la possibilità di scaricare alcuni file particolari con diciamo 20kb/s. Sicuramente voglio avere la capacità di cambiarlo in qualche altro valore.

+0

è necessario essere più specifici. qual è lo scenario? chi è la velocità di download vuoi limitare? quello di un utente specifico, o in realtà il caricamento complessivo del server? perché vuoi limitare la velocità? ecc. – back2dos

+1

@ back2dos Penso che la parte "perché .." sia irrilevante e non aiuterà in alcun modo. Per quanto riguarda lo scenario - è quello che sto chiedendo qui fuori :). –

+0

ok, "perché" è parzialmente irrilevante. la domanda è: cosa stai cercando di realizzare, qual è il tuo problema attuale e qual è la soluzione desiderata? e che cosa ritieni opportuno? che server stai usando? senza essere te stesso più specifico, direi che il modo più semplice è quello di ospitare il tuo server in Nuova Zelanda: P quindi, per una risposta sensata, potresti almeno essere così gentile da dire che server web stai usando? e che cosa significa "limite"? vuoi una distribuzione uniforme tra gli utenti? deve essere HTTP? e così via. – back2dos

risposta

6

È possibile utilizzare un token bucket (http://en.wikipedia.org/wiki/Token_bucket)

+0

Sì, sebbene il bucket del token consenta burst. Puoi anche usare un token buck in una configurazione gerarchica in modo semplice e pulito (potresti anche usare un bucket leaky in una gerarchia, ma il limite rigido del bucket che perde, IMHO, lo complica). –

0

Bene, dal momento che questa risposta è davvero generale, ecco un approccio molto semplice per TCP semplice:

Si mettono i gestori di risorse di tutte le connessioni di download in un elenco, in coppia w con informazioni su quali dati sono richiesti e ciclicamente. Quindi scrivi una porzione dei dati richiesti sul socket, forse circa 1.5K, che è la dimensione massima del segmento più comunemente usata, per quanto ne so. Quando sei al e della lista, ricomincia. Prima di ricominciare, aspetta semplicemente di ottenere la larghezza di banda media desiderata.

Nota: se troppi client hanno una larghezza di banda inferiore a quella consentita, è probabile che il buffer TCP esploda. alcuni collegamenti TCP consentono di trovare la dimensione dei dati attualmente bufferizzati per un socket. se supera una soglia, puoi semplicemente saltare il socket.

Inoltre, se sono collegati troppi client, in realtà non si ha abbastanza tempo per scrivere su tutte le prese, quindi dopo un ciclo, si "deve attendere un tempo negativo". Aumentare la dimensione del blocco potrebbe velocizzare le cose in tali scenari, ma a un certo punto il tuo server smetterà di diventare più veloce.

Un approccio più semplice è quello di eseguire questa operazione sul lato client, ma questo può generare un sovraccarico. L'idea semplice è che il client richieda 1K ogni 50 ms (supponendo che si desideri 20KB/s). Puoi farlo anche su HTTP, anche se suggerisco caldamente dimensioni più grandi del blocco, poiché HTTP ha enormi costi generali.

La mia ipotesi è, il migliore è cercare di trovare un server web in grado di fare queste cose fuori dalla scatola. Penso che Apache abbia un numero di moduli per ogni tipo di quota.

greetz
back2dos

Problemi correlati