權杖桶(token bucket)
想像一個收費亭每隔固定間隔發出一個通行權杖,把它們投入一個至多容納(比方說)二十個的籃子裡。一輛車唯有能從籃子抓到一個權杖時才能通過。若這條路一直空著,權杖會堆積到二十個,於是當一個車隊抵達時,至多二十輛車可以連續地以爆發方式通過——但在那之後,車輛就只能以新權杖滴入的速度前進。權杖桶就是封包的這套方案:它控制一條流的長期平均速率,同時刻意允許至多某個上限的爆發。
在機制上,權杖以穩定速率 r(比方說每毫秒一個權杖)加入一個桶子,桶子至多容納 b 個權杖。要送出一個封包,這條流必須移除一個權杖(一個細化做法是按位元組計費權杖)。若有權杖在,封包立刻送出並消耗一個權杖;若桶子空了,封包必須等待(在塑形器中)或被丟棄/標記(在管制器中)。這兩個參數給你精確的控制:r 限制持續的平均速率,b 限制最大爆發量——在閒置一段時間後能立刻送出的最多封包數。這正是真實流量想要的:一個安靜過的發送端可以短暫追趕,但長期下來不能超過它的平均。
為什麼重要:權杖桶是流量管制與流量塑形背後的主力,是網路描述並執行一條流被允許行為的標準方式(「這個類別可平均 10 Mbps、爆發至多 1 megabit」)。它比純漏桶更有用,正因為它容忍真實應用產生的爆發性,卻仍把它限住。要釐清的誠實區別:漏桶強制完全固定的輸出(無爆發);權杖桶限制平均,卻允許至多 b 的受控爆發。同一族的想法,但權杖桶有界爆發的彈性,正是它在實務上稱霸的原因。
一個權杖桶速率 r = 每毫秒 1 個權杖、深度 b = 20。在 50 毫秒的沉默之後桶子滿載 20 個權杖。一個突如其來的 25 個封包爆發抵達:20 個立刻通過(花光全部 20 個權杖),其餘 5 個必須等候新權杖,每毫秒一個。平均維持在每秒 1000 個封包,但一個 20 封包的爆發被允許了。
速率 r 設定長期平均;深度 b 設定允許的最大爆發。
與漏桶的關鍵差異:權杖桶限制平均速率、卻允許至多 b 的爆發,而漏桶強制完全固定、毫無爆發的輸出。權杖桶對爆發的容忍,正是它成為真實服務品質所用形式的原因。