EIGRPパケット解説:HelloからAckまでの基本と役割

EIGRP(Enhanced Interior Gateway Routing Protocol)は Cisco が開発した距離ベクタ型のルーティングプロトコルで、2016年には仕様が RFC 7868 として公開されています。EIGRP のルータは、目的に応じて Hello、Update、Query、Reply、Ack の5種類のパケットをやり取りします。この記事では、R2 と R3 の間のパケットをキャプチャし、それぞれのパケットがいつ、誰に、何を送るのかを確認します。

この記事でわかること
  1. EIGRP のパケットが IP の上で直接(プロトコル番号 88)運ばれること
  2. Hello、Update、Query、Reply、Ack それぞれの役割と宛先
  3. 確実に届ける必要があるパケットに、Ack が返る流れ

5種類のパケット

パケットOpcode役割Ack
Hello5ネイバーを見つけ、関係を維持する不要
Update1経路情報を伝える必要
Query3経路を失ったとき、代わりの経路をネイバーに問い合わせる必要
Reply4Query に答える必要
Ack5Update、Query、Reply を受け取ったことを伝える不要

この記事の検証で確認できた流れを、先にまとめておきます。

R2R3 ① ネイバーの維持 Hello224.0.0.10・5秒ごと Hello224.0.0.10・5秒ごと ② 経路の追加 Lo0 3.3.3.3/32 を追加 Update(Seq 8)224.0.0.10・3.3.3.3/32 Ack(Ack 8)ユニキャスト ③ 経路の消失 Lo0 を shutdown Query(Seq 9)224.0.0.10・3.3.3.3/32 Ack(Ack 9)ユニキャスト Reply(Seq 9)ユニキャスト・遅延 Infinity Ack(Ack 9)ユニキャスト
図1 検証で確認したパケットのやり取り

検証構成

R2 と R3 が EIGRP AS 100 のネイバーになっています。基本設定は EIGRP の基本設定とネイバー・ルーティングテーブルの確認 を参照してください。

EIGRP AS 100 Lo02.2.2.2/32Lo03.3.3.3/32 R2R3 .2.3 192.168.23.0/24 Fa0/0.23 Fa0/0.23
図2 検証構成

EIGRP のパケットの運び方

EIGRP のパケットは、TCP や UDP を使わず、IP の上で直接運ばれます。IP ヘッダのプロトコル番号は 88 です。

画面イメージについて

この記事の画面は、実際の画面ではなく、検証時の画面から見るポイントを抜き出して描いたイメージです。バージョンによって、項目の並びや表記は変わります。

パケットキャプチャ(Wireshark):IP ヘッダ画面イメージ
▾ Internet Protocol Version 4, Src: 192.168.23.2, Dst: 224.0.0.10    0100 .... = Version: 4    .... 0101 = Header Length: 20 bytes (5)  ▸ Differentiated Services Field: 0xc0 (DSCP: CS6, ECN: Not-ECT)    Total Length: 60    Identification: 0x0000 (0)  ▸ Flags: 0x0000    Fragment offset: 0    Time to live: 11    Protocol: EIGRP (88)    Header checksum: 0x00f6 [validation disabled]    [Header checksum status: Unverified]    Source: 192.168.23.2    Destination: 224.0.0.102▸ Cisco EIGRP
図3 EIGRP パケットの IP ヘッダ(実際の画面ではなく、表示内容のポイントを示したイメージです)
No.表示意味
1Protocol: EIGRP (88)IP の上に EIGRP が直接載っている(プロトコル番号 88)
2Cisco EIGRPIP ヘッダの次が、すぐ EIGRP のヘッダになっている

TCP を使わない代わりに、EIGRP は RTP(Reliable Transport Protocol)という独自のしくみで、パケットを確実に、順番どおりに届けます。Update、Query、Reply にはシーケンス番号を付けて送り、受け取った側はその番号を入れた Ack を返します。Ack が返ってこなければ、送った側が再送します。Hello と Ack は確認応答のいらないパケットで、シーケンス番号は 0 です。

Hello パケット

