トークンバケットは、パケット交換ネットワークおよび通信ネットワークで使用されるアルゴリズムです。パケット形式のデータ伝送が、帯域幅とバースト性(トラフィックフローの不均一性または変動の尺度)に関する定義された制限に準拠しているかどうかを確認するために使用できます。また、帯域幅とバースト性に設定された制限に準拠する伝送タイミングを決定するスケジューリングアルゴリズムとしても使用できます。「ネットワークスケジューラ」を参照してください。
トークンバケットアルゴリズムは、固定容量のバケットにトークン(通常はバイト単位または所定のサイズの単一パケットを表す)が一定の速度で追加されるというアナロジーに基づいています。パケットが定義された制限に準拠しているかどうかを確認する場合、バケットが検査され、その時点で十分なトークンが含まれているかどうかが確認されます。十分なトークンが含まれている場合、適切な数のトークン(例えば、パケットのバイト長に相当する数)が削除(「キャッシュイン」)され、パケットは送信などのために渡されます。バケット内のトークンが不十分な場合、パケットは非準拠と判断され、バケットの内容は変更されません。非準拠パケットは、以下の様々な方法で処理できます。
適合フローは、平均レートがトークンがバケットに追加されるレートまでであるトラフィックを含み、バケットの深さによって決まるバースト性を持ちます。このバースト性は、ジッタ許容値、つまり平均レートの制限から予想されるよりもどれだけ早くパケットが適合(到着または送信)できるか、またはバースト許容値または最大バーストサイズ、つまりある有限期間内に平均レベルよりもどれだけ多くのトラフィックが適合できるか、のいずれかで表現されます。
トークン バケット アルゴリズムは、概念的には次のように理解できます。
毎秒1トークンをバケットに追加するために必要なクロック分解能を持たないプラットフォーム上でこのアルゴリズムを実装する場合、別の定式化を検討すると良いでしょう。トークンバケットをSミリ秒ごとに更新できる場合、Sミリ秒ごとに追加するトークンの数は = となります。
長期的には、適合パケットの出力はトークン レートによって制限されます。
最大可能転送速度をバイト/秒単位で表します 。
次に最大バースト時間、つまりレートが完全に利用される時間です。
最大バーストサイズは
トークンバケットは、トラフィックシェーピングまたはトラフィックポリシングのいずれかで使用できます。トラフィックポリシングでは、適合しないパケットは破棄(ドロップ)されるか、優先度が下げられる(輻輳が発生した場合に下流のトラフィック管理機能がドロップするため)場合があります。トラフィックシェーピングでは、パケットは適合するまで遅延されます。トラフィックポリシングとトラフィックシェーピングは、ネットワークを過剰なトラフィックや過剰なバーストトラフィックから保護するためによく使用されます(帯域幅管理と輻輳回避を参照)。トラフィックシェーピングは、ホストのネットワークインターフェースで、ネットワーク内のトラフィック管理機能によって送信が破棄されるのを防ぐために よく使用されます。
トークンバケットアルゴリズムは、データベースIOフローの制御にも使用されます。[ 1 ]このアルゴリズムでは、制限はIOPSにも帯域幅にも適用されず、両者の線形結合に適用されます。トークンをIOリクエストの重みとその長さの正規化された合計として定義することにより、このアルゴリズムは前述の関数の 時間微分が必要なしきい値を下回るようにします。
トークン バケット アルゴリズムは、文献に記載されている2 つのバージョンのリーキー バケットアルゴリズムのいずれかと直接比較できます。 [ 2 ] [ 3 ] [ 4 ] [ 5 ]この比較可能なバージョンのリーキー バケットは、関連する Wikipedia のページで、メーターとしてのリーキー バケット アルゴリズムとして説明されています。これはトークン バケットのミラー イメージであり、準拠パケットは、トークン バケット アルゴリズムで準拠パケットによって削除されるトークンに相当する液体を有限容量のバケットに追加します。その後、この液体は一定速度で排出されます。これは、トークンが一定速度で追加されるプロセスに相当します。
しかし、リーキーバケットアルゴリズムには別のバージョンがあり、[ 3 ]関連するWikipediaページではキューとしてのリーキーバケットアルゴリズムとして説明されています。これはメーターとしてのリーキーバケットの特殊なケースであり、適合パケットがバケットを通過することで説明できます。したがって、キューとしてのリーキーバケットはトラフィックシェーピングにのみ適用でき、一般に出力パケットストリームがバースト的になることを許容しません。つまり、ジッターフリーです。したがって、トークンバケットアルゴリズムとは大きく異なります。
リーキーバケットアルゴリズムのこれら2つのバージョンは、文献では同じ名前で説明されています。そのため、このアルゴリズムの特性やトークンバケットアルゴリズムとの比較について、かなりの混乱が生じています。しかし、基本的には2つのアルゴリズムは同じであり、正しく実装され、同じパラメータが与えられれば、全く同じパケットを適合パケットと非適合パケットとして認識します。
階層型トークンバケット(HTB)は、Linuxのクラスベースキューイング(CBQ)キューイング規則のより高速な代替手段です。[ 6 ]これは、制限されたクライアントが全体の帯域幅を飽和させないように、 各クライアントのダウンロード/アップロード速度を制限するのに役立ちます。

概念的には、HTBは階層的に配置された任意の数のトークンバケットです。あらゆるデバイスにおける主要な出力キューイング規則(qdisc )はルートqdiscと呼ばれます。ルートqdiscには1つのクラスが含まれます。この単一のHTBクラスには、 rateとceilという2つのパラメータが設定されます。これらの値は最上位クラスと同じで、リンク上で利用可能な帯域幅の合計を表します。
HTBにおいて、rateは特定のクラスで利用可能な保証帯域幅を意味し、ceil(ceilの略)はクラスが消費できる最大帯域幅を示します。クラスが保証帯域幅を超える帯域幅を要求する場合、両方のceilに達しない限り、親から帯域幅を借りることができます。Hierarchical Token Bucketは、Linuxトラフィック制御システムにクラスフルキューイングメカニズムを実装し、rateとceilを提供することで、ユーザーが特定のトラフィッククラスへの絶対帯域幅を制御できるだけでなく、追加の帯域幅が利用可能になった場合(ceilまで)の帯域幅配分比率を指定することもできます。
最上位クラスの帯域幅を選択する場合、トラフィックシェーピングはLANとインターネット間のボトルネック部分でのみ効果を発揮します。これは通常、LAN全体がDSLまたはT1接続でサービスされている家庭やオフィスのネットワーク環境に当てはまります。