【実務・中級編】 イーサネットにおけるQoS(Quality of Service)の基本概念と重要性 – インフラ・物理&L2/L3ネットワーク基礎実践ガイド

なぜ「ベストエフォート」は悪夢を生むのか?——現場で鍛えるQoS設計の極意

ネットワークエンジニアとして現場を歩いていると、よく耳にするのが「最近、会議の音声がカクつくんだよね」という悲鳴です。Web APIを駆使したモダンなサービスを開発しているエンジニアにとって、ネットワークは「繋がって当たり前」のインフラかもしれませんが、パケットの視点に立つと、そこは常に「弱肉強食の戦場」です。

イーサネットの基本思想は「ベストエフォート」。どんなに急いでいるパケットも、巨大なファイル転送の裏側で平等に扱われ、バッファが溢れれば容赦なく破棄(ドロップ)されます。この「平等」こそが、リアルタイム通信における最大の敵なのです。

本稿では、L2/L3の境界でパケットに「特急券」を与えるQoS(Quality of Service)の仕組みを、現場の実践的な視点から紐解いていきましょう。

—

1. パケットに宿る「優先順位」の正体

QoSの基本は、パケットに識別子を付与し、ネットワーク機器がそれをどう扱うか(キューイング)を定義することです。ここで重要になるのが「マーキング」です。

L2レベル:802.1p (CoS)

イーサネットフレームのヘッダー(VLANタグ内)にある3ビットのフィールドです。0から7の値を設定できます。L2スイッチを通過するだけの環境であれば、これで十分な場合も多いですが、ルーターを越えると消滅してしまうのが弱点です。

L3レベル:DSCP (Differentiated Services Code Point)

RFC 2474で定義された、IPヘッダーの「TOSフィールド(現在はDSフィールド)」を利用する方式です。6ビットの識別子(0〜63)を使い、より詳細な優先制御が可能です。現場で「QoS設定」という場合、基本はこのDSCPを指します。

  • EF (Expedited Forwarding: 46): 音声用。「最優先」。
  • AF (Assured Forwarding): 映像通信など、「帯域保証型」。
  • BE (Best Effort: 0): 通常のトラフィック。

—

2. 実践:スイッチでの設定とトラフィック監視

CiscoのCatalystやNexusのようなスイッチでは、受信したパケットのDSCP値を信頼するか、あるいは書き換える(ポリシーベース)設定を行います。

# 信頼境界の設定:IP電話からのトラフィックはDSCP値をそのまま信用する
interface GigabitEthernet1/0/1
 description Voice_VLAN_Port
 switchport mode access
 switchport access vlan 10
 # 受信したパケットのDSCP値を信頼してマーキングを尊重する
 mls qos trust dscp

# トラフィックのクラス分け(クラスマップの定義)
class-map match-any VOICE-TRAFFIC
 match dscp ef  # DSCP値がEFのパケットを抽出

# ポリシーの適用(ポリシーマップ)
policy-map QOS-POLICY
 class VOICE-TRAFFIC
  priority percent 30  # 帯域の30%を音声に絶対確保(優先キュー)

このように、ネットワーク機器側で「どのパケットが重要か」を定義し、キューイングアルゴリズム(LLQ: Low Latency Queuingなど)で優先的に送信することで、パケットのジッタ(ゆらぎ)を劇的に抑えられます。

—

3. アプリケーション層から「特急券」を渡す

インフラ側で頑張るだけでなく、Webエンジニア側からもQoSを意識した設計が可能です。例えば、Pythonでリアルタイム性の高い通信を行う際、OSやミドルウェアを介してDSCP値をセットするコード例です。

import socket

# ソケットを作成
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)

# DSCP値を設定 (EF=46を左に2ビットシフトしてセット)
# IPヘッダーのTOSフィールドに書き込むための処理
dscp_ef = 46 << 2
s.setsockopt(socket.IPPROTO_IP, socket.IP_TOS, dscp_ef)

# これで送信されるパケットには、OSレベルでDSCP値がマークされる
s.sendto(b"Voice_Packet_Data", ("192.168.1.100", 5060))

※注意点:クラウド環境(AWSやGCP等)では、パケットが仮想ネットワークを通過する際にDSCP値がクリアされることが多々あります。クラウドネイティブな環境では、ネットワークのレイヤーではなく、アプリケーション層でのバッファリングやプロトコル選定(QUICなど)が、実質的なQoSとして機能することを忘れないでください。

—

4. トラブルシューティング:何がパケットを殺しているのか?

運用現場で「遅延が発生している」と言われたら、まず確認すべきは「ドロップカウント」です。

# インターフェースの統計情報を確認
show interface GigabitEthernet1/0/1 | include drop

もし output drops が増えているなら、それは明らかに「帯域不足」か「バッファ溢れ」です。その際は、どのトラフィックが帯域を食いつぶしているのか、NetFlow や sFlow を使って可視化しましょう。

現場のTips:

  • いきなり全部を優先しない: 「全部大事」は「全部大事じゃない」と同じです。まずは音声(VoIP)と制御信号(Signaling)を最優先にする方針を固めてください。
  • MTUの不一致を疑う: QoS設定を施した直後、特定の通信だけが遅くなるなら、パケットサイズが大きくなりすぎたことによる断片化(フラグメンテーション)が原因かもしれません。

—

まとめ:ネットワークは「設計」で語れ

QoSは、単なる設定コマンドの羅列ではありません。「ビジネスにとって何が最も重要な通信か」という哲学をネットワークに落とし込む作業です。

コードを書くとき、サーバーを構築するとき、ふと「この通信は他のトラフィックにどう影響を与えるか?」と立ち止まって考えてみてください。その視点こそが、大規模システムを支えるシニアエンジニアの矜持です。

それでは、良いパケットの旅を。もしネットワークの深淵で迷ったら、またいつでもこのブログを覗きに来てください。

コメント

タイトルとURLをコピーしました