2. ラベルスタック
- ラベルスタック
2.1. ラベルスタックのエンコーディング
ラベルスタックは、「ラベルスタックエントリ」のシーケンスとして表されます。各ラベルスタックエントリは4オクテットで表されます。これを図1に示します。
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 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ ラベル | Label | Exp |S| TTL | スタック +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ エントリ
Label: ラベル値、20ビット
Exp: 実験的使用、3ビット
S: スタックの底(Bottom of Stack)、1ビット
TTL: Time to Live、8ビット
図 1
ラベルスタックエントリは、データリンク層ヘッダーの後、ネットワーク層ヘッダーの前に表示されます。ラベルスタックの最上部はパケット内で最も早く表示され、最下部は最も遅く表示されます。ネットワーク層パケットは、Sビットが設定されたラベルスタックエントリの直後に続きます。
各ラベルスタックエントリは、次のフィールドに分割されます。
1. スタックの底 (S)
このビットは、ラベルスタックの最後のエントリ(つまり、スタックの底)に対して1に設定され、他のすべてのラベルスタックエントリに対して0に設定されます。
2. Time to Live (TTL)
この8ビットフィールドは、Time-to-Live値をエンコードするために使用されます。このフィールドの処理については、セクション2.4で説明します。
3. 実験的使用 (Experimental Use)
この3ビットフィールドは、実験的使用のために予約されています。
4. ラベル値 (Label Value)
この20ビットフィールドは、ラベルの実際の値を伝送します。
ラベル付きパケットを受信すると、スタックの最上部にあるラベル値が検索されます。検索が成功した結果、次のことがわかります。
a) パケットの転送先となるネクストホップ。
b) 転送前にラベルスタックに対して実行される操作。この操作は、最上部のラベルスタックエントリを別のエントリに置き換えるか、ラベルスタックからエントリをポップするか、最上部のラベルスタックエントリを置き換えてから1つ以上の追加エントリをラベルスタックにプッシュすることです。
ネクストホップとラベルスタック操作を知ることに加えて、発信データリンクのカプセル化、およびパケットを適切に転送するために必要なその他の情報を知ることもできます。
いくつかの予約済みラベル値があります。
i. 値0は「IPv4明示的NULLラベル」(IPv4 Explicit NULL Label)を表します。このラベル値は、ラベルスタックの底でのみ有効です。これは、ラベルスタックをポップし、パケットの転送をIPv4ヘッダーに基づいて行う必要があることを示します。
ii. 値1は「ルーターアラートラベル」(Router Alert Label)を表します。このラベル値は、ラベルスタックの底以外の任意の場所で有効です。受信したパケットのラベルスタックの最上部にこのラベル値が含まれている場合、処理のためにローカルソフトウェアモジュールに配信されます。パケットの実際の転送は、スタック内のその下のラベルによって決定されます。ただし、パケットがさらに転送される場合、転送前にルーターアラートラベルをラベルスタックにプッシュし直す必要があります。このラベルの使用は、IPパケットでの「ルーターアラートオプション」の使用に似ています[5]。このラベルはスタックの底に存在できないため、特定のネットワーク層プロトコルに関連付けられていません。
iii. 値2は「IPv6明示的NULLラベル」(IPv6 Explicit NULL Label)を表します。このラベル値は、ラベルスタックの底でのみ有効です。これは、ラベルスタックをポップし、パケットの転送をIPv6ヘッダーに基づいて行う必要があることを示します。
iv. 値3は「暗黙的NULLラベル」(Implicit NULL Label)を表します。これは、LSRが割り当てて配布できるラベルですが、実際にはカプセル化に表示されません。LSRがスタックの最上部のラベルを新しいラベルに置き換える場合でも、新しいラベルが「暗黙的NULL」である場合、LSRは置き換えを行う代わりにスタックをポップします。この値はカプセル化に表示されない場合がありますが、ラベル配布プロトコルで指定する必要があるため、値が予約されています。
v. 値4〜15は予約されています。
2.2. ネットワーク層プロトコルの決定
最後のラベルがパケットのラベルスタックからポップされると(スタックが空になる)、パケットのそれ以降の処理はパケットのネットワーク層ヘッダーに基づきます。したがって、スタックから最後のラベルをポップするLSRは、パケットのネットワーク層プロトコルを識別できる必要があります。ただし、ラベルスタックには、ネットワーク層プロトコルを明示的に識別するフィールドは含まれていません。これは、ネットワーク層プロトコルのIDは、スタックの底からポップされたラベルの値、および場合によってはネットワーク層ヘッダー自体の内容から推測できる必要があることを意味します。
したがって、最初のラベルがネットワーク層パケットにプッシュされるとき、ラベルは特定のネットワーク層のパケットにのみ使用されるものであるか、または指定されたネットワーク層プロトコルのセットにのみ使用されるものである必要があります。ここで、指定されたネットワーク層のパケットは、ネットワーク層ヘッダーを検査することで区別できます。さらに、そのラベルがパケットの転送中に別のラベル値に置き換えられるたびに、新しい値も同じ基準を満たすものでなければなりません。これらの条件が満たされない場合、パケットから最後のラベルをポップするLSRは、パケットのネットワーク層プロトコルを識別できません。
これらの条件を遵守しても、中間ノードがパケットのネットワーク層プロトコルを識別できるとは限りません。通常の状態ではこれは必要ありませんが、望ましいエラー状態があります。たとえば、中間LSRがラベル付きパケットが配信不能であると判断した場合、そのLSRはパケットのネットワーク層に固有のエラーメッセージを生成することが望ましい場合があります。中間LSRがネットワーク層を識別するための唯一の手段は、最上部のラベルとネットワーク層ヘッダーの検査です。したがって、中間ノードがラベル付きパケットに対してプロトコル固有のエラーメッセージを生成できるようにするには、スタック内のすべてのラベルが、スタックの底に表示されるラベルに対して上記で指定された基準を満たす必要があります。
何らかの理由でパケットを転送できない場合(たとえば、データリンクMTUを超えている場合)、およびそのネットワーク層プロトコルを識別できないか、エラー状態を処理するための指定されたプロトコル依存ルールがない場合、パケットは静かに破棄されなければなりません。
2.3. ラベル付きIPパケットのICMPメッセージの生成
セクション2.4およびセクション3では、ラベル付きIPパケットに対してICMPメッセージを生成することが望ましい状況について説明しています。特定のLSRがICMPパケットを生成し、そのパケットをIPパケットの送信元に送信できるようにするには、2つの条件を満たす必要があります。
1. そのLSRが、特定のラベル付きパケットがIPパケットであると判断できること。
2. そのLSRが、パケットのIP送信元アドレスにルーティングできること。
条件1については、セクション2.2で説明しています。次の2つのサブセクションでは、条件2について説明します。ただし、条件2がまったく成立しない場合もあり、これらの場合はICMPメッセージを生成できません。
2.3.1. トランジットルーティングドメインを介したトンネリング
MPLSを使用してトランジットルーティングドメインを「トンネリング」し、外部ルートがドメインの内部ルーターにリークされない場合を想定します。たとえば、内部ルーターはOSPFを実行しており、そのOSPFドメイン内の宛先に到達する方法しか知らない場合があります。ドメインには、相互にBGPを話す複数の自律システム境界ルーター(ASBR)が含まれる場合があります。ただし、この例では、BGPからのルートはOSPFに配布されず、ASBRではないLSRはBGPを実行しません。
この例では、ASBRのみが任意のパケットの送信元へのルーティング方法を知っています。内部ルーターがIPパケットの送信元にICMPメッセージを送信する必要がある場合、ICMPメッセージのルーティング方法はわかりません。
解決策の1つは、1つ以上のASBRに「デフォルト」をIGPに注入させることです。(注:これはBGPによって「デフォルト」が伝送されることを必要としません。)これにより、ドメインを離れる必要のあるラベルなしパケット(ICMPパケットなど)が、完全なルーティング情報を持つルーターに送信されるようになります。完全なルーティング情報を持つルーターは、パケットをトランジットドメインに送り返す前にラベルを付けるため、トランジットドメイン内でデフォルトルーティングを使用してもループは発生しません。
このソリューションは、グローバルに一意のアドレスを持つパケット、およびすべてのASBRが完全なルーティング情報を持つネットワークに対してのみ機能します。次のサブセクションでは、これらの条件が満たされない場合に機能するソリューションについて説明します。
2.3.2. パブリックバックボーンを介したプライベートアドレスのトンネリング
MPLSを使用してルーティングドメインをトンネリングする場合、断片化されたパケットの送信元アドレスにまったくルーティングできない場合があります。これは、たとえば、パケットに含まれるIPアドレスがプライベート(つまり、グローバルに一意ではない)アドレスであり、MPLSがパブリックバックボーンを介してそれらのパケットをトンネリングするために使用されている場合に当てはまります。この環境では、ASBRへのデフォルトルーティングは機能しません。
この環境では、パケットの送信元にICMPメッセージを送信するために、元のパケットからラベルスタックをICMPメッセージにコピーし、ICMPメッセージをラベルスイッチングすることができます。これにより、メッセージは送信元ではなく、元のパケットの宛先の方向に進みます。メッセージが宛先ホストまでずっとラベルスイッチングされない限り、最終的にはラベルなしで、元のパケットの送信元へのルーティング方法を知っているルーターに到達し、その時点でメッセージは正しい方向に送信されます。
この手法は、ICMPメッセージが「時間超過」メッセージまたは「フラグメンテーションが必要でDFが設定されているため宛先到達不能」メッセージである場合に非常に役立ちます。
元のパケットからICMPメッセージにラベルスタックをコピーする場合、ラベル値は正確にコピーする必要がありますが、ラベルスタック内のTTL値は、ICMPメッセージのIPヘッダーに配置されるTTL値に設定する必要があります。このTTL値は、ICMPメッセージがたどる必要のある迂回ルートを許可するのに十分な長さである必要があります。
パケットのTTL期限切れがルーティングループの存在によるものである場合、この手法を使用すると、ICMPメッセージもループする可能性があることに注意してください。ICMPメッセージは、ICMPメッセージを受信した結果として送信されることはなく、多くの実装ではICMPメッセージを生成できるレートが制限されているため、これが問題になるとは予想されません。
2.4. Time to Live (TTL) フィールドの処理
2.4.1. 定義
ラベル付きパケットの「着信TTL」は、パケット受信時の最上部のラベルスタックエントリのTTLフィールドの値として定義されます。
ラベル付きパケットの「発信TTL」は、次のうち大きい方として定義されます。
a) 着信TTLから1を引いた値、
b) ゼロ。
2.4.2. プロトコルに依存しないルール
ラベル付きパケットの発信TTLが0の場合、ラベル付きパケットをそれ以上転送してはなりません(MUST NOT)。また、ラベルスタックを取り除いて、パケットをラベルなしパケットとして転送してもなりません。ネットワーク内でのパケットの寿命は期限切れと見なされます。
ラベルスタックエントリのラベル値に応じて、パケットは単に破棄される場合(MAY)もあれば、エラー処理のために適切な「通常の」ネットワーク層に渡される場合(MAY)もあります(たとえば、ICMPエラーメッセージの生成のため、セクション2.3を参照)。
ラベル付きパケットが転送されるとき、ラベルスタックの最上部にあるラベルスタックエントリのTTLフィールドは、発信TTL値に設定する必要があります(MUST)。
発信TTL値は着信TTL値のみの関数であり、転送前にラベルがプッシュまたはポップされたかどうかとは無関係であることに注意してください。スタックの最上部にないラベルスタックエントリのTTLフィールドの値には意味がありません。
2.4.3. IP依存ルール
「IP TTL」フィールドを、IPv4 TTLフィールドの値、またはIPv6ホップ制限フィールドの値(該当する方)として定義します。
IPパケットが最初にラベル付けされるとき、ラベルスタックエントリのTTLフィールドはIP TTLフィールドの値に設定する必要があります(MUST)。(IP処理の一部としてIP TTLフィールドを減らす必要がある場合は、これがすでに行われていると想定されます。)
ラベルがポップされ、結果のラベルスタックが空の場合、IP TTLフィールドの値は、上記で定義された発信TTL値に置き換える必要があります(SHOULD)。IPv4では、これにはIPヘッダーチェックサムの変更も必要です。
ネットワーク管理者が、MPLSドメイン内のLSPホップ数だけIPv4 TTLを減らすのではなく、MPLSドメインを通過するときにIPv4 TTLを1つ減らすことを好む状況がある可能性があることは認識されています。
2.4.4. 異なるカプセル化間の変換
LSRは、たとえばラベルスイッチング制御ATM(LC-ATM)インターフェイス[9]を介してラベル付きパケットを受信し、PPPまたはLANリンクを介して送信する必要がある場合があります。その場合、着信パケットはこのドキュメントで指定されたカプセル化を使用して受信されませんが、発信パケットはこのドキュメントで指定されたカプセル化を使用して送信されます。
この場合、「着信TTL」の値は、たとえばLC-ATMインターフェイスでラベル付きパケットを伝送するために使用される手順によって決定されます。その後、TTL処理は上記のように進行します。
LSRは、PPPまたはLANリンクを介してラベル付きパケットを受信し、たとえばLC-ATMインターフェイスを介して送信する必要がある場合があります。その場合、着信パケットはこのドキュメントで指定されたカプセル化を使用して受信されますが、発信パケットはこのドキュメントで指定されたカプセル化を使用して送信されません。この場合、「発信TTL」の値を伝送する手順は、たとえばLC-ATMインターフェイスでラベル付きパケットを伝送するために使用される手順によって決定されます。