dernièrement, j'ai demandé à Cette question . Mais la réponse ne convient pas à mes demandes et je sais que les fournisseurs d'hébergement de fichiers réussissent à limiter la vitesse. Donc, je me demande quel est l'algorithme général / méthode de faire (je veux dire Téléchargement de la technique forte>) - en particulier la vitesse de téléchargement unique et la vitesse de téléchargement de l'utilisateur. P>
@ Back2dos Je veux donner à un utilisateur particulier une vitesse de téléchargement particulière (correspondant aux capacités matérielles bien sûr) ou, autrement, donnez la possibilité d'utiliser la possibilité de télécharger un fichier particulier avec Dites 20kb / s. Je veux sûrement avoir une capacité à changer cela à une autre valeur. P>
3 Réponses :
Vous pouvez utiliser un godet de jeton ( http://en.wikipedia.org/wiki/token_bucket a>) p>
Oui, bien que le godet de jeton permet aux rafales. Vous pouvez également utiliser un billet de jeton dans une configuration hiérarchique facilement et proprement (vous pouvez probablement utiliser un seau qui fuit dans une hiérarchie, mais la limite dure du seau qui fuit, Imho, complique que).
Sans mention de la plate-forme / de la langue, il est difficile de répondre, mais un algorithme "venteux seau" serait probablement le meilleur ajustement: p>
Eh bien, puisque cette réponse est vraiment générale, voici une approche très simple pour TCP uni: p>
Vous mettez les gestionnaires de ressources de toutes les raccordements de téléchargement dans une liste, jumelés avec des informations sur les données demandées et la boucle. Ensuite, vous écrivez un morceau des données requises sur la prise, peut-être environ 1,5K, qui est la taille du segment maximale la plus couramment utilisée, autant que je sache. Lorsque vous êtes à la liste et de la liste, vous recommencez. Avant de commencer, attendez simplement d'obtenir la largeur de bande moyenne souhaitée. P>
Veuillez noter si trop de clients ont une bande passante inférieure à celle que vous autorisez, votre tampon TCP est probablement explosé. Certaines liaisons TCP permettent de trouver la taille des données actuellement tamponnées pour une prise. S'il dépasse un seuil, vous pouvez simplement ignorer la prise. P>
En outre, si trop de clients sont connectés, vous n'aurez pas assez de temps pour écrire sur toutes les prises, ainsi après une boucle, vous devez attendre un temps négatif ». L'augmentation de la taille des morceaux pourrait accélérer les choses dans de tels scénarios, mais à un moment donné, votre serveur cessera d'aller plus vite. P>
Une approche plus simple consiste à le faire du côté du client, mais cela peut générer beaucoup de frais généraux. L'idée simple morte est d'avoir la demande du client 1k tous les 50 ms (en supposant que vous voulez 20 kb / s). Vous pouvez même le faire sur http, bien que je suggère fortement une plus grande taille de morceau, car HTTP a des frais généraux énormes. P>
Je suppose que c'est, le meilleur est d'essayer de trouver un serveur Web capable de faire de telles choses hors de la boîte. Je pense que Apache a un certain nombre de modules pour toutes sortes de quotas. P>
salut <
Back2DOS P>
Tu dois être plus précis. Quel est le scénario? Qui est la vitesse de téléchargement que vous voulez limiter? celui d'un utilisateur spécifique, ou en réalité le téléchargement global du serveur? Pourquoi voulez-vous limiter la vitesse? etc.
@ Back2dos Je pense que "pourquoi .." partie est sans importance et ne vous aidera pas de toute façon. En ce qui concerne le scénario - c'est ce que je demande ici ici :).
Ok, "pourquoi" est partiellement non pertinent. La question est la suivante: qu'essayez-vous d'accomplir, quel est votre problème actuel et quelle est la solution souhaitée? Et quels moyens voyez-vous en forme? Quel serveur utilisez-vous? Sans que vous étiez plus précis, je dirais que le moyen le plus simple est d'héberger votre serveur en Nouvelle-Zélande: P Donc, pour des raisons de réponse raisonnable, pourriez-vous au moins être si gentille de savoir quel serveur Web vous utilisez? et quelle "limite" signifie? Voulez-vous une distribution uniforme entre les utilisateurs? doit-il être http? etc.
@ Back2dos C'est une question générale, je ne parle pas d'une plate-forme particulière ou de quelque chose, je cherche une description générale de la façon dont cela est fait (ou comment les gens le font). Si vous savez comment cela peut être fait via HTTP ou que vous savez peut-être utiliser des sockets - vous êtes les bienvenus, tandis que ces suggestions ne répètent pas d'autres réponses.