EIGRP(Enhanced Interior Gateway Routing Protocol)は Cisco が開発した距離ベクタ型のルーティングプロトコルで、2016年には仕様が RFC 7868 として公開されています。EIGRP のルータは、目的に応じて Hello、Update、Query、Reply、Ack の5種類のパケットをやり取りします。この記事では、R2 と R3 の間のパケットをキャプチャし、それぞれのパケットがいつ、誰に、何を送るのかを確認します。
- EIGRP のパケットが IP の上で直接(プロトコル番号 88)運ばれること
- Hello、Update、Query、Reply、Ack それぞれの役割と宛先
- 確実に届ける必要があるパケットに、Ack が返る流れ
5種類のパケット
| パケット | Opcode | 役割 | Ack |
|---|---|---|---|
| Hello | 5 | ネイバーを見つけ、関係を維持する | 不要 |
| Update | 1 | 経路情報を伝える | 必要 |
| Query | 3 | 経路を失ったとき、代わりの経路をネイバーに問い合わせる | 必要 |
| Reply | 4 | Query に答える | 必要 |
| Ack | 5 | Update、Query、Reply を受け取ったことを伝える | 不要 |
この記事の検証で確認できた流れを、先にまとめておきます。
検証構成
R2 と R3 が EIGRP AS 100 のネイバーになっています。基本設定は EIGRP の基本設定とネイバー・ルーティングテーブルの確認 を参照してください。
EIGRP のパケットの運び方
EIGRP のパケットは、TCP や UDP を使わず、IP の上で直接運ばれます。IP ヘッダのプロトコル番号は 88 です。
この記事の画面は、実際の画面ではなく、検証時の画面から見るポイントを抜き出して描いたイメージです。バージョンによって、項目の並びや表記は変わります。
▾ 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
| No. | 表示 | 意味 |
|---|---|---|
| 1 | Protocol: EIGRP (88) | IP の上に EIGRP が直接載っている(プロトコル番号 88) |
| 2 | Cisco EIGRP | IP ヘッダの次が、すぐ EIGRP のヘッダになっている |
TCP を使わない代わりに、EIGRP は RTP(Reliable Transport Protocol)という独自のしくみで、パケットを確実に、順番どおりに届けます。Update、Query、Reply にはシーケンス番号を付けて送り、受け取った側はその番号を入れた Ack を返します。Ack が返ってこなければ、送った側が再送します。Hello と Ack は確認応答のいらないパケットで、シーケンス番号は 0 です。
Hello パケット
Hello は、ネイバーを見つけ、関係を維持するためのパケットです。マルチキャストアドレス 224.0.0.10 宛てに定期的に送ります。Hello には AS 番号や K 値が入っていて、これらがネイバー同士で一致しないとネイバーになれません。
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
| No. | 表示 | 意味 |
|---|---|---|
| 1 | Dst: 224.0.0.10 | EIGRP のマルチキャストアドレス宛て |
| 2 | Opcode: Hello (5) | Hello パケット |
| 3 | Autonomous System: 100 | AS 番号。ネイバーと一致している必要がある |
| 4 | K1〜K6 | メトリック計算の重み(K 値)。ネイバーと一致している必要がある |
| 5 | Hold 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 宛てのマルチキャストでした(ネイバーになった直後の経路交換などでは、ユニキャストで送ることもあります)。
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
| No. | 表示 | 意味 |
|---|---|---|
| 1 | Dst: 224.0.0.10 | マルチキャストで送っている |
| 2 | Opcode: Update (1) | Update パケット |
| 3 | Sequence: 8 | シーケンス番号。Ack で受け取りを確認する |
| 4 | Internal Route = 3.3.3.3/32 | 伝えている経路(AS 内部の経路) |
R2 は、この Update を受け取ったことを、ユニキャストの Ack で R3 に返します。Ack は Opcode が Hello(5)のパケットで、Acknowledge に受け取った Update のシーケンス番号 8 が入っています。Parameters などの中身は付いていません。
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
| No. | 表示 | 意味 |
|---|---|---|
| 1 | Dst: 192.168.23.3 | Update を送ってきた R3 へのユニキャスト |
| 2 | Opcode: Hello (5) | Ack は Hello と同じ Opcode で送る |
| 3 | Acknowledge: 8 | シーケンス番号 8 の Update を受け取った、という確認 |
Query、Reply と Ack
Query は、経路を失ったルータが、代わりの経路を持っていないかをネイバーに問い合わせるパケットです。R3 でループバックを shutdown すると、R3 は 3.3.3.3/32 を失い、R2 に 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
| No. | 表示 | 意味 |
|---|---|---|
| 1 | Dst: 224.0.0.10 | マルチキャストで問い合わせている |
| 2 | Opcode: Query (3) | Query パケット |
| 3 | Sequence: 9 | シーケンス番号。Query も Ack が必要 |
| 4 | Internal Route = 3.3.3.3/32 | 問い合わせている経路 |
R2 は、Query を受け取ったことを Ack(Acknowledge: 9)で返します。そのうえで、問い合わせに答える Reply を送ります。R2 は 3.3.3.3/32 への経路を R3 経由でしか持っていなかったので、ほかに経路がないことを、遅延(Delay)を無限大にしたメトリックで伝えます。
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
| No. | 表示 | 意味 |
|---|---|---|
| 1 | Dst: 192.168.23.3 | Query を送ってきた R3 へのユニキャスト |
| 2 | Opcode: Reply (4) | Reply パケット |
| 3 | Sequence: 9Acknowledge: 9 | Reply 自身のシーケンス番号(R2 の 9)と、R3 の Query(9)への確認 |
| 4 | Delay: Infinity | 遅延を最大値にして、この経路が使えない(到達できない)ことを伝える |
Reply も確実に届ける必要があるパケットなので、最後に R3 が Ack を返します。検証で見た3つの Ack は、どれも Opcode が Hello(5)のユニキャストでした。
| Ack | 送信元 → 宛先 | Acknowledge | 確認しているパケット |
|---|---|---|---|
| Update への Ack | 192.168.23.2 → 192.168.23.3 | 8 | R3 の Update(Seq 8) |
| Query への Ack | 192.168.23.2 → 192.168.23.3 | 9 | R3 の Query(Seq 9) |
| Reply への Ack | 192.168.23.3 → 192.168.23.2 | 9 | R2 の Reply(Seq 9) |
まとめ
| パケット | この検証での宛先 | ポイント |
|---|---|---|
| Hello | 224.0.0.10 | ネイバーの発見と維持。AS 番号、K 値、ホールドタイムを伝える |
| Update | 224.0.0.10 | 経路を伝える。シーケンス番号付きで、Ack が返る |
| Query | 224.0.0.10 | 失った経路の代わりを問い合わせる。Ack が返る |
| Reply | ユニキャスト | Query への答え。経路がなければ遅延を無限大にする。Ack が返る |
| Ack | ユニキャスト | Opcode は Hello と同じ。Acknowledge に受け取ったシーケンス番号を入れる |
コメント