TCP/IPの基礎となる通信の仕組みを説明します。
『ARP(Address Resolution Protocol)によるアドレス解決』と『ARPテーブル/MACアドレステーブルをもとにした転送処理』は全ての通信の基本となります。
ネットワーク構成
下記の構成を例に別セグメント間の通信がどのように行われるのかを説明します。
別セグメント間通信の流れ
通信開始前の状態
ubuntu-1(192.168.1.1)からubuntu-2(192.168.2.1)へPingによる疎通確認(ICMP通信)を例として、どのような流れで通信が行われるのかを見ていきましょう。
CMLを利用して、実機のステータスやログを確認しながら検証していきます。
通信開始前の状態では、サーバー(ubuntu-1/2)やL2SWのARPテーブルには何も登録されていません。
サーバー(ubuntu-1/2)のIPアドレス、ルーティングテーブルは、下記のコマンドで確認できます。
ip address show dev ens2
ip route
ARPテーブルは、下記のコマンドで確認できます。
ip neigh
Routerのインターフェースに設定されているIPアドレスは、下記のコマンドで確認できます。
show ip int brief
ARPテーブルは、下記のコマンドで確認できます。
Ciscoルーターでは、IPアドレスが設定されているインターフェースの自身のIPアドレスとMACアドレスも表示されます。
show arp
ARPリクエスト送信(ubuntu-1 〜 Router Gi0/0)
ubuntu-1(192.168.1.1)とubuntu-2(192.168.2.1)は別セグメントのため、ubuntu-1はルーティングテーブルを参照し、デフォルトゲートウェイ(192.168.1.254)へパケットを送信します。
ARPテーブルに該当IPアドレス(192.168.1.254)の登録がないため、ARPリクエストをブロードキャスト送信します。
ARPとは、そのIPアドレスを持っている機器のMACアドレスを取得するためのプロトコルです。
ARPリクエストの中身は、送信元のIPアドレスとMACアドレス(Sender-IP/Sender-MAC)とMACアドレスの情報を知りたいIPアドレス(Target-IP)が含まれています。
※Target-MACは、これから知りたい情報のため、0000.0000.0000が入ります。
CML上でキャプチャしたファイルをWiresharkで見ると、下記の通りARPリクエストのパケットの中身が見えます。
Routerは、ARPリクエストを受信すると、ubuntu-1のIPアドレスとMACアドレスの紐付けをARPテーブルに登録します。
ARPリプライ送信(Router Gi0/0 〜 ubuntu-1)
RouterがARPリプライをユニキャスト送信します。
CML上でキャプチャしたファイルをWiresharkで見ると、下記の通りARPリプライのパケットの中身が見えます。
ubuntu-1は、ARPリプライを受信すると、送信元IPアドレスと送信元MACアドレスの紐付けをARPテーブルに登録します。
これでubuntu-1は、実際のICMP通信を行う準備ができました。
ICMPエコーリクエスト送信(ubuntu-1 〜 Router Gi0/0)
ubuntu-1がARPテーブルを参照し、RouterのGi0/0のMACアドレスを指定して、ICMPエコーリクエストをユニキャスト送信します。
CML上でキャプチャしたファイルをWiresharkで見ると、下記の通りICMPエコーリクエストのパケットの中身が見えます。
ARPリクエスト送信(Router Gi0/1 〜 ubuntu-2)
RouterはICMPエコーリクエストを受信すると、宛先の192.168.2.1はGi0/1と同じセグメントと認識します。しかし、ARPテーブルに該当IPアドレスの登録がないため、ARPリクエストをGi0/1からブロードキャスト送信します。
CML上でキャプチャしたファイルをWiresharkで見ると、下記の通りARPリクエストのパケットの中身が見えます。
ubuntu-2は、ARPリクエストを受信すると、送信元IPアドレスと送信元MACアドレスの紐付けをARPテーブルに登録します。
ARPリプライ送信(ubuntu-2 〜 Router Gi0/1)
ubuntu-2がARPリプライをユニキャスト送信します。
CML上でキャプチャしたファイルをWiresharkで見ると、下記の通りARPリプライのパケットの中身が見えます。
Routerは、ARPリプライを受信すると、ubuntu-2のIPアドレスとMACアドレスの紐付けをARPテーブルに登録します。
これでRouterは、ICMPエコーリクエストを転送する準備ができました。
ICMPエコーリクエスト転送(Router Gi0/1 〜 ubuntu-2)
RouterがARPテーブルを参照し、ubuntu-1から受信したICMPエコーリクエストをubuntu-2へ転送します。
この時、RouterはICMPパケット内の送信元/先のMACアドレスを書き換えます。(送信元:RouterのGi0/1のMACアドレス、送信先:ubuntu-2のMACアドレス)
CML上でキャプチャしたファイルをWiresharkで見ると、下記の通りICMPエコーリクエストのパケットの中身が見えます。
ubuntu-2がICMPエコーリクエストを受信します。
ICMPエコーリプライ送信(ubuntu-2 〜 Router Gi0/1)
ubuntu-2がICMPエコーリプライを送信します。
CML上でキャプチャしたファイルをWiresharkで見ると、下記の通りICMPエコーリプライのパケットの中身が見えます。
ICMPエコーリプライ転送(Router Gi0/0 〜 ubuntu-1)
RouterがARPテーブルを参照し、ubuntu-2から受信したICMPエコーリプライをubuntu-1へ転送します。
この時、RouterはICMPパケット内の送信元/先のMACアドレスを書き換えます。(送信元:RouterのGi0/0のMACアドレス、送信先:ubuntu-1のMACアドレス)
CML上でキャプチャしたファイルをWiresharkで見ると、下記の通りICMPエコーリプライのパケットの中身が見えます。
ubuntu-1がICMPエコーリプライを受信し、ICMPによる通信が正常に完了しました。
実機のステータス、ログの確認
CML上の実機のステータス、ログを確認します。
ubuntu-1(192.168.1.1)
ubuntu-1からPingを1回だけ実施するコマンドは下記となります。
ping -c 1 192.168.2.1
PIngが成功した後、ARPテーブルを確認すると、RouterのGi0/0のIPアドレスとMACアドレスが登録されているのが分かります。
ip neigh
ubuntu-2(192.168.2.1)
ubuntu-2でもARPテーブルを確認すると、RouterのGi0/1のIPアドレスとMACアドレスが登録されているのが分かります。
ip neigh
Router
Routerでは、下記のデバッグコマンドを設定することで、ARPパケットのやりとりやARPテーブル登録時のログが出力されるようになります。
debug arp
ARPテーブルを確認すると、ubuntu-1/ubuntu-2のIPアドレスとMACアドレスの情報が登録されていることが分かります。
show arp
これで、基本的なTCP/IP通信の仕組み(別セグメント間の通信)の説明は完了です!