Hello は、ネイバーを見つけ、関係を維持するためのパケットです。マルチキャストアドレス 224.0.0.10 宛てに定期的に送ります。Hello には AS 番号や K 値が入っていて、これらがネイバー同士で一致しないとネイバーになれません。

パケットキャプチャ(Wireshark):R3 の Hello画面イメージ
1▸ Internet Protocol Version 4, Src: 192.168.23.3, Dst: 224.0.0.10▾ Cisco EIGRP    Version: 22    Opcode: Hello (5)    Checksum: 0xef6e [correct]    [Checksum Status: Good]  ▸ Flags: 0x00000000    Sequence: 0    Acknowledge: 0    Virtual Router ID: 0 (Address-Family)3    Autonomous System: 100  ▾ Parameters      Type: Parameters (0x0001)      Length: 124      K1: 1      K2: 0      K3: 1      K4: 0      K5: 0      K6: 05      Hold Time: 15  ▸ Software Version: EIGRP=10.0, TLV=2.0
図4 Hello パケット(実際の画面ではなく、表示内容のポイントを示したイメージです)
No.表示意味
1Dst: 224.0.0.10EIGRP のマルチキャストアドレス宛て
2Opcode: Hello (5)Hello パケット
3Autonomous System: 100AS 番号。ネイバーと一致している必要がある
4K1〜K6メトリック計算の重み(K 値)。ネイバーと一致している必要がある
5Hold Time: 15ホールドタイム。受け取ったネイバーは、この時間 Hello が届かなければネイバーをダウンにする

Hello の送信間隔は、イーサネットでは既定で5秒、ホールドタイムは15秒です。ホールドタイムは Hello で相手に伝え、相手側で使われます。詳しくは Hello 送信時間とホールドタイム で確認しています。

Update パケットと Ack

Update は、経路情報を伝えるパケットです。R3 にループバック 3.3.3.3/32 を追加すると、R3 はこの経路を Update で R2 に伝えます。この Update は 224.0.0.10 宛てのマルチキャストでした(ネイバーになった直後の経路交換などでは、ユニキャストで送ることもあります)。

パケットキャプチャ(Wireshark):R3 の Update画面イメージ
1▸ Internet Protocol Version 4, Src: 192.168.23.3, Dst: 224.0.0.10▾ Cisco EIGRP    Version: 22    Opcode: Update (1)    Checksum: 0xb3cd [correct]    [Checksum Status: Good]  ▸ Flags: 0x000000003    Sequence: 8    Acknowledge: 0    Virtual Router ID: 0 (Address-Family)    Autonomous System: 1004  ▸ Internal Route  =   3.3.3.3/32
図5 Update パケット(実際の画面ではなく、表示内容のポイントを示したイメージです)
No.表示意味
1Dst: 224.0.0.10マルチキャストで送っている
2Opcode: Update (1)Update パケット
3Sequence: 8シーケンス番号。Ack で受け取りを確認する
4Internal Route = 3.3.3.3/32伝えている経路(AS 内部の経路)

R2 は、この Update を受け取ったことを、ユニキャストの Ack で R3 に返します。Ack は Opcode が Hello(5)のパケットで、Acknowledge に受け取った Update のシーケンス番号 8 が入っています。Parameters などの中身は付いていません。

パケットキャプチャ(Wireshark):R2 の Ack画面イメージ
1▸ Internet Protocol Version 4, Src: 192.168.23.2, Dst: 192.168.23.3▾ Cisco EIGRP    Version: 22    Opcode: Hello (5)    Checksum: 0xfd8e [correct]    [Checksum Status: Good]  ▸ Flags: 0x00000000    Sequence: 03    Acknowledge: 8    Virtual Router ID: 0 (Address-Family)    Autonomous System: 100
図6 Update に対する Ack(実際の画面ではなく、表示内容のポイントを示したイメージです)
No.表示意味
1Dst: 192.168.23.3Update を送ってきた R3 へのユニキャスト
2Opcode: Hello (5)Ack は Hello と同じ Opcode で送る
3Acknowledge: 8シーケンス番号 8 の Update を受け取った、という確認

