Le générateur de jetons
Le générateur de jetons est une horloge interne qui produit des jetons à intervalle régulier. Ce n'est pas aléatoire — c'est une fréquence fixe, dérivée mathématiquement du CIR que tu configures.
La relation mathématique fondamentale
Exemple : CIR = 512 000 bps, Tc = 125 ms BC = CIR × Tc BC = 512 000 × 0.125 BC = 64 000 bits = 8 000 octets Toutes les 125 ms, le générateur dépose 64 000 bits de jetons dans le bucket. Sur 1 seconde complète → 8 dépôts × 64 000 bits = 512 000 bits = CIR ✓
Comparaison selon le Tc
| Tc | Dépôts/seconde | BC déposé | Effet |
|---|---|---|---|
| 125 ms (défaut) | 8 | CIR/8 | Équilibré — recommandé |
| 10 ms | 100 | CIR/100 | Très granulaire — voix/vidéo |
| 500 ms | 2 | CIR/2 | Gros bursts autorisés |
| 1 000 ms | 1 | CIR | 1 dépôt/s — pas recommandé |
Le Bucket
Le bucket (seau) est simplement un compteur de jetons. Pas un buffer réseau, pas une file d'attente — juste un compteur qui monte et descend.
Propriétés du bucket
| Propriété | Valeur | Explication |
|---|---|---|
| Taille maximale | BC (bits) | Le bucket ne peut pas contenir plus de BC jetons. Les jetons excédentaires sont perdus — le bucket ne déborde pas, il rejette. |
| Taille initiale | BC (plein) | Au démarrage, le bucket commence plein. Le premier burst est autorisé immédiatement. |
| Implémentation | Logiciel | C'est un simple entier en mémoire — pas de hardware dédié. Très léger à implémenter. |
| Coût de fabrication | Quasi nul | Un compteur 32 ou 64 bits en RAM. Pas de ASIC, pas de buffer physique. C'est pourquoi la QoS est scalable. |
| Localisation | Par interface / par classe | Chaque class-map dans une policy-map a son propre bucket indépendant. |
Le bucket ne déborde pas — il rejette
Bucket plein (BC = 64 000 bits) : Générateur tente de déposer 64 000 bits supplémentaires → Bucket already at max → jetons supplémentaires PERDUS → Pas d'erreur, pas de log — silencieux Conséquence : si le trafic est absent pendant longtemps, le bucket reste plein à BC — pas au-delà. Le "crédit accumulé" est limité à BC.
Ce que le bucket n'est PAS
| Idée reçue | Réalité |
|---|---|
| Le bucket stocke des paquets | ❌ Non — il stocke des jetons (compteur). Les paquets ne sont jamais "dans" le bucket. |
| Plus le bucket est grand, mieux c'est | ❌ Non — un BC trop grand autorise des bursts massifs qui impactent les autres flux. |
| Le bucket est un buffer hardware | ❌ Non — c'est un entier en RAM. Différent des buffers de queue (CBWFQ, FIFO). |
| Le bucket vide = paquet droppé | ⚠️ Dépend : en policing oui, en shaping le paquet attend dans une queue. |
Les Jetons
Un jeton représente l'autorisation de transmettre un bit (ou un octet, selon l'implémentation). Sur Cisco IOS, 1 jeton = 1 bit.
Cycle de vie d'un jeton
1. NAISSANCE : le générateur crée des jetons au rythme CIR bps → toutes les Tc ms, BC jetons sont ajoutés au bucket 2. STOCKAGE : les jetons attendent dans le bucket (max BC jetons) → si bucket plein → nouveaux jetons perdus 3. CONSOMMATION : à l'arrivée d'un paquet, le système vérifie si le bucket contient suffisamment de jetons → Paquet de 1500 octets = 12 000 bits = 12 000 jetons requis 4. DÉCISION : bucket ≥ 12 000 jetons → CONFORM → paquet transmis, jetons débités bucket < 12 000 jetons → EXCEED/VIOLATE → selon la politique
Granularité : bits vs octets
| Implémentation | 1 jeton = | Bucket pour 512 kbps |
|---|---|---|
| Cisco IOS (police) | 1 bit | BC en bits |
| Cisco IOS (shape) | 1 bit | BC en bits |
| Certaines implém. Linux | 1 octet | BC en octets |
Que se passe-t-il pendant une période sans trafic ?
t=0s : bucket = BC (plein au démarrage) t=1s : aucun trafic → bucket reste plein (nouveaux jetons perdus) t=10s : aucun trafic → bucket toujours à BC — pas de "crédit accumulé" t=10.1s: burst de trafic → bucket plein disponible → burst autorisé jusqu'à BC Conclusion : le bucket NE s'accumule PAS au-delà de BC. Une heure de silence ne donne pas plus de "crédit" qu'une seconde de silence. Le crédit maximum est toujours limité à BC bits.
Le paquet doit payer en jetons
À chaque arrivée d'un paquet, le système effectue une vérification atomique : le bucket contient-il assez de jetons pour "payer" ce paquet ? La décision est immédiate — pas de calcul complexe.
L'algorithme de décision
À l'arrivée du paquet : tokens_requis = taille_paquet_en_bits if bucket_courant ≥ tokens_requis: bucket_courant -= tokens_requis action = CONFORM ← paquet dans la bande elif (bucket_courant + be_bucket) ≥ tokens_requis: ← dual bucket seulement be_bucket -= (tokens_requis - bucket_courant) bucket_courant = 0 action = EXCEED ← paquet hors CIR mais dans Be else: action = VIOLATE ← paquet au-delà de tout seuil
Exemple chiffré — paquet qui paie
Config : CIR = 512 kbps, BC = 64 000 bits, Tc = 125 ms État : bucket = 64 000 jetons (plein) Arrivée paquet #1 : 1500 octets = 12 000 bits bucket = 64 000 - 12 000 = 52 000 jetons → CONFORM ✓ Arrivée paquet #2 : 1500 octets = 12 000 bits bucket = 52 000 - 12 000 = 40 000 jetons → CONFORM ✓ ... 3 paquets de plus ... bucket = 4 000 jetons Arrivée paquet #6 : 1500 octets = 12 000 bits requis bucket = 4 000 < 12 000 → EXCEED/VIOLATE ✗ après Tc = 125 ms → le générateur a produit CIR × Tc = 64 000 jetons bucket = min(4 000 + 64 000, 64 000) = 64 000 jetons (plein à nouveau)
Single Bucket vs Dual Bucket
Single Rate — Two Color (1 bucket)
Un seul bucket de taille BC. Deux décisions possibles : CONFORM ou EXCEED. C'est le modèle de base, suffisant pour la majorité des cas.
Cisco IOS — Single Rate Two Color : police rate 512000 bps burst 64000 conform-action transmit exceed-action drop
Single Rate — Three Color (2 buckets : BC + Be)
Deux buckets en cascade. Le premier bucket (BC) se vide en premier. Si vide, le deuxième bucket (Be) prend le relais. Trois décisions : CONFORM / EXCEED / VIOLATE.
Cisco IOS — Single Rate Three Color : police rate 512000 bps burst 64000 peak-burst 128000 conform-action transmit exceed-action set-dscp-transmit AF11 ← re-mark et laisse passer violate-action drop
Comparaison rapide
| Modèle | Buckets | Décisions | Usage typique |
|---|---|---|---|
| Single Rate 2-color | 1 (BC) | CONFORM / EXCEED | Policing simple, accès internet |
| Single Rate 3-color | 2 (BC + Be) | CONFORM / EXCEED / VIOLATE | Policing avec burst toléré + re-mark |
| Dual Rate 3-color | 2 (CIR + PIR) | CONFORM / EXCEED / VIOLATE | MPLS DiffServ, provider QoS |
🎮 Simulateur Token Bucket
Règle le CIR et le BC, envoie des paquets, observe le bucket en temps réel.
Flash Cards — Token Bucket
Clique pour révéler la réponse.
ou Tc = BC / CIR
Exemple : CIR=512 kbps, Tc=125ms → BC = 512 000 × 0.125 = 64 000 bits
EXCEED : bucket CIR vide, bucket Be disponible → hors CIR mais dans burst
VIOLATE : les deux buckets vides → au-delà de tout seuil
Shaping : bucket vide → paquet mis en attente dans une queue jusqu'au prochain remplissage
Même mécanisme de bucket, comportement opposé sur les paquets exceed.