これまでで IPアドレス、ルーティング、MACアドレス、スイッチング、ARP とそれぞれの仕組みを個別に学んできました。
今回はその総まとめとして、RT1 から RT2 へ通信を行った際に、実際に何がどの順番で発生するのかを、1つの流れとして図解しながら整理します。
これまでの回で学んだ内容を、簡単におさらいします。
TCP/IPモデル:通信は「アプリケーション層」「トランスポート層」「インターネット層」「ネットワークインターフェース層」の4階層に従ってカプセル化され、ネットワークインターフェース層の情報(MACアドレスを含むフレームヘッダ)まで揃って初めて、電気信号として送信できる状態になる
IPアドレス:IPアドレスはサブネットマスクによって「ネットワーク部」と「ホスト部」に分かれており、2台の機器が同じネットワーク部を持っているかどうかで、同一ネットワークに属しているかを判断する
ルーティング:異なるネットワーク宛ての通信はルータがルーティングテーブルを参照し、next-hopと出力インターフェースを決定して転送する。今回はPC1・PC2が同一ネットワークに属しているため、ルータは登場しない
MACアドレス:機器に紐づいた48bitの物理的な識別番号。フレームの送受信には宛先MACアドレスが必要
スイッチング:スイッチは受信フレームの送信元MACアドレスをもとにMACアドレステーブルを学習し、宛先MACアドレスに応じてフォワーディング(該当ポートのみ転送)/フラッディング(全ポートへ転送)のいずれかで処理する
ARP:IPアドレスからMACアドレスを解決するプロトコル。ARP Requestはブロードキャスト、ARP Replyはユニキャストで送信される
今回はこれらの仕組みが実際にどう連動して動くのかを、1つの通信の流れとして順を追って見ていきます。
改めて全体概要は以下の通りです。

以下のようなシンプルな構成を例に通信の流れを追っていきます。
※今後のハンズオンで模擬できるよう PC の変わりにルータを使用しています。
RT1 は Eth0/0 (Ethernet0/0 の略称) に 192.168.1.1 が設定されており、MAC address は aabb.cc00.6000 です。
RT2 は Eth0/0 に 192.168.1.2 が設定されており、MAC address は aabb.cc00.7000 です。
SW1 は各 RT を繋いでおり、Eth0/0 には RT1 の Eth0/0 が、Eth0/1 には RT2 の Eth0/1 が繋がっています。

RT1(192.168.1.1) が RT2(192.168.1.2)へ通信を行おうとしている通信開始前の状態です。
ログインすると、進捗を保存できます。
← 0.9 同一セグメント内の通信 に戻るこの時点では RT1・RT 2ともに一度も通信をしていないため、SW1のMACアドレステーブルは空の状態です。
RT1・RT2の ARP テーブルは自身の IPアドレスに紐づく MACアドレスのみ登録されています。
※ここでは実際に Cisco 機器を操作しているため、コマンドや出力が出てきます。まだ Cisco 機器に関しては未学習であるため、内容だけ理解できれば問題ないです。

今回は通信の流れを確認するため、RT1 で ping command を実行します。
ping command とはネットワークにおいて通信確認に一般的に使われるコマンドです。
宛先の IPアドレスを指定して実行すると、ICMP Echo というデータが生成されます。ICMP の詳細については別途解説するため、ここでは ICMP Echo が生成されることのみ覚えておいてください。

ICMP はネットワーク層で動くプロトコルであるため、 TCP や UDP header が付与されず、IP header から付与されます。
ARP でも紹介しましたが、どの層で動くプロトコルかによりどの header から付与されるかが変わるため、これはプロトコルごとに覚えましょう。
ただし、最終的に Ethernet header まで付与する流れは変わりません。
今回は ping command で宛先 IP アドレスを 192.168.1.2 に指定しているため、IP header にこの情報を書き込みます。
※sIP (source IP) は送信元 IP アドレス、dIP (destination IP) は宛先 IP アドレスを示します。

IP header に宛先 IP アドレスを含めることが出来たので、次に送信元 IP アドレスを決定します。
ルータや PC などのルーティングテーブルを持つ機器は宛先 IP アドレスをルーティングテーブル内で検索することで、一致するエントリがあるか確認します。
その結果 next-hop と出力インターフェースが決定し、出力インターフェースに設定されている IP アドレスが送信元 IP アドレスとなります。
今回は RT1 がルーティングテーブルを確認し、一致するエントリは Connected (ルータ自身が持つネットワーク)でした。
そのため
next-hop は 192.168.1.2 のまま
出力インターフェースは Eth0/0 のため、送信元 IP アドレスは 192.168.1.1
となります。

IP header が正常に付与できたため、次は Ethernet header を付与します。
Ethernet header を付与する際、送信元 MAC アドレスと宛先 MAC アドレスの情報が必要です。
送信元 MAC アドレスは出力インターフェースの値が使われるため、今回は Eth0/0 が持つ aabb.cc00.6000 となります。
宛先 MAC アドレスは next-hop (今回は同じネットワークなので宛先) の値を使用するため、ARP table を参照します。
すると、ARP table に 192.168.1.2 に紐づく MAC アドレスが登録されていません。
そのため、このままでは Ethernet header が付与できないため、ICMP の送信処理は一度ストップし、ARP で 192.168.1.2 の MACアドレスを調べる処理に移ります。

