L2の片隅に潜む「1ビットの防衛線」:IEEE 802.1Q DEI(旧CFI)の真実と QoSの現場
ネットワークの設計やトラブルシューティングの現場にいると、私たちはどうしても上位層、つまりTCPの輻輳制御(BBRやCubic)や、HTTP/2・HTTP/3のストリーム多重化、あるいはAPIのレイテンシに目を奪われがちになります。
しかし、パケットの足元を支えるレイヤー2の世界はどうなっているでしょうか。
トランクポートを流れる無数のフレーム。その中にひっそりと挟み込まれた4バイトのタグ、それが IEEE 802.1Q です。
今回は、その802.1Qタグの中身、特にTCI(Tag Control Information)の深部にある、DEI(Drop Eligible Indicator)という「たった1ビットのフラグ」に焦点を当てます。
「名前は聞いたことがあるけれど、実際の本番環境でどう動いているのかピンとこない」「旧CFIから何が変わったのか?」そんな疑問を持つインフラ・バックエンドエンジニアに向けて、現場の泥臭い知見を交えて解説しましょう。
—
1. IEEE 802.1Qタグの構造とTCIの正体
まず、私たちが普段何気なく扱っているイーサネットフレームが、VLAN環境でどう変形するのかを思い出してください。
通常のイーサネットフレーム(14バイトのヘッダー)に対し、VLANタグが付与されると、Source MACアドレスの直後に 4バイト(32ビット)の802.1Qタグ が挿入されます。
この4バイトの内部構造は、大きく2つに分かれています。
1. TPID (Tag Protocol Identifier) : 16ビット (0x8100) – 「これはVLANタグですよ」を示すマジックナンバー。
2. TCI (Tag Control Information) : 16ビット – QoSとVLAN IDを司る制御情報。
そして、この16ビットのTCIこそが今回の主役です。TCIはさらに以下の3つのフィールドに細分化されます。
- PCP (Priority Code Point) : 上位3ビット(値 0〜7)。L2レベルのCoS(Class of Service)を決定し、8段階の優先度を表現します。
- DEI (Drop Eligible Indicator) : 1ビット。今回のテーマです。
- VID (VLAN Identifier) : 下位12ビット(値 0〜4095)。所属するVLAN番号を指定します。
0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| TPID (0x8100) | TCI (16 bits) |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| | VID (12 bits) |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+---------------------+
^ ^ ^
| | +--- VID (VLAN ID)
| +----------------------- DEI (1 bit)
+------------------------------- PCP (3 bits)
このTCIの中央に鎮座する1ビット、それが DEI です。
—
2. CFIからDEIへ:名前の変更が意味する「L2 QoSの本質」
歴史的な背景を少しお話しましょう。
もともと、この1ビットはIEEE 802.1Q-1998の仕様書において CFI (Canonical Format Indicator) と呼ばれていました。当時は、トークンリング(Token Ring)やFDDIといった、イーサネットとは異なるMACアドレシング(Canonical形式 vs Non-Canonical形式)を持つレガシーLANとイーサネットの間でブリッジングを行う際、MACアドレスのビット順序(エンディアンのようなもの)を識別するために使われていました。
しかし、現代のネットワークにおいて、トークンリングが実稼働している現場に出くわすことは(特命の考古学プロジェクトでもない限り)まずありません。
IEEEは2011年の 802.1Q-2011改訂(現在は 802.1Q-2018に統合)において、この死絶したCFIビットの役割を完全に廃止し、DEI (Drop Eligible Indicator) という新しい意味を定義しました。
DEIの役割:輻輳時の「身代わり」
DEIの名前の通り、これは 「Drop Eligible(破棄適格)」 を示すフラグです。
- DEI = 0 : 通常パケット。スイッチのキューが混み合っても、できる限り保持・転送する。
- DEI = 1 : 破棄候補パケット。ネットワーク機器(L2/L3スイッチ)のバッファが輻輳(コンジェスチョン)を起こし始めた際、優先的にドロップされても文句が言えないパケット。
つまり、PCP(優先度)が同じクラスのトラフィックであっても、DEIを立てることで「ベストエフォートの中でも、こっちは少し重要度が低いから、溢れたら捨てていいよ」という意思表示をネットワークに伝えることができるのです。
—
3. 通信フローとスイッチ内部の動作メカニズム
では、このDEIがスイッチの内部でどのように処理されるのか、具体的なパケットの旅路を見てみましょう。
[送受信端末 (Server A)]
│
│ (1) トランクポート経由でパケット送信 (PCP=0, DEI=1)
▼
[エッジL2スイッチ (Switch 1)]
│
│ (2) イングレスキューでQoS分類 (CoS -> 内部DSCP/Queueへマッピング)
▼
[コアスイッチ (Switch 2)] ──【ここでバッファが輻輳発生!】
│
│ (3) エグレスキュー溢れ検知 ──> DEI=1 のフレームを優先的に破棄 (Tail Drop / WRED)
▼
[宛先端末 (Server B)]
1. マーキング(送信側):
アプリケーションやルーター、あるいはエッジスイッチのポリシー(QoSポリシー)により、重要度の低いバックグラウンド通信(例:大容量のログ転送やバックアップトラフィック)のフレームに対して、PCP=0、DEI=1を付与して送り出します。
2. キューイング(L2/L3スイッチ内部):
スイッチは受信したフレームのPCPとDEIを参照し、内部のどの出力キュー(Output Queue)に入れるかを決定します。多くのモダンなスイッチでは、同じキューに入ったパケットであっても、DEIが立っているものと立っていないものを区別して管理します。
3. 輻輳時の破棄(ドロップ):
ネットワークの帯域が限界を迎え、バッファが溢れそうになると、スイッチは WRED (Weighted Random Early Detection) などの輻輳回避アルゴリズムを発動します。この際、DEI=1のフレームは、DEI=0のフレームよりも遥かに低い閾値で破棄の対象となります。
結果として、Web APIのトランザクションやリアルタイム音声といった重要度の高いパケット(DEI=0)の帯域とレイテンシが守られるという仕組みです。
—
4. 実務での設定・検証アプローチ
「理論は分かったが、実際のインフラ機器でどう設定し、どう検証するのか?」
ここからは、シスコシステムズ(Cisco IOS-XE / Catalyst)や Linux(iproute2)環境を例に、具体的な設定とデバッグ手法を見ていきましょう。
4.1. Cisco CatalystスイッチでのQoSポリシーマップ設定例
Cisco環境において、特定のトラフィックに対してDEI(Cisco用語では以前の名残で Discard Eligibility や Drop-Precedence と呼ばれることが多いですが、802.1Qヘッダー上ではDEIとして出力されます)を操作する設定例です。
! 1. マッチさせるアクセスリストの定義(例: バックアップ用の大容量通信)
ip access-list extended ACL_BULK_BACKUP
permit tcp any any eq 873
! 2. クラスマップの作成
class-map match-all CLASS_BULK
match access-group name ACL_BULK_BACKUP
! 3. ポリシーマップの作成(CoSを0に設定しつつ、DEIを1にマークする)
policy-map PM_MARK_DEI
class CLASS_BULK
set cos 0
! 802.1QヘッダーのDEIビットを立たせる(プラットフォームによりコマンドが異なる場合があります)
set-discard-class 1
! 4. インターフェイスへの適用
interface GigabitEthernet0/1
service-policy input PM_MARK_DEI
4.2. Linux (iproute2 / tc) を使ったL2/L3プライオリティの制御
仮想マシンやコンテナホストからVLANタグ付きフレームを送信し、カーネル側でQoS制御を行う場合、tc (traffic control) コマンドを使用します。
# eth0.100 インターフェイスを作成し、VLAN ID 100を付与
ip link add link eth0 name eth0.100 type vlan id 100
# タグ内のPCPおよびDEIを制御するため、SO_PRIORITYとSKB(Socket Buffer)のマッピングを行う
# 実務では、iptables/nftablesのMARKと組み合わせてパケットにDSCPを付与し、
# 最終的にL2レイヤーでPCP/DEIにマッピングする設計が一般的です。
# 例: 優先度に応じたパケットマーク付与の確認
iptables -t mangle -A OUTPUT -p tcp --dport 443 -j MARK --set-mark 0x2
4.3. パケットキャプチャ(tcpdump / Wireshark)での確認方法
現場でのトラブルシューティングにおいて、パケットが意図通りのタグをつけて流れているかを確認するには、tcpdumpでキャプチャし、Wiresharkで詳細を覗くのが一番確実です。
# インターフェイスを指定してVLANタグを含むパケットをpcap形式で保存
sudo tcpdump -i eth0 -w vlan_debug.pcap
Wiresharkでこのpcapを開いた際、パケット詳細の IEEE 802.1Q Virtual LAN ツリーを展開すると、次のようなフィールドを確認できます。
- Priority Code Point (PCP):
0 - Drop Eligible Indicator (DEI):
1 (True)*(※古いWiresharkでは CFI と表示されることがあります)* - ID (VLAN ID):
100
もし本番環境で「特定の重要APIのレスポンスが、なぜかバックグラウンド処理と一緒にドロップされている」という現象に遭遇したら、このDEIビットが意図せず 1 に書き換わっていないか(または、アップリンクのキャリア網やL2スイッチのポリサーで不本意にマーキングされていないか)をキャプチャで追うのが、シニアエンジニアの定石です。
—
まとめ:見えない1ビットを味方につける
IEEE 802.1QのDEIは、普段のアプリケーション開発や標準的なWeb APIの設計においては、直接コードを書くレイヤーからは見えにくい場所にあります。しかし、クラウド基盤の物理ネットワーク、データセンター間のL2延伸、あるいはキャリア回線を利用したレイヤー2VPNの設計においては、「どのトラフィックを犠牲にして、どのトラフィックを守るか」を決定づける極めて重要な防衛線です。
ネットワークの挙動に違和感を覚えたとき、あるいは大規模な輻輳テストを行うときは、ぜひこの「たった1ビットのDEI」の存在を思い出してください。パケットの旅路の解像度が一段と上がり、より堅牢なインフラ設計ができるはずです。
コメント