メインコンテンツまでスキップ

4.4 ルーティングヘッダー (Routing Header)

Routing ヘッダーは、IPv6 の送信元が宛先に到達する途中で「訪問 (visited)」すべき一つ以上の中間ノードを列挙するために使用します。この機能は IPv4 の Loose Source and Record Route オプションと非常に類似しています。Routing ヘッダーは直前のヘッダーの Next Header 値 43 によって識別され、以下の形式を持ちます。

+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Next Header | Hdr Ext Len | Routing Type | Segments Left |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| |
. .
. type-specific data .
. .
| |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

次ヘッダー (Next Header) — 8 ビットのセレクター。Routing ヘッダーの直後に続くヘッダーのタイプを識別します。IPv4 の Protocol フィールドと同じ値を使用します [RFC-1700 et seq.]。

ヘッダー拡張長 (Hdr Ext Len) — 8 ビットの符号なし整数。Routing ヘッダーの長さ(8 オクテット単位)。最初の 8 オクテットは含みません。

ルーティングタイプ (Routing Type) — 特定の Routing ヘッダーバリアントの 8 ビット識別子。

残りセグメント数 (Segments Left) — 8 ビットの符号なし整数。残りのルーティングセグメント数、すなわち最終宛先に到達する前にまだ訪問すべき明示的に列挙された中間ノードの数。

タイプ固有データ (type-specific data) — 可変長フィールド。そのフォーマットは Routing Type によって決まり、完全な Routing ヘッダーの長さが 8 オクテットの整数倍になるような長さを持ちます。

受信したパケットを処理する際に、ノードが認識できない Routing Type 値を持つ Routing ヘッダーに遭遇した場合、ノードが取るべき動作は Segments Left フィールドの値によって異なります。

Segments Left がゼロの場合、ノードは Routing ヘッダーを無視し、Routing ヘッダーの Next Header フィールドで識別されるタイプの次のヘッダーの処理を続けなければなりません。

Segments Left がゼロでない場合、ノードはパケットを破棄し、パケットの Source Address に ICMP Parameter Problem, Code 0 メッセージを送信し、認識できない Routing Type を指さなければなりません。

受信したパケットの Routing ヘッダーを処理した後、中間ノードがそのパケットをリンク MTU がパケットサイズより小さいリンクに転送することになると判断した場合、そのノードはパケットを破棄し、パケットの Source Address に ICMP Packet Too Big メッセージを送信しなければなりません。

Type 0 ルーティングヘッダー (Type 0 Routing Header)

Type 0 Routing ヘッダーは以下の形式を持ちます。

+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Next Header | Hdr Ext Len | Routing Type=0| Segments Left |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Reserved |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| |
+ +
| |
+ Address[1] +
| |
+ +
| |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
. . .
. . .
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| |
+ +
| |
+ Address[n] +
| |
+ +
| |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

次ヘッダー (Next Header) — 8 ビットのセレクター。Routing ヘッダーの直後に続くヘッダーのタイプを識別します。

ヘッダー拡張長 (Hdr Ext Len) — 8 ビットの符号なし整数。Type 0 Routing ヘッダーでは、Hdr Ext Len はヘッダー内のアドレス数の 2 倍に等しくなります。

ルーティングタイプ (Routing Type) — 0。

残りセグメント数 (Segments Left) — 8 ビットの符号なし整数。最終宛先に到達する前にまだ訪問すべき中間ノードの数。

予約 (Reserved) — 32 ビットの予約フィールド。送信時はゼロに初期化し、受信時は無視します。

アドレス[1..n] (Address[1..n]) — 1 から n まで番号付けられた 128 ビットアドレスのベクター。

マルチキャストアドレスは Type 0 の Routing ヘッダーに現れてはならず、また Type 0 Routing ヘッダーを運ぶパケットの IPv6 Destination Address フィールドにも現れてはなりません。

Routing ヘッダーは IPv6 ヘッダーの Destination Address フィールドで識別されるノードに到達するまで検査または処理されません。そのノードで、直前のヘッダーの Next Header フィールドのディスパッチにより Routing ヘッダーモジュールが呼び出され、Routing Type 0 の場合は以下のアルゴリズムを実行します。

if Segments Left = 0 {
Routing ヘッダーの Next Header フィールドで識別されるタイプの
パケット内の次のヘッダーの処理に進む
}
else if Hdr Ext Len が奇数 {
Source Address に ICMP Parameter Problem, Code 0 メッセージを送信し、
Hdr Ext Len フィールドを指して、パケットを破棄する
}
else {
Hdr Ext Len を 2 で割ることで、Routing ヘッダー内のアドレス数 n を計算する

if Segments Left が n より大きい {
Source Address に ICMP Parameter Problem, Code 0 メッセージを送信し、
Segments Left フィールドを指して、パケットを破棄する
}
else {
Segments Left を 1 減算する;
n から Segments Left を引くことで、アドレスベクター内の
次に訪問すべきアドレスのインデックス i を計算する

if Address[i] または IPv6 Destination Address がマルチキャスト {
パケットを破棄する
}
else {
IPv6 Destination Address と Address[i] を交換する

if IPv6 Hop Limit が 1 以下 {
Source Address に ICMP Time Exceeded -- Hop Limit Exceeded in
Transit メッセージを送信し、パケットを破棄する
}
else {
Hop Limit を 1 減算する

新しい宛先への送信のために IPv6 モジュールにパケットを再送信する
}
}
}
}

ルーティングの例

上記アルゴリズムの効果の例として、送信元ノード S が Routing ヘッダーを使用して中間ノード I1、I2、I3 を経由して宛先ノード D にパケットを送信する場合を考えます。配送経路の各セグメントで、関連する IPv6 ヘッダーと Routing ヘッダーフィールドの値は以下のようになります。

S から I1 へ転送時:

Source Address = S                  Hdr Ext Len = 6
Destination Address = I1 Segments Left = 3
Address[1] = I2
Address[2] = I3
Address[3] = D

I1 から I2 へ転送時:

Source Address = S                  Hdr Ext Len = 6
Destination Address = I2 Segments Left = 2
Address[1] = I1
Address[2] = I3
Address[3] = D

I2 から I3 へ転送時:

Source Address = S                  Hdr Ext Len = 6
Destination Address = I3 Segments Left = 1
Address[1] = I1
Address[2] = I2
Address[3] = D

I3 から D へ転送時:

Source Address = S                  Hdr Ext Len = 6
Destination Address = D Segments Left = 0
Address[1] = I1
Address[2] = I2
Address[3] = I3