優先制御の基本はとても単純だ。後から到着したパケットであっても,優先度が高ければ先に送り出す。ルーターの出力インタフェースに届いたIPパケットをいくつかの列に分けて並ばせ,優先度が高い列に並んでいるパケットから先に処理するのである。

 パケットが並ぶ行列を「待ちキュー」と呼ぶ。つまり優先制御は,待ちキューを細かく分けて処理の順番に差を付ける技術ということになる。

最優先の待ちキューを用意する

 では,具体的な優先制御のしくみを見ていこう。

 急ぎのパケットの遅延時間を短くするには,出力インタフェースに専用の待ちキューを作って,ほかの待ちキューに並んでいるパケットを無条件で追い越させれば良い。これは,順位付きキュー(PQ(ピーキュー)*1)と呼ばれ,優先制御の一番簡単な方法である(図1-1)。

図1-1●優先度の高い列に並んだパケットを先に処理する
図1-1●優先度の高い列に並んだパケットを先に処理する
待ちキュー(行列)をいくつかに分けて,それぞれ順番にベルトコンベアに乗せるようにすれば,優先度をつけた処理が可能になる。

 PQで用意する待ちキューは,「最優先」,「優先」,「その他」の三つに分けるのが典型的である。パケットを送信するときに,ルーターは優先度の高い待ちキューから順に処理するパケットを探していく。そのパケットを送り終えれば,再び優先度の高い待ちキューからパケットを探す。

 PQを使えば,優先度の高いパケットは優先度の低いパケットより確実に先に送り出される。到着したときにすでに送信が始まっているパケットがあるときと,最優先の待ちキューにほかのパケットが並んでいるとき以外,最優先のパケットが待つことはない。

 単純なPQは,多くのルーターが標準機能として備えている。

 ただし,PQには大きな欠点がある。優先度が高いパケットがすべて送信されてしまうまで,優先度が低いパケットが送り出されなくなるという点だ。優先度の高いパケットがどんどん到着する状況でPQを使うと,優先度の低いパケットがまったく流れなくなり,通信はそこで切断される。

TCP/IPでは,少しずつでもパケットが流れれば,通信が切れる可能性はずっと低くなる*2。このため,ちょっと高級なルーターになると,優先度が低くても一定の割合でパケットが流れるように工夫した優先制御技術を備えている。重み付けキュー(CQ(シーキュー)*3)と呼ばれる技術である。

優先度が低いパケットを少しずつ流す

 CQでは,行列の優先度を“重み”に置き換えて設定する。重みとは,それぞれの行列からパケットを送信する割合のこと。すべての待ちキューにパケットが並んでいるとき,ルーターは設定した重み(割合)に応じてパケットを送出していく。

 では実際に,パケットを送り出す順番の決め方を見てみよう。

 CQもPQと同じで,ルーターは次々と到着するパケットを優先度別に分けた待ちキューに入れる。ここでPQは何も考えずに優先度の高い順からパケットを送出する。それに対してCQは,パケットにまず整理番号を付けて,その整理番号が若い順にパケットを送り出していく。

 整理番号は,待ちキューの重みとパケットの長さ,さらにキューにある最後のパケットの整理番号から計算する(図1-2)。例えば,パケットを流す割合(重み)が50の待ちキューに整理番号184のパケットが溜まっているとき,後から入ってきた1500バイトのパケットの整理番号は,1500を50で割った結果の30に184を足した214になる。待ちキューにパケットがない場合には,送信中のパケットの整理番号を基に整理番号の値を計算する*4図1-2)。

図1-2●優先度が低くてもパケットを流す
図1-2●優先度が低くてもパケットを流す
整理番号をパケットに振って,番号順に流す。優先度が高いパケットに小さな整理番号を渡し,優先度の低いパケットには大きな整理番号を渡す。優先度の高いパケットを先に通しながら,優先度の低いパケットも少しずつ送られるようにする。
[画像のクリックで拡大表示]

 優先度が低いキューに入れられるパケットにも整理番号が付く。待っていれば,必ずその番号の順番が来るので,優先度が低くても少しずつパケットが送られることになる。

実際は簡略化したCQが主流

 複数の待ちキューに並んでいるパケットから次に送り出すパケットを探し出すのは,ルーターにとって複雑な処理になる。このため,ルーターはCQの処理を簡略化して実装している。

 簡略化したCQには,キューに溜まっているパケットのデータ量を見て,決めた値まで溜まったらパケットをまとめて送るといった方法がある。それぞれの待ちキューに,優先度に合わせて「バイト・カウント」と呼ぶ目盛りを設定し,待ちキューに溜まったパケットの総量が目盛りに達したら,キューにあるすべてのパケットを送り出す。

 この方法でバイト・カウントを小さくしすぎると,すぐにパケットを送ることになるので,重み付けが利かなくなる。反対にバイト・カウントが大きすぎると,送出までの待ち時間が長くなってしまう。設定は難しいが,きめ細かく優先度を制御できる。

 もっと簡単にした方法もある。重みの値に応じて待ちキューから送出するパケットの個数だけを変えていく方法だ。パケットの長さを考えに入れないので,ルーターの処理は格段に簡単になる。ただし,長いパケットが多い通信は,短い通信に比べて優先される。