ECMP とフローハッシュによる負荷分散
複数経路へ均等に流しても TCP が乱れない理由が、5タプルハッシュによるフロー固定の原理から腑に落ちる。リオーダリング回避とポーラリゼーションの罠まで理解できる。
- 1.ECMP は等コストの複数経路へトラフィックを分散する仕組みで、選択はパケット単位ではなく5タプルのハッシュによるフロー単位で行う。
- 2.同一フローは常に同じ経路へ固定されるため、経路ごとの遅延差によるパケットのリオーダリングを避けられ、TCP の性能劣化を防ぐ。
- 3.全ルータが同じハッシュ関数を使うとトラフィックが偏るポーラリゼーションが起き、ハッシュへの装置固有シードや入力フィールド追加で回避する。
ECMP が解く問題
宛先までのコスト(メトリック)が等しい経路が複数あるとき、それらを1本だけ使い残りを遊ばせるのはもったいない話です。**ECMP(Equal-Cost Multi-Path)**は、コストが同点の複数の next-hop へトラフィックを分散し、リンク帯域を合算して使う仕組みです。データセンターの Clos/leaf-spine 構成では、leaf から spine へ等コストの上りリンクが何本も並ぶのが当たり前で、ECMP は水平方向にスケールさせるための土台になっています。
経路の同点判定そのものはルーティングプロトコルが担います。OSPF や IS-IS は同コストの複数経路を計算し、BGP も maximum-paths 設定下で同点経路を複数残します。これらが FIB に複数の next-hop を載せ、転送時に最長一致で引かれたエントリが「next-hop の集合」を指すことで ECMP が成立します。
リンクを束ねて使う点で LAG(リンクアグリゲーション、LACP)と似ていますが、LAG は L2 で物理リンク群を1本の論理リンクに見せる技術、ECMP は L3 で別々の next-hop へ分散する技術です。分散の判断はどちらもハッシュですが、ECMP は IP 経路レベルで効くため、複数のルータをまたいだ広域な多経路化に使えます。
なぜパケット単位ではなくフロー単位なのか
素朴に考えれば、パケットを1個ずつラウンドロビンで経路へ振れば最も均等になります。しかしこれは TCP にとって致命的です。等コストでも経路ごとに物理的な遅延は微妙に異なるため、後から送ったパケットが先に届く**リオーダリング(順序逆転)**が常時発生します。
TCP 受信側は順序の乱れを「中間のパケットが落ちた兆候」として扱います。3つ重複 ACK が届けば送信側は高速再送に入り、輻輳ウィンドウを縮めます。実際には1個も落ちていなくても、経路差由来の並べ替えだけで再送と輻輳回避が誘発され、スループットが大きく落ちるのです(この挙動の詳細はTCP の再送制御を参照)。
そこで ECMP は、同一フローのパケットは必ず同じ経路へ送るという制約を置きます。フローの中身は順序どおり1本の経路を通るので遅延が一定し、リオーダリングが原理的に起きません。均等性を多少犠牲にしても、フロー単位で固定するのが TCP/UDP のための正解になります。
5タプルハッシュの仕組み
フローを識別し経路へ写像する標準的な方法が5タプルハッシュです。パケットから次の5つのフィールドを取り出します。
5タプル:
src IP 送信元 IP アドレス
dst IP 宛先 IP アドレス
protocol プロトコル番号(TCP=6, UDP=17 など)
src port 送信元ポート
dst port 宛先ポート
この5つを連結してハッシュ関数 H に通し、出力を経路数 K で割った剰余で経路を選びます。
index = H(src_ip, dst_ip, proto, src_port, dst_port) mod K
next_hop = path[index]
5タプルはフローの同一性そのものなので、同じフローのパケットは必ず同じ index を得て同じ経路に固定されます。逆に別フローは異なるハッシュ値になりやすく、多数のフローが経路 K 本へ統計的に均される、というのが ECMP の負荷分散の本質です。なお ICMP のようにポートを持たないトラフィックは3タプル(src/dst IP とプロトコル)で計算します。
index = H mod K は経路数 K が変わると、ほとんどのフローの割り当て先がずれます。リンクが1本落ちて K が減っただけで既存フローが大量に別経路へ飛び、その瞬間に各フローでリオーダリングが起きます。これを抑えるのが、経路追加・削除で再配置されるフローを 1/K 程度に限定するコンシステントハッシュや、各フローの選択を記憶するフローテーブル方式です。ハイエンド装置はこれらを採用して再ハッシュの影響を局所化します。
ハッシュ入力の選び方とトンネルの落とし穴
均等に分散するには、ハッシュ入力にフローごとに散らばるフィールドが含まれることが重要です。送信元ポートはクライアントが接続ごとにほぼランダムに割り当てるため、ばらつきの主役になります。逆に入力が dst IP だけだと、同じサーバーへ向かう全フローが1経路に集中します。
ここで効いてくるのがカプセル化です。VXLAN や IP-in-IP、MPLS でトンネリングすると、中間ルータが見る外側ヘッダは src/dst が固定のトンネル端点になり、内側の多様な5タプルが隠れて分散が効かなくなります。
| 対象トラフィック | 中間ルータが見るもの | 分散の効き |
|---|---|---|
| 素の TCP/UDP | 本来の5タプル | 良好(ポートでよく散る) |
| VXLAN(対策なし) | 外側の固定 src/dst IP | 悪い(1経路に集中しがち) |
| VXLAN(送信元ポート可変) | 内側ハッシュを外側 src port へ写像 | 良好 |
| IPsec ESP | ポートが暗号化で不可視 | 悪い(SPI 等の利用が必要) |
VXLAN はこの問題を、内側パケットのハッシュを外側 UDP の送信元ポートへ書き込むことで解決します。これにより中間ルータは外側5タプルだけ見ても、内側フローの多様性を間接的に反映した分散ができます。QUICのように UDP 上で動くプロトコルでも、送信元ポートが散ること自体は ECMP に有利に働きます。
ポーラリゼーションと再ハッシュ
ECMP 最大の落とし穴がハッシュポーラリゼーション(hash polarization、偏極)です。多段構成で全装置が同一のハッシュ関数を同一入力に対して使うと、ある段で経路 A へ振られたフローは、次の段でも同じ計算結果になり、特定経路に集中したまま下流へ伝播します。せっかく経路が何本あっても、実際には一部しか使われず帯域が偏るのです。
ポーラリゼーションの発生:
段1: H(同じ入力) で振り分け → 偶数番経路へ偏る
段2: 同じ H・同じ入力 → また同じ偏りを再現
結果: 全段で同じ経路群だけが使われ、残りは空く
回避の定石は、各装置のハッシュ計算に**装置固有のシード(ハッシュ・シード/seed)**を混ぜ、同じ5タプルでも段ごとに違う結果が出るようにすることです。実装によっては装置ごとに異なるハッシュ関数や、入力フィールドの並べ替え、ルータ ID の混入で同様の効果を得ます。これにより各段の分散が独立になり、全経路が均等に使われます。
ECMP で「リンクを増やしたのに帯域が伸びない」典型原因は2つ。1つはポーラリゼーション(多段で同一ハッシュを使い経路が偏る)、もう1つはエレファントフロー(巨大な単一フローはフロー固定ゆえ1経路しか使えず、その経路だけ飽和する)。前者は装置固有シードで、後者はフローレットやパケットスプレー等のフロー内分散で対処する、と整理して覚えると答えやすい。
フロー固定の限界とその先
フロー単位の固定は、巨大な単一フロー(エレファントフロー)には無力です。1フローは定義上1経路しか使えないため、10本の経路があってもバックアップやデータ同期のような大流量1本は1リンクを飽和させ、他は空いたまま、という不均衡が起きます。
これを越えるための技術が段階的に存在します。フローレットスイッチングは、TCP のバースト間に生じる十分な無通信ギャップ(経路間の遅延差より長い間隙)を境にフローを小片へ区切り、その境目でだけ経路を切り替えます。ギャップ中はインフライトのパケットが届ききっているため、切り替えてもリオーダリングが起きないのがミソです。さらに踏み込んだ**パケットスプレー(per-packet 分散)**は1パケットずつ撒いて均等性を最大化しますが、リオーダリングを許容する前提が要り、再順序付けに強いトランスポートや専用ハードウェア併用が必要です。L7 まで見て分散する仕組みとの違いはプロキシとロードバランサで整理しています。
まとめ
ECMP は等コスト多経路へトラフィックを分散しますが、その分散単位はフローです。5タプルハッシュで同一フローを同一経路へ固定することで、経路間の遅延差が生むリオーダリングと、それによる TCP の不要な再送・輻輳回避を回避します。代償として、ハッシュ入力の偏りやトンネルによる5タプル不可視は分散の偏りを招き、多段では同一ハッシュがポーラリゼーションを引き起こします。装置固有シード、適切な入力フィールド、コンシステントハッシュ、そしてフローレット/パケットスプレーといった対処を、それぞれが何を解いているかとセットで押さえることが、多経路ネットワークを正しく設計・運用する鍵になります。
ネットワーク Article
ECMP とフローハッシュによる負荷分散を実務で読む
TL;DRは入口です。実際に選ぶ・使う段階では、何を解決するか、何と比較するか、導入後にどこで詰まるかまで見る必要があります。
解決すること
ECMP
比較で見る軸
難易度: advanced / カテゴリ: ネットワーク / タグ数: 5
導入後に効く点
同一フローは常に同じ経路へ固定されるため、経路ごとの遅延差によるパケットのリオーダリングを避けられ、TCP の性能劣化を防ぐ。
先に潰すリスク
用語だけ覚えても、設計・実装・運用でどこに効くかを確認しないと判断を誤る。
- 難易度
- advanced
- カテゴリ
- ネットワーク
- タグ数
- 5
判断チェックリスト
- 自社の用途が「ECMP / ロードバランス」に近いか確認する。
- 強みである「ECMP は等コストの複数経路へトラフィックを分散する仕組みで、選択はパケット単位ではなく5タプルのハッシュによるフロー単位で行う。」が本当に評価軸になるか確認する。
- 注意点の「用語だけ覚えても、設計・実装・運用でどこに効くかを確認しないと判断を誤る。」を運用で吸収できるか確認する。
- 公開値や仕様値は、対象プラン・対象機種・対象リージョンまで確認する。
- 既存システム、ID、ネットワーク、監視、バックアップとの接続方法を先に洗い出す。
- 小さく試してから、本番移行、権限設計、障害時手順、コスト監視を決める。