Layer2の通信フロー

<br>
<p>
普段の実務ではルーティング(L3)について考える機会が多いですが、Layer2についてはあまり意識することがありません。
</p>

<p>
そこで今回は自身の復習も兼ねてL2における通信の流れを順を追って整理しました。
</p>

<p>
以下の図のホストAからホストCに初めて通信を行う例で説明していきます。
</p>

<br>

![Qiita_2025年1月の記事_挿入画像-2.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3948196/2d1d7ada-3429-fa8f-9a47-68b4126d971d.png)
※図のアイコンはCiscoのフリー素材を利用してます
https://www.cisco.com/c/en/us/about/brand-center/network-topology-icons.html

<h3>前提</h3>

<ul>
    <li>ホストAはL2SWに接続された直後であり、ホストB/Cと通信したことがない</li>
</ul>

<h2>通信開始</h2>

<ol>
    <li>ホストAはホストCに送信するデータに付与するL3ヘッダーを生成する
        <ul>
            <li>送信元IPアドレス：<code>10.10.10.1</code></li>
            <li>宛先IPアドレス：<code>10.10.10.3</code></li>
        </ul>
    </li>
    <li>ホストAはホストCに送信するパケットに付与するL2ヘッダーを生成しようとする
        <ul>
            <li>送信元MACアドレス：<code>aaaa.aaaa.aaaa</code></li>
            <li>宛先MACアドレス：<code>???</code>（ホストCのMACアドレスがわからない！）</li>
        </ul>
    </li>
    <li>ホストAはL2ヘッダーの宛先MACアドレス（ホストCのMACアドレス）を知るためにARPリクエスト(ブロードキャスト)を発する</li>
    <li>ARPリクエストがL2SWのポート①に到達すると、L2SWは送信元MACアドレスとその受信ポートを学習する＝L2SWのMACアドレステーブルにホストAのMACアドレス（<code>aaaa.aaaa.aaaa</code>）とポート①の紐づけが載る
    </li>
    <li>L2SW#1はブロードキャストであるARPリクエストをポート②と③から発信する</li>
    <li>ホストBとホストCはARPリクエストに設定されている送信元MACアドレスと送信元IPアドレスを紐づけて学習する＝ホストBCのARPテーブルにホストAのIPアドレス（<code>10.10.10.1</code>）とMACアドレス（<code>aaaa.aaaa.aaaa</code>）の紐づけが載る
    </li>
    <li>ホストBはARPリクエストに設定されている宛先IPアドレスを確認し、自身のIPアドレスとは無関係であると判断してARPリクエストを破棄する</li>
    <li>ホストCはARPリクエストに設定されている宛先IPアドレスを確認し、自身のIPアドレス宛てであると判断してARPリクエストを受信する</li>
    <li>ホストCはARPレスポンスを生成してホストA宛てに送信する</li>
    <li>ARPレスポンスがL2SW#1のポート③に到達すると、L2SWは送信元MACアドレスとその受信ポートを紐づけて学習する＝L2SWのMACアドレステーブルにホストCのMACアドレス（<code>cccc.cccc.cccc</code>）とポート③の紐づけが載る
    </li>
    <li>ホストAはホストCから送信されたARPレスポンスに設定されている送信元MACアドレスと送信元IPアドレスを紐づけて学習する＝ホストAのARPテーブルにホストCのIPアドレス（<code>10.10.10.3</code>）とMACアドレス（<code>cccc.cccc.cccc</code>）の紐づけが載る
    </li>
    <li>ホストAは自身のARPテーブルを参照して、ホストCに送信するパケットに付与するL2ヘッダーを生成する
        <ul>
            <li>送信元MACアドレス：<code>aaaa.aaaa.aaaa</code></li>
            <li>宛先MACアドレス：<code>cccc.cccc.cccc</code></li>
        </ul>
    </li>
    <li>ホストAはホストC宛てにフレームを送信する</li>
</ol>

<h3>この記事のポイント</h3>

<ul>
    <li>実際の通信はLayer3のIPアドレスの他にLayer2のMACアドレスも必要</li>
    <li>通信相手のMACアドレスを知るためにARPという機能(プロトコル)がある</li>
    <li>ARPテーブルはIPアドレスとMACアドレスの紐づけ情報である(Windows10端末の場合はARPテーブルの保持時間は15秒から45秒)</li>
    <li>L2SWは自身のポートとそこにつながる機器のMACアドレスの紐づけ情報をMACアドレステーブルとして保持する(多くのメーカーで保持時間はデフォルトで300秒)</li>
</ul>


<h3>参考</h3>

<h4>ホストAが送信するARPリクエストの要素（一部抜粋）</h4>
<h6>イーサネットヘッダ</h6>

<ul>
    <li>送信元MACアドレス：<code>aaaa.aaaa.aaaa</code></li>
    <li>宛先MACアドレス：<code>FF:FF:FF:FF:FF:FF</code>（ブロードキャストアドレス）</li>
</ul>

<h6>ARPヘッダ</h6>

<ul>
    <li>送信元IPアドレス：<code>10.10.10.1</code></li>
    <li>送信元MACアドレス：<code>aaaa.aaaa.aaaa</code></li>
    <li>宛先IPアドレス：<code>10.10.10.3</code></li>
    <li>宛先MACアドレス：<code>00:00:00:00:00:00</code>（不明のため未設定）</li>
</ul>

<h4>ホストCが送信するARPレスポンスの要素（一部抜粋）</h4>
<h6>イーサネットヘッダ</h6>

<ul>
    <li>送信元MACアドレス：<code>cccc.cccc.cccc</code></li>
    <li>宛先MACアドレス：<code>aaaa.aaaa.aaaa</code></li>

</ul>

<h6>ARPヘッダ</h6>

<ul>
    <li>送信元IPアドレス：<code>10.10.10.3</code></li>
    <li>送信元MACアドレス：<code>cccc.cccc.cccc</code></li>
    <li>宛先IPアドレス：<code>10.10.10.1</code></li>
    <li>宛先MACアドレス：<code>aaaa.aaaa.aaaa</code></li>
</ul>