📦

カプセル化からフレーム送出までの送信処理を追ってL2とL3の役割を理解する

に公開

IPとMACの違いを含め、送信データがどのようにパケット/フレームへ組み立てられて送出されるのかを、十分に言語化できていませんでした。
本記事では、カプセル化ルーティングARPを軸に送出までの処理を整理し、L2/L3の役割分担を明確にします。

各ヘッダーの役割

アプリケーションが送信したいデータは、TCP/IPスタックの中で順にヘッダーが付与され、最終的に イーサネットフレーム(L2) としてNICから送出されます。
送出までの流れを追う前に、混同しやすいIPヘッダーとMACヘッダーの違いについてまとめておきます。

  • IPヘッダー(L3 / ネットワーク層

    • 最終的な行き先」を示す
    • ヘッダー内容物:宛先IP、送信元IP、TTL、プロトコル(TCP/UDP)など
  • MACヘッダー(L2 / データリンク層:Ethernet

    • 次に渡す相手(次ホップ)」を示す
    • ヘッダー内容物:宛先MAC、送信元MAC、EtherType(IPv4/IPv6)など

重要なのは、IPヘッダーの宛先は“最終目的地” である一方で、MACヘッダーの宛先は“次ホップ” である点です。
そのため、ルータを越えるたびに MACヘッダーは付け替えられますが、IPヘッダー(宛先IP)は基本的に維持されます(※NAT等を除く)。

送信処理の流れ:ヘッダー付与と次ホップ解決

以降の章では、上述のアプリから受け取った送信データに対して、IPヘッダー・MACヘッダーが付与され、NICからフレームを送出するまでの流れを、レイヤーに沿ってまとめていきます。

1. L4(TCP)がデータをセグメント化し、TCPヘッダーを付与する

アプリケーションから渡された送信データは、TCPによって必要に応じて分割され、TCPセグメントとして扱われます。TCPヘッダーには以下のような情報が入ります。

  • 送信元ポート / 宛先ポート
  • シーケンス番号、ACK番号
  • フラグ(SYN/ACK/FINなど)
  • ウィンドウサイズ(フロー制御) など

ここまでできた時点では「TCPセグメント」であり、まだネットワーク上に出すための宛先(IP/MAC)情報は付いていません。

TCPについて深く知りたい方は以下の記事を参考にしてください。
https://zenn.dev/ashika018/articles/9aeb8637439f26
https://zenn.dev/ashika018/articles/85109dd92c1b04

2. L3(IP)がIPヘッダーを付与し、IPパケットを作成する

TCPセグメント(データの断片にTCPヘッダーを付加したもの)がL3(IP担当部分)に渡されます。
受け取ったら、最終目的地情報を格納したIPヘッダーを付与します。

3. 次に渡す相手(次ホップ)」をルーティングテーブルで決める

IPパケットの宛先IPが決まっても、L2で送るためには最終目的地に向かうための「次の行き先」が必要です。
そこでOSは、宛先IPとルーティングテーブルを照合し、次のどちらかを判断します。

  • 宛先IPが同一サブネット内
    → 次ホップ = 宛先ホスト
  • 宛先IPが別サブネット(インターネット等)
    → 次ホップ = デフォルトゲートウェイ(通常はルータ)

ルーティングテーブルの考え方は、下記の解説が分かりやすいです。
https://network.yamaha.com/knowledge/routing

4. ARPで「次ホップIP → 次ホップMAC」を解決する(IPv4の場合)

次ホップのIPが判明した後は、ARPによって「そのIPに対応するMACアドレス」を調べます。

ARPはイーサネットにあるブロードキャストという仕組みを使って、つながっているすべての機器にパケットを届けます。その中に転送先IPの機器がいたら、そのMACアドレスを応答で受け取ります。

ARPについては下記の解説がわかりやすいです。
https://envader.plus/article/205

5. MACヘッダーを付与して「イーサネットフレーム」として送出する

ARPで次ホップMACが分かったら、NICから送出するために MACヘッダー(Ethernetヘッダー) を付与し、最終的に イーサネットフレーム になります。
最後に、完成したフレームがNICから送出されます。

まとめ

  • IPは最終目的地、MACは次ホップを指す。IPヘッダーは(NAT等を除き)エンドツーエンドで基本維持される一方、MACヘッダーはホップごとに付け替えられる。
  • 送信データは TCPセグメント → IPパケット → イーサネットフレーム の順にカプセル化され、NICから送出される。
  • 送出直前に ルーティングで次ホップIPを決定し、ARPで次ホップIP→MACに変換する。ARP結果はARPキャッシュに保持され、毎回ブロードキャストしないよう最適化されている。

Discussion