ブログ
, Juniper Distinguished Eng
ブログ
MPLS によるセグメント ルーティング(SR)
Aug 5, 2019

先週のブログで、SR(セグメント ルーティング)パスはセグメントの順序指定済みリストであることを説明しました。また、セグメントはパケットに 1 つ以上のリンクを通過させる命令であることも説明しました。

 

今週は、MPLS を活用する SR 実装のクラスについて説明します。このような実装は SR-MPLS と呼ばれています。SR-MPLS を十分理解することで、来週のブログを理解するのに役立ちます。来週のブログでは、SR がトラフィック制御アプリケーションをどのようにサポートしているかについて説明します。

 

概要

SR-MPLS では、SR パスは MPLS ラベル スタックとしてエンコードされます。各ラベル スタックのエントリーは、SR パスのセグメントを表します。今週のブログでは、MPLS ラベルを使用して隣接関係セグメントとプレフィックス セグメントをエンコードする方法について説明します。

 

隣接関係セグメント

 

3Capture1.PNG

1:隣接関係セグメント

図 1 では、SR パスで R1 が R4 に接続されています。この SR パスには、3 つの隣接関係セグメントが含まれています。セグメント 1 ではパケットがリンク R1->R2 を通過し、セグメント 2 ではパケットがリンク R2->R3 を通過します。セグメント 3 ではパケットがリンク R3->R4 を通過します。

 

R1 が SR ドメインの外部からパケットを受信すると、パケットにポリシーが適用されます。ポリシーにより R1 では、図のように SR パスを介してパケットを転送することがあります。この場合、R1 では 2 つのエントリーを含む MPLS ラベル スタックを適用します。スタックの一番上のエントリーはセグメント 2 を表し、MPLS ラベル 1002 を保持しています。スタックの一番下のエントリーはセグメント 3 を表し、MPLS ラベル 1003 を保持しています。

 

MPLS ラベル スタックが適用されると、R1 はセグメント 1 (すなわち、リンク R1->R2)を介してパケットを転送します。パケットが R2 に到着すると、R2 はラベル スタックの一番上のエントリーからラベル(すなわち、1002)を抽出し、その FIB(Forwarding Information Base)内で対応するエントリーを検索します。対応する FIB エントリーには、命令(すなわち、POP)とネクストホップ(すなわち、R3)が含まれています。そのため、R2 はラベル スタックの一番上のエントリーをポップして、セグメント 2(すなわち、リンク R2->R3)を介してパケットを転送します。

 

パケットが R3 に到着すると、R3 はラベル スタックの残りのエントリーからラベル(すなわち、1003)を抽出し、その FIB 内で対応するエントリーを検索します。対応する FIB エントリーには、命令(すなわち、POP)とネクストホップ(すなわち、R4)が含まれています。そのため、R3 はラベル スタックの残りのエントリーをポップして、セグメント 3(すなわち、リンク R3->R4)を介してパケットを転送します。パケットは MPLS カプセル化を行うことなく R4 に到着します。

 

プレフィックス セグメント

 

3Capture2.PNG

2:プレフィックス セグメント

 

図 2 では、SR パスで R1 が R4 を介して R7 に接続されています。SR パスには 2 つの プレフィックス セグメントが含まれています。セグメント 1 は、パケットが R1 から R4 までの最小コスト パスを通過するプレフィックス セグメントです。また、セグメント 2 は、パケットが R4 から R7 までの最小コスト パスを通過するプレフィックス セグメントです。このネットワークでは、すべてのリンクが同じ IGP メトリック(すなわち、10)で設定されています。そのため、R1 から R4 への最小コスト パスはリンク R1->R2、R2->R3、および R3->R4 を通過し、R4 から R7 への最小コスト パスはリンク R4->R8 およびリンク R8->R7 を通過します。

 