Query、Reply と Ack

Query は、経路を失ったルータが、代わりの経路を持っていないかをネイバーに問い合わせるパケットです。R3 でループバックを shutdown すると、R3 は 3.3.3.3/32 を失い、R2 に Query を送ります。

パケットキャプチャ(Wireshark):R3 の Query画面イメージ
1▸ Internet Protocol Version 4, Src: 192.168.23.3, Dst: 224.0.0.10▾ Cisco EIGRP    Version: 22    Opcode: Query (3)    Checksum: 0xfe4f [correct]    [Checksum Status: Good]  ▸ Flags: 0x000000003    Sequence: 9    Acknowledge: 0    Virtual Router ID: 0 (Address-Family)    Autonomous System: 1004  ▸ Internal Route  =   3.3.3.3/32
図7 Query パケット(実際の画面ではなく、表示内容のポイントを示したイメージです)
No.表示意味
1Dst: 224.0.0.10マルチキャストで問い合わせている
2Opcode: Query (3)Query パケット
3Sequence: 9シーケンス番号。Query も Ack が必要
4Internal Route = 3.3.3.3/32問い合わせている経路

R2 は、Query を受け取ったことを Ack(Acknowledge: 9)で返します。そのうえで、問い合わせに答える Reply を送ります。R2 は 3.3.3.3/32 への経路を R3 経由でしか持っていなかったので、ほかに経路がないことを、遅延(Delay)を無限大にしたメトリックで伝えます。

パケットキャプチャ(Wireshark):R2 の Reply画面イメージ
1▸ Internet Protocol Version 4, Src: 192.168.23.2, Dst: 192.168.23.3▾ Cisco EIGRP    Version: 22    Opcode: Reply (4)    Checksum: 0x699f [correct]    [Checksum Status: Good]  ▸ Flags: 0x000000003    Sequence: 9    Acknowledge: 9    Virtual Router ID: 0 (Address-Family)    Autonomous System: 100  ▾ Internal Route  =   3.3.3.3/32      Type: Internal Route (0x0602)      Length: 45      Topology: 0      AFI: IPv4 (1)      RouterID: 3.3.3.3    ▾ Wide Metric        Offset: 0        Priority: 0        Reliability: 255        Load: 1        MTU: 1500        Hop Count: 14        Delay: Infinity        Bandwidth: 100000        Reserved: 0x0000      ▸ Flags      NextHop: 0.0.0.0      Prefix Length: 32      Destination: 3.3.3.3
図8 Reply パケット(実際の画面ではなく、表示内容のポイントを示したイメージです)
No.表示意味
1Dst: 192.168.23.3Query を送ってきた R3 へのユニキャスト
2Opcode: Reply (4)Reply パケット
3Sequence: 9
Acknowledge: 9
Reply 自身のシーケンス番号(R2 の 9)と、R3 の Query(9)への確認
4Delay: Infinity遅延を最大値にして、この経路が使えない(到達できない)ことを伝える

Reply も確実に届ける必要があるパケットなので、最後に R3 が Ack を返します。検証で見た3つの Ack は、どれも Opcode が Hello(5)のユニキャストでした。

Ack送信元 → 宛先Acknowledge確認しているパケット
Update への Ack192.168.23.2 → 192.168.23.38R3 の Update(Seq 8)
Query への Ack192.168.23.2 → 192.168.23.39R3 の Query(Seq 9)
Reply への Ack192.168.23.3 → 192.168.23.29R2 の Reply(Seq 9)

まとめ

パケットこの検証での宛先ポイント
Hello224.0.0.10ネイバーの発見と維持。AS 番号、K 値、ホールドタイムを伝える
Update224.0.0.10経路を伝える。シーケンス番号付きで、Ack が返る
Query224.0.0.10失った経路の代わりを問い合わせる。Ack が返る
ReplyユニキャストQuery への答え。経路がなければ遅延を無限大にする。Ack が返る
AckユニキャストOpcode は Hello と同じ。Acknowledge に受け取ったシーケンス番号を入れる

コメント