RT1 は 192.168.1.2 の MAC アドレスを調べるため、ARP を実行します。
ARP を実行すると ARP request が生成され、以下の情報が含まれています。
tMAC (target MAC) : 0000.0000.0000
tIP (target IP) : 192.168.1.2
これは ARP request を受信した機器が 192.168.1.2 の IP を持っていたら、それに対応する MAC アドレスを教えてくださいといった意味合いです。

生成した ARP request を送信するため、Ethernet header を付与します。
ARP request はブロードキャストで送信されるため、送信元/宛先 MAC アドレスは以下の通りです。
送信元 MAC アドレス:出力インターフェースの MAC アドレス
宛先 MAC アドレス:ブロードキャストアドレス(ffff.ffff.ffff)

TCP/IP モデルに従い Ethernet header まで付与されたため、フレームは電気信号に変換され、出力インターフェースである Eth0/0 から送信されます。

SW1 は Eth0/0 で電気信号を受信すると、これを復号します。

SW1 は復号した後に Ethernet header を確認します。
そして、受信したポートと送信元 MAC アドレスの情報を MAC アドレステーブルに登録します。

続いて宛先 MAC アドレスを参照し、どのポートに転送すればよいか決定します。
宛先 MAC アドレスはブロードキャストアドレスのため、受信したポート以外の同一ブロードキャストドメイン(同一VLAN)のポートから転送すればよいことがわかります。
※今回は Eth0/0 と Eth0/1 しか繋がっていないので、Eth0/1 にのみ転送されます。

SW1 は出力インターフェースが決定したため、データを電気信号に変換し、対象のポートから送信します。
※スイッチはフレームを転送する際、ルータと異なり既存のヘッダーに何も変更を加えません。

RT2 は Eth0/0 で電気信号を受信すると、これを復号します。

RT2 は受信したフレームの宛先 MAC アドレスを確認します。
すると、宛先 MAC アドレスがブロードキャストアドレスであったため、これは処理を継続してよいと判断し、非カプセル化(Ethernet header を外す)します。

Ethernet header を外すと ARP request が出てきたので、内容を確認します。すると、tIP (target IP) が自身の持つ IP address と一致していることがわかりました。
そのため、RT2 はこの ARP request に応答しなければいけないことを認識します。
これに加えて ARP request に記載されている sIP と sMAC の情報を自身の ARP table に登録します。

RT2 は ARP request で要求した情報(192.168.1.2 に紐づく MAC アドレス)を回答するため、ARP reply を生成します。

生成した ARP reply を送信するため、Ethernet header を付与します。
ARP reply はユニキャストで送信されるため、送信元/宛先 MAC アドレスは以下の通りです。
送信元 MAC アドレス:出力インターフェースの MAC アドレス
宛先 MAC アドレス:ARP request の sMAC

TCP/IP モデルに従い Ethernet header まで付与されたため、フレームは電気信号に変換され、出力インターフェースである Eth0/0 から送信されます。

SW1 は Eth0/1 で電気信号を受信すると、これを復号します。

SW1 は復号した後に Ethernet header を確認します。
そして、受信したポートと送信元 MAC アドレスの情報を MAC アドレステーブルに登録します。

続いて宛先 MAC アドレスを参照し、どのポートに転送すればよいか決定します。
宛先 MAC アドレス aabb.cc00.6000 は Eth0/0 の先に存在すると MAC アドレステーブルに登録されているため、Eth0/0 から転送すればよいことがわかります。

SW1 は出力インターフェースが決定したため、データを電気信号に変換し、対象のポートから送信します。

RT1 は Eth0/0 で電気信号を受信すると、これを復号します。

RT1 は受信したフレームの宛先 MAC アドレスを確認します。
すると、宛先 MAC アドレスが Eth0/0 の MAC アドレスと一致するため、これは処理を継続してよいと判断し、非カプセル化(Ethernet header を外す)します。

Ethernet header を外すと ARP reply が出てきたので、sIP と sMAC の情報を自身の ARP table に登録します。
ここまでの処理で、RT1 は ICMP Echo の送信に必要な 192.168.1.2 に紐づく MAC アドレスを知ることが出来ました。
そのため、ここから ICMP の処理に戻ります。

ICMP の処理に戻ったので、ARP table を参照し 192.168.1.2 に紐づく MAC アドレスを宛先 MAC アドレスとして指定します。

TCP/IP モデルに従い Ethernet header まで付与されたため、フレームは電気信号に変換され、出力インターフェースである Eth0/0 から送信されます。

SW1 は Eth0/0 で電気信号を受信すると、これを復号します。

