普段の実務ではルーティング(L3)について考える機会が多いですが、Layer2についてはあまり意識することがありません。
そこで今回は自身の復習も兼ねてL2における通信の流れを順を追って整理しました。
以下の図のホストAからホストCに初めて通信を行う例で説明していきます。
※図のアイコンはCiscoのフリー素材を利用してます
https://www.cisco.com/c/en/us/about/brand-center/network-topology-icons.html
前提
- ホストAはL2SWに接続された直後であり、ホストB/Cと通信したことがない
通信開始
- ホストAはホストCに送信するデータに付与するL3ヘッダーを生成する
- 送信元IPアドレス:
10.10.10.1
- 宛先IPアドレス:
10.10.10.3
- 送信元IPアドレス:
- ホストAはホストCに送信するパケットに付与するL2ヘッダーを生成しようとする
- 送信元MACアドレス:
aaaa.aaaa.aaaa
- 宛先MACアドレス:
???
(ホストCのMACアドレスがわからない!)
- 送信元MACアドレス:
- ホストAはL2ヘッダーの宛先MACアドレス(ホストCのMACアドレス)を知るためにARPリクエスト(ブロードキャスト)を発する
- ARPリクエストがL2SWのポート①に到達すると、L2SWは送信元MACアドレスとその受信ポートを学習する=L2SWのMACアドレステーブルにホストAのMACアドレス(
aaaa.aaaa.aaaa
)とポート①の紐づけが載る - L2SW#1はブロードキャストであるARPリクエストをポート②と③から発信する
- ホストBとホストCはARPリクエストに設定されている送信元MACアドレスと送信元IPアドレスを紐づけて学習する=ホストBCのARPテーブルにホストAのIPアドレス(
10.10.10.1
)とMACアドレス(aaaa.aaaa.aaaa
)の紐づけが載る - ホストBはARPリクエストに設定されている宛先IPアドレスを確認し、自身のIPアドレスとは無関係であると判断してARPリクエストを破棄する
- ホストCはARPリクエストに設定されている宛先IPアドレスを確認し、自身のIPアドレス宛てであると判断してARPリクエストを受信する
- ホストCはARPレスポンスを生成してホストA宛てに送信する
- ARPレスポンスがL2SW#1のポート③に到達すると、L2SWは送信元MACアドレスとその受信ポートを紐づけて学習する=L2SWのMACアドレステーブルにホストCのMACアドレス(
cccc.cccc.cccc
)とポート③の紐づけが載る - ホストAはホストCから送信されたARPレスポンスに設定されている送信元MACアドレスと送信元IPアドレスを紐づけて学習する=ホストAのARPテーブルにホストCのIPアドレス(
10.10.10.3
)とMACアドレス(cccc.cccc.cccc
)の紐づけが載る - ホストAは自身のARPテーブルを参照して、ホストCに送信するパケットに付与するL2ヘッダーを生成する
- 送信元MACアドレス:
aaaa.aaaa.aaaa
- 宛先MACアドレス:
cccc.cccc.cccc
- 送信元MACアドレス:
- ホストAはホストC宛てにフレームを送信する
この記事のポイント
- 実際の通信はLayer3のIPアドレスの他にLayer2のMACアドレスも必要
- 通信相手のMACアドレスを知るためにARPという機能(プロトコル)がある
- ARPテーブルはIPアドレスとMACアドレスの紐づけ情報である(Windows10端末の場合はARPテーブルの保持時間は15秒から45秒)
- L2SWは自身のポートとそこにつながる機器のMACアドレスの紐づけ情報をMACアドレステーブルとして保持する(多くのメーカーで保持時間はデフォルトで300秒)
参考
ホストAが送信するARPリクエストの要素(一部抜粋)
イーサネットヘッダ
- 送信元MACアドレス:
aaaa.aaaa.aaaa
- 宛先MACアドレス:
FF:FF:FF:FF:FF:FF
(ブロードキャストアドレス)
ARPヘッダ
- 送信元IPアドレス:
10.10.10.1
- 送信元MACアドレス:
aaaa.aaaa.aaaa
- 宛先IPアドレス:
10.10.10.3
- 宛先MACアドレス:
00:00:00:00:00:00
(不明のため未設定)
ホストCが送信するARPレスポンスの要素(一部抜粋)
イーサネットヘッダ
- 送信元MACアドレス:
cccc.cccc.cccc
- 宛先MACアドレス:
aaaa.aaaa.aaaa
ARPヘッダ
- 送信元IPアドレス:
10.10.10.3
- 送信元MACアドレス:
cccc.cccc.cccc
- 宛先IPアドレス:
10.10.10.1
- 宛先MACアドレス:
aaaa.aaaa.aaaa