TCP/IPの基礎となる通信の仕組みを説明します。
『ARP(Address Resolution Protocol)によるアドレス解決』と『ARPテーブル/MACアドレステーブルをもとにした転送処理』は全ての通信の基本となります。
![](https://infrastructure-engineer.com/wp-content/uploads/2021/08/icatch-tcpip-basic-0001-300x172.png)
ネットワーク構成
下記の構成を例に別セグメント間の通信がどのように行われるのかを説明します。
![ネットワーク構成](https://infrastructure-engineer.com/wp-content/uploads/2021/08/001-1024x263.jpg)
別セグメント間通信の流れ
通信開始前の状態
ubuntu-1(192.168.1.1)からubuntu-2(192.168.2.1)へPingによる疎通確認(ICMP通信)を例として、どのような流れで通信が行われるのかを見ていきましょう。
CMLを利用して、実機のステータスやログを確認しながら検証していきます。
通信開始前の状態では、サーバー(ubuntu-1/2)やL2SWのARPテーブルには何も登録されていません。
![通信開始前の状態](https://infrastructure-engineer.com/wp-content/uploads/2021/08/101-4-1024x215.png)
サーバー(ubuntu-1/2)のIPアドレス、ルーティングテーブルは、下記のコマンドで確認できます。
ip address show dev ens2
ip route
ARPテーブルは、下記のコマンドで確認できます。
ip neigh
![ubuntu-1のIPアドレスとARPテーブル確認](https://infrastructure-engineer.com/wp-content/uploads/2021/08/002-1024x659.jpg)
![ubuntu-2のIPアドレスとARPテーブル確認](https://infrastructure-engineer.com/wp-content/uploads/2021/08/003-1024x659.jpg)
Routerのインターフェースに設定されているIPアドレスは、下記のコマンドで確認できます。
show ip int brief
ARPテーブルは、下記のコマンドで確認できます。
Ciscoルーターでは、IPアドレスが設定されているインターフェースの自身のIPアドレスとMACアドレスも表示されます。
show arp
![RouterのIPアドレスとARPテーブル確認](https://infrastructure-engineer.com/wp-content/uploads/2021/08/004-1024x659.jpg)
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リクエストをブロードキャスト送信します。
![ubuntu-1からARPリクエスト送信](https://infrastructure-engineer.com/wp-content/uploads/2021/08/102-1024x330.png)
ARPとは、そのIPアドレスを持っている機器のMACアドレスを取得するためのプロトコルです。
ARPリクエストの中身は、送信元のIPアドレスとMACアドレス(Sender-IP/Sender-MAC)とMACアドレスの情報を知りたいIPアドレス(Target-IP)が含まれています。
※Target-MACは、これから知りたい情報のため、0000.0000.0000が入ります。
CML上でキャプチャしたファイルをWiresharkで見ると、下記の通りARPリクエストのパケットの中身が見えます。
![ubuntu-1からのARPリクエストのパケットキャプチャ確認](https://infrastructure-engineer.com/wp-content/uploads/2021/08/201-1-1024x379.jpg)
Routerは、ARPリクエストを受信すると、ubuntu-1のIPアドレスとMACアドレスの紐付けをARPテーブルに登録します。
![Routerがubuntu-1からARPリクエストを受信しARPテーブルに登録](https://infrastructure-engineer.com/wp-content/uploads/2021/08/103-1-1024x393.png)
ARPリプライ送信(Router Gi0/0 〜 ubuntu-1)
RouterがARPリプライをユニキャスト送信します。
![Routerからubuntu-1へARPリプライ送信](https://infrastructure-engineer.com/wp-content/uploads/2021/08/104-1-1024x460.png)
CML上でキャプチャしたファイルをWiresharkで見ると、下記の通りARPリプライのパケットの中身が見えます。
![RouterからのARPリプライのパケットキャプチャ確認](https://infrastructure-engineer.com/wp-content/uploads/2021/08/202-1024x379.jpg)
ubuntu-1は、ARPリプライを受信すると、送信元IPアドレスと送信元MACアドレスの紐付けをARPテーブルに登録します。
![ubuntu-1がRouterからARPリプライを受信しARPテーブルに登録](https://infrastructure-engineer.com/wp-content/uploads/2021/08/105-1-1024x434.png)
これでubuntu-1は、実際のICMP通信を行う準備ができました。
ICMPエコーリクエスト送信(ubuntu-1 〜 Router Gi0/0)
ubuntu-1がARPテーブルを参照し、RouterのGi0/0のMACアドレスを指定して、ICMPエコーリクエストをユニキャスト送信します。
![ubuntu-1からICMPエコーリクエストを送信](https://infrastructure-engineer.com/wp-content/uploads/2021/08/106-1-1024x522.png)
CML上でキャプチャしたファイルをWiresharkで見ると、下記の通りICMPエコーリクエストのパケットの中身が見えます。
![ubuntu-1からのICMPエコーリクエストのパケットキャプチャ確認](https://infrastructure-engineer.com/wp-content/uploads/2021/08/203-1-1024x379.jpg)
ARPリクエスト送信(Router Gi0/1 〜 ubuntu-2)
RouterはICMPエコーリクエストを受信すると、宛先の192.168.2.1はGi0/1と同じセグメントと認識します。しかし、ARPテーブルに該当IPアドレスの登録がないため、ARPリクエストをGi0/1からブロードキャスト送信します。
![RouterからARPリクエスト送信](https://infrastructure-engineer.com/wp-content/uploads/2021/08/107-1-1024x664.png)
CML上でキャプチャしたファイルをWiresharkで見ると、下記の通りARPリクエストのパケットの中身が見えます。
![RouterからのARPリクエストのパケットキャプチャ確認](https://infrastructure-engineer.com/wp-content/uploads/2021/08/205-1024x379.jpg)
ubuntu-2は、ARPリクエストを受信すると、送信元IPアドレスと送信元MACアドレスの紐付けをARPテーブルに登録します。
![ubuntu-2がRouterからARPリクエストを受信しARPテーブルに登録](https://infrastructure-engineer.com/wp-content/uploads/2021/08/108-4-1024x604.png)
ARPリプライ送信(ubuntu-2 〜 Router Gi0/1)
ubuntu-2がARPリプライをユニキャスト送信します。
![ubuntu-2からRouterへARPリプライ送信](https://infrastructure-engineer.com/wp-content/uploads/2021/08/109-1-1024x706.png)
CML上でキャプチャしたファイルをWiresharkで見ると、下記の通りARPリプライのパケットの中身が見えます。
![ubuntu-2からのARPリプライのパケットキャプチャ確認](https://infrastructure-engineer.com/wp-content/uploads/2021/08/206-1024x379.jpg)
Routerは、ARPリプライを受信すると、ubuntu-2のIPアドレスとMACアドレスの紐付けをARPテーブルに登録します。
![Routerがubuntu-2からARPリプライを受信しARPテーブルに登録](https://infrastructure-engineer.com/wp-content/uploads/2021/08/110-1-1024x764.png)
これで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アドレス)
![Routerがubuntu-2へICMPエコーリクエストを転送](https://infrastructure-engineer.com/wp-content/uploads/2021/08/111-1-1024x813.png)
CML上でキャプチャしたファイルをWiresharkで見ると、下記の通りICMPエコーリクエストのパケットの中身が見えます。
![RouterからのICMPエコーリクエストのパケットキャプチャ確認](https://infrastructure-engineer.com/wp-content/uploads/2021/08/207-1024x379.jpg)
ubuntu-2がICMPエコーリクエストを受信します。
![ubuntu-2がICMPエコーリクエストを受信](https://infrastructure-engineer.com/wp-content/uploads/2021/08/112-1-1024x770.png)
ICMPエコーリプライ送信(ubuntu-2 〜 Router Gi0/1)
ubuntu-2がICMPエコーリプライを送信します。
![ubuntu-2がRouterへICMPエコーリプライを送信](https://infrastructure-engineer.com/wp-content/uploads/2021/08/113-1-1024x864.png)
CML上でキャプチャしたファイルをWiresharkで見ると、下記の通りICMPエコーリプライのパケットの中身が見えます。
![ubuntu-2からのICMPエコーリプライのパケットキャプチャ確認](https://infrastructure-engineer.com/wp-content/uploads/2021/08/208-1024x379.jpg)
ICMPエコーリプライ転送(Router Gi0/0 〜 ubuntu-1)
RouterがARPテーブルを参照し、ubuntu-2から受信したICMPエコーリプライをubuntu-1へ転送します。
この時、RouterはICMPパケット内の送信元/先のMACアドレスを書き換えます。(送信元:RouterのGi0/0のMACアドレス、送信先:ubuntu-1のMACアドレス)
![Routerがubuntu-1へICMPエコーリプライを転送](https://infrastructure-engineer.com/wp-content/uploads/2021/08/114-1024x936.png)
CML上でキャプチャしたファイルをWiresharkで見ると、下記の通りICMPエコーリプライのパケットの中身が見えます。
![RouterからのICMPエコーリプライのパケットキャプチャ確認](https://infrastructure-engineer.com/wp-content/uploads/2021/08/204-1-1024x379.jpg)
ubuntu-1がICMPエコーリプライを受信し、ICMPによる通信が正常に完了しました。
![ubuntu-1がICMPエコーリプライを受信](https://infrastructure-engineer.com/wp-content/uploads/2021/08/115-1024x908.png)
実機のステータス、ログの確認
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-1のARPテーブル確認](https://infrastructure-engineer.com/wp-content/uploads/2021/08/005-1024x659.jpg)
ubuntu-2(192.168.2.1)
ubuntu-2でもARPテーブルを確認すると、RouterのGi0/1のIPアドレスとMACアドレスが登録されているのが分かります。
ip neigh
![ubuntu-2のARPテーブル確認](https://infrastructure-engineer.com/wp-content/uploads/2021/08/006-1-1024x659.jpg)
Router
Routerでは、下記のデバッグコマンドを設定することで、ARPパケットのやりとりやARPテーブル登録時のログが出力されるようになります。
debug arp
![Routerのdebugコマンドとdebugログの確認](https://infrastructure-engineer.com/wp-content/uploads/2021/08/007-1-1024x659.jpg)
ARPテーブルを確認すると、ubuntu-1/ubuntu-2のIPアドレスとMACアドレスの情報が登録されていることが分かります。
show arp
![RouterのARPテーブル確認](https://infrastructure-engineer.com/wp-content/uploads/2021/08/008-1-1024x658.jpg)
これで、基本的なTCP/IP通信の仕組み(別セグメント間の通信)の説明は完了です!
![](https://infrastructure-engineer.com/wp-content/uploads/2021/08/icatch-tcpip-basic-0001-300x172.png)