FIFOとは
FIFO(First In, First Out)は「先入れ先出し」と呼ばれるキューイング方式で、日本語ではファイフォと読みます。最も単純な仕組みであり、Ethernet LANインターフェースでデフォルトとして有効になっている方式です。FIFOではパケットに優先度を付けず、到着した順番通りに処理して転送します。
そのため、音声パケットとデータパケットが混ざっていても、特に区別されることなく同じ列に並び、順番に処理されていきます。
FIFOでの音声トラフィックの扱い
「優先度がないなら音声品質に悪影響があるのでは?」と疑問に思うかもしれませんが、必ずしもそうではありません。ポイントはトラフィックの混雑(輻輳)が発生するかどうかです。
例えばGigabitEthernetインターフェースで、実際に流れるトラフィックが100Mbps以下しか使っていない場合、回線に余裕があるため音声通話も問題なく処理されます。しかし、出力側のWANインターフェースが10Mbpsや100Mbpsといった帯域の狭い回線であれば、FIFOだけでは混雑が発生しやすく、音声の遅延や途切れが起きる可能性が高くなります。このような環境では、より高度なQoSの仕組みを導入するのが一般的です。
FIFOキューイングの仕組み
FIFOキューイングでは、すべてのパケットが同じ「クラス」に属します。つまり、分類や優先度付けが一切行われません。そのため、出力キュー(Output queue)が満杯になった場合、新しく到着したパケットは捨てられます。この現象をテールドロップ(tail drop)と呼びます。
FIFOは非常にシンプルなため、ハードウェア処理によってルータへの負荷がほとんどありません。他のQoS方式と比べても、処理速度は最も速いという特徴があります。そのため、音声トラフィックとデータトラフィックが混在していない環境や、帯域に十分な余裕がある場合は、FIFOのままで運用しても問題ありません。
FIFOから他の方式へ移行する場面
ただし、状況によってはFIFOのままでは不十分です。特にGigabitEthernetインターフェースをWAN回線として利用する場合など、帯域に制限がある場面では以下のような追加実装が求められることが多いです。
- CBWFQ(Class-Based Weighted Fair Queuing)やLLQ(Low Latency Queuing)といった高度なキューイング方式
- DSCP値を用いたマーキングによる優先度付け
- 帯域制御を行うポリシングやシェーピング
PQ(Priority Queuing)とは
PQ(Priority Queuing)は、パケットに優先度を割り当て、その優先度に応じて処理するキューイング方式です。FIFO(先入れ先出し)と異なり、複数のキューを用意してトラフィックを仕分けし、優先度の高いキューから順に送出します。
PQには「high」「medium」「normal」「low」の4種類のキューがあり、送信順序は high → medium → normal → low の順番です。輻輳(トラフィックの混雑)が発生してパケットが一時的に格納される際、まずは「high」キューのすべてのパケットが送出され、その後に「medium」や「normal」などのキューが順番に処理されます。もし「normal」の送出中に新たに「high」のパケットが到着した場合は、「high」の処理が優先され、残りの「normal」は後回しとなります。
PQの問題点
PQの最大の利点は「遅延に敏感なトラフィックを優先できる」点です。例えば音声通話のように遅延が許されない通信は、必ず「high」キューに入れることでスムーズに処理されます。
一方で問題となるのは、優先度の低いキューのパケットが後回しにされ続ける可能性です。もし「high」に分類されるパケットが大量にある場合、いつまでも「normal」や「low」のパケットが送出されず、遅延やパケットロスが発生することがあります。この状態を俗に「飢餓状態(Starvation)」と呼びます。
そのため、設計上「high」キューに入れるのは音声パケットなど本当に遅延に弱いトラフィックに限定し、帯域を専有しないようにすることが重要です。
PQでのパケット分類基準
PQでは、次の条件をもとにパケットを4つのキューへ振り分けることができます。
- 送信元IPアドレス
- 宛先IPアドレス
- 送信元ポート番号
- 宛先ポート番号
- プロトコルの種類
- 着信インターフェース
- IP Precedence値
- DSCP値
これらの条件に合致しなかったパケットは、自動的に「normal」キューに入ります。
PQのCiscoルータでの設定
CiscoルータでPQを設定する手順は次の流れになります。
- 分類ルールを作成
ACLやプロトコル指定を使って、どのトラフィックをどのキューに入れるかを定義します。(config)# priority-list 1 protocol ip high list 101 (config)# priority-list 1 protocol ip medium tcp 23 (config)# priority-list 1 protocol ip medium udp 53 - デフォルトキューの設定
条件に当てはまらないパケットが入るキューを指定します。初期状態では「normal」ですが、変更可能です。(config)# priority-list 1 default normal - キューの最大サイズを設定(オプション)
各キューの保持できるパケット数を制御できます。デフォルトでは以下の通りです。 キュー デフォルトの最大保持数 high 20 medium 40 normal 60 low 80 変更する場合は次のように設定します。(config)# priority-list 1 queue-limit 30 50 70 90 - 設定したリストをインターフェースに適用
(config)# interface Serial0/0 (config-if)# priority-group 1
設定例
以下は、LANからWANへ送出されるトラフィックに対し、特定の条件で優先度を割り当てる例です。
Cisco(config)# access-list 101 permit ip 192.168.1.0 0.0.0.255 10.1.1.0 0.0.0.255
Cisco(config)# priority-list 1 protocol ip high list 101
Cisco(config)# priority-list 1 protocol ip medium tcp 23
Cisco(config)# priority-list 1 protocol ip medium udp 53
Cisco(config)# interface Serial0/0
Cisco(config-if)# priority-group 1
適用後は以下のコマンドで状態を確認できます。
show queue interface serial0/0
show queueing priority
CQ(Custom Queuing)とは
CQ(Custom Queuing)は、複数のキューを順番に回しながら、あらかじめ管理者が指定したバイト数分のパケットを転送していく方式です。PQ(Priority Queuing)が最大4つのキューしか持てないのに対し、CQでは最大16個まで定義できます。
PQでは「high」「medium」「normal」「low」といった名前でキューを管理しましたが、CQでは「1~16」の番号を付けて管理します。
CQの動作の仕組み
CQでは、各キューを1つずつ巡回し、設定されたバイト数分のパケットを送出します。一巡すると最初のキューに戻り、再び同じサイクルを繰り返します。
例えば、次のように定義されている場合を考えます。
- Queue1:1500バイト分送信
- Queue2:1300バイト分送信
- Queue3:1000バイト分送信
この場合、Queue1を処理した後はQueue2、その後Queue3を処理し、再度Queue1に戻ります。こうして順番に処理することで、ある程度の公平性を確保できます。
CQの問題点
CQは「公平に帯域を割り当てたい」という状況に適していますが、PQのように最優先で処理されるキューが存在しないため、音声通話やビデオ会議など遅延にシビアなトラフィックには不向きです。もし音声トラフィックをCQで扱うと、キューの巡回の都合で遅延が発生する可能性があります。そのため、音声通信のような用途では、より優先度を強く保証できるLLQ(Low Latency Queuing)などの方式が好まれます。
CQでのパケット分類方法
CQでパケットをどのキューに入れるかは、以下の基準で判定します。
- 送信元IPアドレス
- 宛先IPアドレス
- 送信元ポート番号
- 宛先ポート番号
- プロトコルの種類
- 着信インターフェース
- IP Precedence値
- DSCP値
条件に一致しないパケットは「デフォルトキュー」に振り分けられます。
CQのCiscoルータでの設定
CQを設定する流れは次の通りです。
- 分類ルールの作成
(config)# queue-list 1 protocol ip 1 list 101 (config)# queue-list 1 protocol ip 2 tcp 23 (config)# queue-list 1 default 3 (config)# queue-list 1 protocol ip 4 tcp 80 - 各キューのバイト数を定義
(config)# queue-list 1 queue 1 byte-count 1400 (config)# queue-list 1 queue 2 byte-count 640 (config)# queue-list 1 queue 3 byte-count 1200 (config)# queue-list 1 queue 4 byte-count 1500バイト数の値が小さすぎると効率が悪くなり、大きすぎると特定のキューに帯域が偏るため、実際に扱うトラフィックの平均パケットサイズを意識して調整することが重要です。 - 各キューの最大パケット数を変更(任意)
デフォルトでは20ですが、必要に応じて調整できます。(config)# queue-list 1 queue 1 limit 50 - 定義したキューリストをインターフェースに適用
(config)# interface Serial0/0 (config-if)# custom-queue-list 1
設定例
Cisco(config)# access-list 101 permit 192.168.1.0 0.0.0.255 10.1.1.0 0.0.0.255
Cisco(config)# queue-list 1 protocol ip 1 list 101
Cisco(config)# queue-list 1 protocol ip 2 tcp 23
Cisco(config)# queue-list 1 default 3
Cisco(config)# queue-list 1 protocol ip 4 tcp 80
Cisco(config)# queue-list 1 queue 1 byte-count 1400
Cisco(config)# queue-list 1 queue 2 byte-count 640
Cisco(config)# queue-list 1 queue 3 byte-count 1200
Cisco(config)# queue-list 1 queue 4 byte-count 1500
Cisco(config)# interface Serial0/0
Cisco(config-if)# custom-queue-list 1
動作確認には以下のコマンドを使用します。
show queue interface serial0/0
show interface serial0/0
show queueing custom
WFQ(Weighted Fair Queuing)とは
WFQ(Weighted Fair Queuing)は、ネットワーク上のトラフィックをフロー単位で自動的に識別し、それぞれのフローに専用のキューを割り当てて処理するキューイング方式です。FIFOやPQ、CQでは管理者が手動でキューを定義する必要がありましたが、WFQではルータが自動的にフローを検出しキューを生成します。
フローの判定は、送信元IPアドレス・宛先IPアドレス・送信元ポート番号・宛先ポート番号・プロトコルタイプなどの情報を基に行われます。たとえば「192.168.0.1:1030 から 10.1.1.1:23 へのTelnet通信」が1フローとして識別され、専用のキューが作成されます。
さらに、各パケットの優先度はIPヘッダのToSフィールドにある IP Precedence値 に基づいて決定されます。
WFQの種類
WFQと呼ばれる方式には実際には複数の派生形があります。
- WFQ(Flow-Based WFQ):基本的な仕組みで、フロー単位にキューを自動作成
- DWFQ(Distributed WFQ):分散処理に対応したWFQ
- CBWFQ(Class-Based WFQ):管理者が定義したクラスごとにキューを作成する方式(現在の主流)
- DCBWFQ(Distributed Class-Based WFQ):分散処理に対応したCBWFQ
通常「WFQ」と言えば Flow-Based WFQ を指しますが、実際の運用では CBWFQ が広く利用されます。
WFQの動作
WFQは以下のルールに基づいて動作します。
- トラフィックフローを分類
送信元/宛先IP、送信元/宛先ポート番号、プロトコル、ToSフィールドを基に識別 - 優先度を決定
IP Precedence値を基準に、パケットを処理する重み(Weight)を決める- 値が大きいほど優先度が高く、処理が早い
- 例えば Precedence 1 のパケットは Precedence 0 の約2倍の速度で処理される
| IP Precedence値 | ToS Byte Value | Weight(重み) |
|---|---|---|
| 0 | 0 (0x00) | 32768 |
| 1 | 32 (0x20) | 16384 |
| 2 | 64 (0x40) | 10920 |
| 3 | 96 (0x60) | 8192 |
| 4 | 128 (0x80) | 6552 |
| 5 | 160 (0xA0) | 5456 |
| 6 | 192 (0xC0) | 4680 |
| 7 | 224 (0xE0) | 4096 |
- キューからの送出
- IP Precedence値がない場合は、すべてのキューから均等にパケットを送出
- パケットサイズが小さいものから優先して送出されるため、短いトラフィックが有利になる
この仕組みにより、特定のアプリケーション(例えばFTP)が帯域を独占するのを防ぎつつ、重要度の高い通信を優先できます。
WFQのCiscoルータでの設定
WFQはインターフェース速度によってデフォルトの動作が異なります。
- 2Mbps以下のインターフェース(例:シリアル回線)ではデフォルトで有効
- LANインターフェース(10Mbps以上) ではデフォルトでFIFOが有効
有効化の確認は以下のコマンドで可能です。
show interface serial0/0
出力の中に「Queueing strategy: weighted fair」と表示されていればWFQが有効です。
WFQを明示的に有効化する場合は、次のコマンドを使います。
(config)# interface serial0/0
(config-if)# fair-queue [congestive-discard-threshold [ dynamic-queues [ reservable-queues ]]]
コマンド引数の説明
- congestive-discard-threshold
1つのキューに保持できる最大パケット数(デフォルト64、範囲1~4096)。超えると新規パケットは破棄される。 - dynamic-queues
自動作成されるキューの最大数(デフォルト256、範囲16~4096)。 - reservable-queues
RSVPなど帯域予約用のキュー数(デフォルト0、範囲0~1000)。
CBWFQ(Class-Based WFQ)とは
CBWFQ(Class-Based Weighted Fair Queuing)は、管理者が定義した「クラス」ごとに専用のキューを割り当て、トラフィックを制御する方式です。ここでいう「クラス」とは、ACLやDSCP値などを基準にまとめたトラフィックグループのことを指します。
この方式は、CQ(Custom Queuing)とWFQ(Weighted Fair Queuing)の要素を併せ持っています。CQではキューごとに転送できるバイト数を設定しましたが、CBWFQでは bandwidthコマンド を用いて各キューに最低限保証する帯域幅を割り当てられます。またWFQのように優先度を考慮した制御もできるため、柔軟かつ公平な処理が可能です。
ただし、CBWFQで作成した各クラスのキュー内部ではFIFOと同じく先入れ先出しの処理になります。一方で、デフォルトクラスである class-default については、FIFOかWFQのいずれかを選択可能です。
また注意点として、bandwidthコマンドで指定した値は「最低保証帯域幅」を意味し、必ずしも厳密にその数値で制御されるわけではありません。余裕があれば設定値以上の帯域を使うことも可能です。そのため、実際に導入する場合は事前にテスト環境での動作検証が推奨されます。
CBWFQの仕組み
- ACLやDSCP値でトラフィックを分類し、クラスに振り分ける
- 各クラスには専用のキューが割り当てられる
- bandwidthコマンドで最低限保証する帯域を設定
- どのクラスにも当てはまらないトラフィックは class-default に送られる
CiscoルータでのCBWFQ設定手順
CBWFQは MQC(Modular QoS CLI) という共通の設定体系を利用します。流れは次の3ステップです。
Step 1:class-map でクラスを定義
(config)# class-map [ match-any | match-all ] name
(config-cmap)# match access-group acl-number
(config-cmap)# match ip precedence value
(config-cmap)# match ip dscp value
(config-cmap)# match protocol protocol-name
- match-any:複数条件のうち1つでも一致すれば適用
- match-all:複数条件すべてに一致した場合のみ適用(デフォルト)
Step 2:policy-map で帯域を割り当て
(config)# policy-map policy-name
(config-pmap)# class class-name
(config-pmap-c)# bandwidth [ kbps | percent percentage | remaining percent percentage ]
- bandwidth kbps:キューに割り当てる保証帯域をkbpsで指定
- bandwidth percent:物理リンク帯域に対する割合で指定
- bandwidth remaining percent:未使用帯域の割合から指定
追加オプション:
- queue-limit value → キューに保持できる最大パケット数を設定
- class-default に対して fair-queue を設定するとWFQとして動作可能
Step 3:service-policy でインターフェースに適用
(config)# interface interface-id
(config-if)# service-policy output policy-name
CBWFQとLLQにおける75%ルール
CBWFQやLLQでは、クラスに割り当てられる帯域幅の合計は物理インターフェース帯域の 75%が上限 です。残り25%はルーティング更新や制御用トラフィックに確保されます。
もし75%以上を割り当てたい場合は、次のコマンドで調整できます。
(config)# interface interface-id
(config-if)# max-reserved-bandwidth percent
デフォルトは75であり、変更する際は必ず事前に検証しておく必要があります。
LLQ(Low-Latency Queuing)とは
LLQ(Low-Latency Queuing)は、CBWFQ(Class-Based WFQ)にPQ(Priority Queuing)の仕組みを組み合わせた方式です。CBWFQが持つ「クラスごとに帯域を保証する仕組み」に加えて、PQの「特定のトラフィックを最優先で処理するキュー」を導入することで、リアルタイム性が求められる音声やビデオなどを確実に守れるようになっています。
現在の企業ネットワークで最も広く利用されているQoSの方式であり、特にVoIPやビデオ会議の品質確保に必須の技術です。
LLQの動作の仕組み
CBWFQでは各クラスに最低保証帯域を設定できましたが、LLQではさらに Priorityキュー(絶対優先キュー) を導入します。
- Priorityキューに入ったパケットは、輻輳時に最優先で処理される
- ただし、Priorityキューが帯域をすべて使い尽くしてしまわないように、利用できる最大帯域を制限可能
- 音声トラフィックはこのPriorityキューに入れるのが一般的
つまり「音声は絶対に遅延させないが、他の通信も保証帯域を確保する」という、両立を実現できるのがLLQです。
CiscoルータでのLLQ設定
LLQは基本的に CBWFQの設定に加えて、priorityコマンドを使うだけ で導入できます。
Priorityキューの設定例
(config)# policy-map name
(config-pmap)# class VOICE
(config-pmap-c)# priority 1000
または割合で指定する場合:
(config-pmap-c)# priority percent 10
ここで設定された帯域が、Priorityキューの最大使用可能帯域となります。
ACLを利用したシンプルな設定例
access-list 101 permit ip 192.168.1.0 0.0.0.255 10.1.0.0 0.0.255.255
access-list 102 permit ip 192.168.2.0 0.0.0.255 10.2.0.0 0.0.255.255
access-list 103 permit ip 192.168.3.0 0.0.0.255 10.3.0.0 0.0.255.255
class-map match-any C-VOICE
match access-group 101
class-map C-DATA2
match access-group 102
class-map C-DATA3
match access-group 103
policy-map P-RULE1
class C-VOICE
priority percent 10
class C-DATA2
bandwidth percent 25
class C-DATA3
bandwidth percent 25
class class-default
fair-queue
interface FastEthernet0/0
service-policy output P-RULE1
この設定により、音声(C-VOICE)は常に最優先で処理され、それ以外のクラスは最低保証帯域を確保して処理されます。
状態確認は以下のコマンドで行います。
show policy-map interface FastEthernet0/0
帯域が非常に狭い環境での設定例
かつてFrameRelayなどの64kbps回線で利用された例:
access-list 101 permit udp any any range 16384 32767 ← 音声データ(RTP)
access-list 102 permit tcp any eq 1720 any ← 音声制御(H.323)
access-list 102 permit tcp any any eq 1720
class-map C-VOICE
match access-group 101
class-map C-SIGNAL
match access-group 102
policy-map P-RULE1
class C-VOICE
priority 45
class C-SIGNAL
bandwidth 8
class class-default
fair-queue
interface Serial0/0
service-policy output P-RULE1
この場合、音声(RTP)はPriorityキューで最大45kbpsを確保し、制御トラフィック(H.323信号)は8kbpsを最低保証する構成になっています。
音声トラフィックのマッチ条件
音声を識別する方法はいくつかあり、以下のいずれかを使うのが一般的です。
- RTPポート番号を指定する
match ip rtp 16384 16383 - IP Precedence値(例:5)を利用する
match ip precedence 5 - DSCP値(EF: Expedited Forwarding = 46)を利用する
match ip dscp ef
IP RTP Priorityとは
IP RTP Priorityは、WFQ(Weighted Fair Queuing)にPQ(Priority Queuing)の仕組みを追加したキューイング方式です。つまり、WFQを基本としつつ、音声トラフィックのように遅延に敏感な通信を最優先で処理できる仕組みを加えたものです。
LLQ(Low Latency Queuing)がCBWFQ + PQの組み合わせであるのに対し、IP RTP Priorityは WFQ + PQ の組み合わせという点が違いです。
この方式では、特定のUDPポート範囲に属するRTPパケット専用のPQを作成します。Cisco VoIP製品は標準的に UDPポート16384~32767 を利用しており、ルータがこれを検知すると、輻輳時にはRTPパケットをPQに格納し最優先で転送します。PQが空になったときは、他のフローがWFQに基づいて処理されます。
かつてはPPPマルチリンクやFrameRelayといったレガシーWANでよく利用されていましたが、現在では柔軟性の高いLLQが主流です。
IP RTP Priorityの問題点
IP RTP Priorityには次のような制約があります。
- RTPデータパケットはPQで最優先処理されるが、制御用のRTCPパケット(シグナリング)はPQに入らずWFQで処理される
- RTCPには最低保証帯域を与えられないため、制御通信が不安定になる恐れがある
- そのため、音声通信の品質保証という点ではLLQに比べて弱い
この理由から、現在のネットワーク設計ではLLQが選ばれるケースが圧倒的に多いです。
RTPとRTCPの役割
- RTP(Real-time Transport Protocol):音声や映像をリアルタイムに送受信するためのプロトコル。実際のメディアデータを運ぶ。
- RTCP(Real-time Transport Control Protocol):RTPセッションを制御するためのプロトコル。品質情報やセッション管理を行う。
IP RTP PriorityはRTPだけを優先処理するため、RTCPの制御情報が滞ると結果的に音声品質に悪影響を及ぼす可能性があります。
Ciscoルータでの設定方法
IP RTP Priorityのメリットは、非常にシンプルな設定で導入できることです。MQCを利用せず、1行のコマンドで設定できます。
基本構文
(config)# ip rtp priority starting-rtp-port-number port-number-range bandwidth
- starting-rtp-port-number:RTPが利用するUDPポートの最小値(通常16384)
- port-number-range:範囲(通常16383 → 16384~32767をカバー)
- bandwidth:PQに割り当てる最大帯域(kbps単位)
設定例
Cisco(config)# ip rtp priority 16384 16383 45
この設定では、UDPポート16384~32767のRTPトラフィックに対してPQを適用し、最大45kbpsまでの帯域を優先的に利用できます。