R1 が SR ドメインの外部からパケットを受信すると、パケットにポリシーが適用されます。ポリシーにより R1 では、図のように SR パスを介してパケットを転送することがあります。この場合、R1 では 2 つのエントリーを含む MPLS ラベル スタックを適用します。ラベル スタックの一番上のエントリーはセグメント 1 を表し、ラベル 2001 を保持しています。ラベル スタックの一番下のエントリーはセグメント 2 を表し、ラベル 2002 を保持しています。

 

MPLS ラベル スタックが適用されると、R1 はリンク R1->R2 を介してパケットをセグメント 1 に転送します。パケットが R2 に到着すると、R2 はラベル スタックの一番上のエントリーからラベル(すなわち、2001)を抽出し、その FIB 内で対応するエントリーを検索します。対応する FIB エントリーには、命令(すなわち、SWAP - 3001)とネクストホップ(すなわち、R3)が含まれています。そのため、 R2 は一番上のラベルを新しい値(すなわち、3001)でオーバーライドし、パケットを R3 に転送します。

 

パケットが R3 に到着すると、R3 はラベル スタックの一番上のエントリーからラベル(すなわち、3001)を抽出し、その FIB 内で対応するエントリーを検索します。対応する FIB エントリーには、命令(すなわち、POP)とネクストホップ(すなわち、R4)が含まれています。そのため、R4 はラベル スタックの一番上のエントリーをポップして、リンク R3-->R4 を介してセグメント 2 にパケットを転送します。

 

パケットが R4 に到着すると、R4 はラベル スタックの残りのエントリーからラベル(すなわち、2002)を抽出し、その FIB 内で対応するエントリーを検索します。対応する FIB エントリーには、命令(すなわち、SWAP - 3002)とネクストホップ(すなわち、R8)が含まれています。そのため、 R4 は残りのラベルを新しい値(すなわち、3002)でオーバーライドし、パケットを R8 に転送します。

 

パケットが R8 に到着すると、R8 はラベル スタックの残りのエントリーからラベル(すなわち、3002)を抽出し、その FIB 内で対応するエントリーを検索します。対応する FIB エントリーには、命令(すなわち、POP)とネクストホップ(すなわち、R7)が含まれています。そのため、R8 ではラベル スタックの残りのエントリーをポップして、MPLS カプセル化を行うことなくパケットを R7 に転送します。

 

Penultimate Hop PoppingPHP)と Explicit Null ラベル

上記の例では、各セグメントで PHP プロシージャが実行されます。パケットがセグメントを通過すると、そのセグメントの最後から 2 番目のノードがそのセグメントに関連付けられているラベルをポップします。

 

SR パスに未通過の他のセグメントが含まれている場合、現在のセグメントのエグレス ノードは次のセグメントのイングレス ノードでもあります。この場合、パケットは次のセグメントのラベルがスタックの一番上に公開された状態でそのノードに到着します。SR パスに未通過の他のセグメントが含まれていない場合、セグメントのエグレス ノードはパスのイングレス ノードでもあります。この場合、パケットは MPLS カプセル化を行うことなくパスのエグレス ノードに到着します。

 

場合によっては、SR パスの最後のリンクが MPLS カプセル化を行うことなくパケットを伝送できないことがあります。リンクが IPv4 のみをサポートしているのに対して、パケットが IPv6 パケットである場合などです。この問題を回避するため、SR イングレス ノードでは MPLS ラベル スタックの一番上に MPLS の Explicit Null ラベルを追加できます。

 

最後のセグメントの最後から 2 番目のノードが、最後のセグメントに関連付けられているラベルをポップすると、Explicit Null ラベルが公開されます。その後、パケットをパスのエグレス ノードに転送します。パスのエグレス ノードは Explicit Null ラベルをポップして、パケットの処理を続行します。

 

まとめ

今週は、SR-MPLS で SR パスを MPLS ラベル スタックとしてエンコードする方法について確認しました。SR- MPLS が FIB を使用してパケットを処理する方法についても学習しました。

 

来週は、SR をトラフィック制御アプリケーションに適用する方法について取り上げます。

 

0 件の賞賛