9.4. 用語説明

より複雑な設定を正しく理解するには、 いくつかの概念を先に説明しておく必要があるでしょう。 このテーマは込み入っていて、また比較的新しいため、 実は同じ概念に異なる言葉が用いられることが多々あります。

以下では An Informal Management Model for Diffserv Routers (draft-ietf-diffserv-model-06.txt) を少々参考にしています。 こちら にあります。

用語の正確な定義を知りたい場合は、この原本も読んでください。

キューイング規則 (Queueing Discipline: qdisc)

入力側 (ingress: 入口)、出力側 (egress: 出口) いずれかの デバイスのキューを管理するアルゴリズムのこと。

root qdisc

デバイスに直接割り当てられた qdisc のこと。

クラスレスな qdisc (classless qdisc)

設定可能な内部の再分配ルールが存在しない qdisc のこと。

クラスフルな qdisc (classful qdisc)

クラスフルな qdisc には複数のクラスが含まれます。 これらのクラスのいくつかはさらに qdisc を保持し、 それがまたクラスフルであることもあります (そうでないこともあります)。 厳密な定義では、pfifo_fast はクラスフルです。 なぜなら 3 つのバンドが含まれ、これらは実はクラスだからです。 しかし、ユーザ設定という面から見ると、 これらのクラスは tc ツールで変更できないのでクラスレスです。

クラス (class)

クラスフルな qdisc は多くのクラスを持つことができ、 それらのクラスはその qdisc の内部に属します。 またクラスも、自らに属する複数のクラスを持つことがあります。 したがってクラスは親として qdisc か別のクラスかを持ちます。

葉クラス (leaf class) は子のクラスを持たないクラスです。 このクラスには qdisc がひとつ所属します。 この qdisc はそのクラスからのデータ送信を決定します。 クラスを作ると、fifo qdisc が所属します。 子クラスを追加すると、この qdisc は削除されます。 葉クラスのこの fifo qdisc は、より適切な他の qdisc と置き換え可能です。 この qdisc をクラスフルな qdisc と置き換えれば、 さらにクラスを追加することもできます。

クラス選別器 (classifier)

クラスフルな qdisc では、どのクラスにパケットを送るかを決める必要があります。 これはクラス選別器を用いて行われます。

フィルタ (filter)

クラス選別はフィルタを用いて行うこともできます。 フィルタには多数の条件が含まれ、 これらのどれかにマッチすると、フィルタがマッチしたことになります。

スケジューリング (scheduling)

クラス選別器を用いると、 qdisc は特定のパケットを他より先に送信するような決定を下すことができます。 この処理はスケジューリングと呼ばれ、 例えば前に紹介した pfifo_fast qdisc で行われていたものです。 スケジューリングは「並び換え (reordering)」と呼ばれることもありますが、 これはやや紛らわしいです。

帯域制限 (shaping)

パケットを送信前に遅延させ、 トラフィックが設定された最高速度を越えないようにする処理のことです。 帯域制限は出口で行われます。 話し言葉では、パケットを破棄してトラフィックを遅くすることも、 帯域制限と呼ばれることが多いです。

監視制限 (policing)

パケットを遅延または破棄して、 トラフィックを設定したバンド幅に収めることです。 Linux における監視制限ではパケットの破棄のみが可能で、 遅延はできません。「入口キュー」は存在しないのです。

処理保存的 (Work-Conserving)

処理保存的な qdisc では、可能な場合にはつねにパケットを配送します。 つまり、ネットワークアダプタが送信可能 (出力 qdisc の場合) な状態にあれば、 決してパケットを遅延させません。

処理非保存的 (non-Work-Conserving)

例えばトークンバケツフィルタのように、 パケットをある時間保持してバンド幅を制限するようなキューもあります。 これはつまり、 可能な場合であってもパケットの引き渡しを拒否するようなこともある、 ということです。

ではここでこれらの用語を整理するため、 これらがどの場所にあるのかを見てみることにしましょう。

                Userspace programs
                     ^
                     |
     +---------------+-----------------------------------------+
     |               Y                                         |
     |    -------> IP Stack                                    |
     |   |              |                                      |
     |   |              Y                                      |
     |   |              Y                                      |
     |   ^              |                                      |
     |   |  / ----------> Forwarding ->                        |
     |   ^ /                           |                       |
     |   |/                            Y                       |
     |   |                             |                       |
     |   ^                             Y          /-qdisc1-\   |
     |   |                            Egress     /--qdisc2--\  |
  --->->Ingress                       Classifier ---qdisc3---- | ->
     |   Qdisc                                   \__qdisc4__/  |
     |                                            \-qdiscN_/   |
     |                                                         |
     +----------------------------------------------------------+
この ASCII 図は Jamal Hadi Salim によるものです。

大きなブロックはカーネルを表しています。 一番左にある矢印は、ネットワークからこのマシンに入ってきたトラフィックです。 これはまず入口 (ingress) の qdisc に入ります。 ここではパケットにフィルタを適用し、 破棄するかどうかを決定できます。これは「監視制限」と呼ばれます。

これは非常に初期の段階で、カーネルの大部分がパケットを見る前です。 ですので、CPU パワーをあまり使わずに トラフィックをごく初期に捨てたければ、 ここが非常に良い場所です。

継続処理を許されたパケットには、 ローカルなアプリケーションに向かうものがあります。 この場合そのパケットは処理のために IP スタックに入り、 ユーザ空間のプログラムに渡されます。 パケットはアプリケーションには入らずにフォワードされることもあり、 この場合は出口 (egress) に向かいます。 ユーザー空間のプログラムがデータを配送することもありますが、 このデータは検査され、出口のクラス選別器へとフォワードされます。

ここでパケットは調査され、たくさんある qdisc のいずれかへキューされます。 設定されていないデフォルトでは、 ひとつの出口 qdisc だけがインストールされています。 これは pfifo_fast で、これが常にパケットを受信します。 これは「エンキューイング (enqueueing)」と呼ばれます。

ここでパケットは qdisc に収まり、 ネットワークインターフェースを通して送信するようカーネルが指令するのを待ちます。 このように送信されることは「デキューイング (dequeueing)」と呼ばれます。

この絵はネットワークアダプタがひとつしかない場合でも成立します。 カーネルを出入りしている矢印は、そのまま絵の通りには取らないで下さい。 各ネットワークアダプタには、入口と出口両方のフックがあるのです。