SW1 は復号した後に Ethernet header を確認します。
そして、受信したポートと送信元 MAC アドレスの情報を MAC アドレステーブルに登録します。
今回はすでに登録済みのため、情報が上書きされ Aging tame が更新されます。(もし通信がない場合、Cisco IOS-XE のスイッチはデフォルトで300秒経過するとそのエントリを削除します。)

続いて宛先 MAC アドレスを参照し、どのポートに転送すればよいか決定します。
宛先 MAC アドレス aabb.cc00.7000 は Eth0/1 の先に存在すると MAC アドレステーブルに登録されているため、Eth0/1 から転送すればよいことがわかります。

SW1 は出力インターフェースが決定したため、データを電気信号に変換し、対象のポートから送信します。

RT2 は Eth0/0 で電気信号を受信すると、これを復号します。

RT2 は受信したフレームの宛先 MAC アドレスを確認します。
すると、宛先 MAC アドレスが Eth0/0 の MAC アドレスと一致するため、これは処理を継続してよいと判断し、非カプセル化(Ethernet header を外す)します。

Ethernet header を外すと IP header が出てきたので、内容を確認します。すると、宛先IPアドレスが自身の持つ IP address と一致していることがわかりました。
そのため、RT2 は処理を継続してよいと判断し、非カプセル化(IP header を外す)します。
※もし IP アドレスが自身のものでない場合、ルーティングテーブルを参照して転送処理に移ります。こちらの詳細は別記事で解説します。

IP header を外すと Echo request が出てきました。
これを受信したことで、RT2 は Echo reply で応答しなければいけないことを認識します。
そして、ここまでの処理で RT1 から送信された Echo request を RT2 が無事受信することができました。

RT2 は受信した Echo request への応答として、Echo reply を生成します。

RT2 は受信した ICMP Echo の送信元 IP アドレスに対して Echo reply を送信する必要があるため、宛先 IP アドレスに 192.168.1.1 を指定します。

IP header に宛先 IP アドレスを含めることが出来たので、ルーティングテーブル内で宛先IPアドレスを検索し、送信元 IP アドレスと出力インターフェースを決定します。
今回一致するエントリは Connected (ルータ自身が持つネットワーク)でした。
そのため
next-hop は 192.168.1.1 のまま
出力インターフェースは Eth0/0 のため、送信元 IP アドレスは 192.168.1.2
となります。

IP header が正常に付与できたため、次は Ethernet header を付与します。
Ethernet header を付与する際、送信元 MAC アドレスと宛先 MAC アドレスの情報が必要です。
送信元 MAC アドレスは出力インターフェースの値が使われるため、今回は Eth0/0 が持つ aabb.cc00.7000 となります。
宛先 MAC アドレスは next-hop (今回は同じネットワークなので宛先) の値を使用するため、ARP table を参照します。
すると、ARP table に 192.168.1.1 に紐づく MAC アドレスが登録されているため、この値を使用します。

TCP/IP モデルに従い Ethernet header まで付与されたため、フレームは電気信号に変換され、出力インターフェースである Eth0/0 から送信されます。

SW1 は Eth0/1 で電気信号を受信すると、これを復号します。

SW1 は復号した後に Ethernet header を確認します。
そして、受信したポートと送信元 MAC アドレスの情報を MAC アドレステーブルに登録します。
今回はすでに登録済みのため、情報が上書きされ Aging tame が更新されます。

続いて宛先 MAC アドレスを参照し、どのポートに転送すればよいか決定します。
宛先 MAC アドレス aabb.cc00.6000 は Eth0/0 の先に存在すると MAC アドレステーブルに登録されているため、Eth0/0 から転送すればよいことがわかります。

SW1 は出力インターフェースが決定したため、データを電気信号に変換し、対象のポートから送信します。

RT1 は Eth0/0 で電気信号を受信すると、これを復号します。

RT1 は受信したフレームの宛先 MAC アドレスを確認します。
すると、宛先 MAC アドレスが Eth0/0 の MAC アドレスと一致するため、これは処理を継続してよいと判断し、非カプセル化(Ethernet header を外す)します。

Ethernet header を外すと IP header が出てきたので、内容を確認します。すると、宛先IPアドレスが自身の持つ IP address と一致していることがわかりました。
そのため、RT1 は処理を継続してよいと判断し、非カプセル化(IP header を外す)します。

IP header を外すと Echo reply が出てきました。これを受信したことで、RT1 は ICMP の処理が完了したことを認識します。
そして、Cisco IOS-XE では ping command を実行すると ICMP Echo を5つ送信します。
1回目は ARP の処理により中断されたため、失敗を示す「.」が表示され、残りの4回は「4-1」~ 「4-13」までが繰り返され、成功を示す「!」が表示されます。

この内容はこれまでの学習の集大成となります。
TCP/IP モデルに従い、各層でどのような処理が行われ、どのように通信が成立しているかを理解することが非常に重要です。
各要素で不安な点があれば振り返りを行い、同一ネットワーク内の通信は自分の言葉で説明できるよう理解を深めていきましょう。
次回は、トランスポート層の仕組みである TCP を学びます。