TCP/IPの基礎となる通信の仕組みを説明します。
『ARP(Address Resolution Protocol)によるアドレス解決』と『ARPテーブル/MACアドレステーブルをもとにした転送処理』は全ての通信の基本となります。

ネットワーク構成
下記の構成を例に同一セグメント内の通信がどのように行われるのかを説明します。

同一セグメント内通信の流れ
通信開始前の状態
ubuntu-1(192.168.1.1)からubuntu-2(192.168.1.2)へPingによる疎通確認(ICMP通信)を例として、どのような流れで通信が行われるのかを見ていきましょう。
CMLを利用して、実機のステータスやログを確認しながら検証していきます。
通信開始前の状態では、サーバー(ubuntu-1/2)のARPテーブルやL2SWのMACアドレステーブルには何も登録されていません。

サーバー(ubuntu-1/2)のARPテーブルは、下記のコマンドで確認できます。
ip neigh


L2SWのMACアドレステーブルは、下記のコマンドで確認できます。
show mac address-table

ARPリクエスト送信
ubuntu-1(192.168.1.1)がubuntu-2(192.168.1.2)への通信を開始すると、ARPテーブルに該当IPアドレスの登録がないため、ARPリクエストをブロードキャスト送信します。

ARPとは、そのIPアドレスを持っている機器のMACアドレスを取得するためのプロトコルです。
ARPリクエストの中身は、送信元のIPアドレスとMACアドレス(Sender-IP/Sender-MAC)とMACアドレスの情報を知りたいIPアドレス(Target-IP)が含まれています。
※Target-MACは、これから知りたい情報のため、0000.0000.0000が入ります。
CML上でキャプチャしたファイルをWiresharkで見ると、下記の通りARPリクエストのパケットの中身が見えます。

L2SWは、ARPリクエストを受信すると、ubuntu-1のMACアドレスと受信ポートの紐付けをMACアドレステーブルに登録します。
そして、全ポートにARPリクエストをフラッディングします。

ubuntu-2は、ARPリクエストを受信すると、送信元IPアドレスと送信元MACアドレスの紐付けをARPテーブルに登録します。

ARPリプライ送信
ubuntu-2がARPリプライをユニキャスト送信します。

CML上でキャプチャしたファイルをWiresharkで見ると、下記の通りARPリプライのパケットの中身が見えます。

L2SWは、ARPリプライを受信すると、ubuntu-2のMACアドレスと受信ポートの紐付けをMACアドレステーブルに登録します。
そして、MACアドレステーブルを参照して、Gi0/0に転送します。

ubuntu-1は、ARPリプライを受信すると、送信元IPアドレスと送信元MACアドレスの紐付けをARPテーブルに登録します。

これで実際のICMP通信を行う準備ができました。
ICMPエコーリクエスト送信
ubuntu-1がARPテーブルを参照し、ubuntu-2のMACアドレスを指定して、ICMPエコーリクエストをユニキャスト送信します。

CML上でキャプチャしたファイルをWiresharkで見ると、下記の通りICMPエコーリクエストのパケットの中身が見えます。

L2SWはMACアドレステーブルを参照して、Gi0/1に転送します。

ubuntu-2がICMPエコーリクエストを受信します。

ICMPエコーリプライ送信
ubuntu-2がICMPエコーリプライを送信します。

CML上でキャプチャしたファイルをWiresharkで見ると、下記の通りICMPエコーリプライのパケットの中身が見えます。

L2SWはMACアドレステーブルを参照して、Gi0/0に転送します。

ubuntu-1がICMPエコーリプライを受信し、ICMPによる通信が正常に完了しました。

実機のステータス、ログの確認
CML上の実機のステータス、ログを確認します。
ubuntu-1(192.168.1.1)
ubuntu-1からPingを1回だけ実施するコマンドは下記となります。
ping -c 1 192.168.1.2
PIngが成功した後、ARPテーブルを確認すると、ubuntu-2のIPアドレスとMACアドレスが登録されているのが分かります。
ip neigh

ubuntu-2(192.168.1.2)
ubuntu-2でもARPテーブルを確認すると、ubuntu-1のIPアドレスとMACアドレスが登録されているのが分かります。
ip neigh

L2SW
L2SWでは、下記のデバッグコマンドを設定することで、MACアドレステーブルへの追加登録時にログが出力されるようになります。
debug matm add

ubuntu-1とubuntu-2のMACアドレスが追加されたログが表示され、MACアドレステーブルにポート番号との紐付きが登録されていることが分かります。
show mac address-table

これで、基本的なTCP/IP通信の仕組み(同一セグメント内の通信)の説明は完了です!
