OSI参照モデルレイヤー2（データリンク層）の概要

# 【データリンク層プロトコルについて】
データリンク層は、同じネットワークにいる端末を識別し、物理層の上でビット列を正確に伝送する仕組みを提供している。

最下層の物理層はコンピュータで扱う0と1で構成される「デジタルデータ」と、LANケーブルや電波で扱う「信号」とを交互に変換する役割を担っている。
データを送信する端末は、物理層でデジタルデータを信号に変換するとき、符号化を施している。
したがって、多少のエラー（ビット誤り）であれば、受信する端末で訂正できないわけではない。しかし、複雑なエラーになってしまうと物理層ではお手上げ状態になる。

データリンク層は、デジタルデータ全体の整合性をチェックすることによって、物理層だけでは訂正しきれないエラーを検知し、デジタルデータとしての信頼性を担保する。
また、<b>「MACアドレス」</b>というネットワーク上の住所を使用して、送信端末と受信端末を識別する。

# 《イーサネット》
有線LANで使用されているレイヤー2プロトコルのデファクトスタンダードが「イーサネット」
イーサネットでは、どのようなフォーマット（形式）でカプセル化を行い、どのようにしてエラーを検知するのかが定義されている。<br>
イーサネットによってカプセル化されるパケットのことを<b>「イーサネットフレーム」</b>という。
イーサネットのフレームフォーマットには「イーサネットⅡ規格」と「IEEE802.3規格」の2種類がある。
Webやメール、ファイル共有から認証にいたるまで、TCP/IPでやり取りするほとんどのパケットがイーサネットⅡを使用している。

# 《イーサネットⅡのフレームフォーマット》
イーサネットⅡは「プリアンブル」「宛先/送信元MACアドレス」「タイプ」「イーサネットペイロード」「FCS」という5つのフィールドで構成されている。このうち、プリアンブル、宛先/送信元MACアドレス、タイプを合わせて<b>「イーサネットヘッダー」</b>という。FCSのことを別名「イーサネットトレーラー」という。  
- <b>プリアンブル</b>
「これからイーサネットフレームを送ります」という合図を意味する8バイト(64ビット)の特別なビットパターン
先頭から「10101010」が7つ送られ、最後に「10101011」が1つ送られる。  
受信側の端末はイーサネットフレームの最初に付与されている、この特別なビットパターンを見てこれからイーサネットフレームが届くと判断している。
<p>

- <b>宛先/送信元MACアドレス</b>  
イーサネットネットワークに接続している端末を識別する6バイト（48バイト）のID。  
送信側はイーサネットフレームを送り届けたい端末のMACアドレスを「宛先MACアドレス」に 自分のMACアドレスを「送信元MACアドレス」にセットしてイーサネットを送出する。
受信側は宛先MACアドレスを見て自分のMACアドレスなら受け入れ、関係ないMACアドレスだったら破棄する。  
<p>

- <b>タイプ</b> 
ネットワーク層（レイヤー3）でどんなプロトコルを使用しているか表す2バイト（16ビット）のID。  
IPv4だったら「0x0800」、IPv6だったら「0x86DD」など使用するプロトコルやバージョンによって値が決まっている。  
<p>

- <b>イーサネットペイロード</b>  
ネットワーク層のデータそのものを表している。  
サイズはデフォルトで46～1500バイトの範囲内に収めなくてはいけない。  
46バイトに足りないようであれば、<b>「パディング」</b>というダミーのデータを付与することで強引に46バイトにする。  
逆に1500バイト以上のデータになるようであれば、トランスポート層やネットワーク層でデータを分割して1500バイトに収める。  
※L2ペイロードに格納できるデータの最大サイズのことを<b>「MTU」</b>という。  
<p>

- <b>FCS（Frame Check Sequence）</b>
イーサネットフレームが壊れていないかを確認するためにある4バイト（32ビット）のフィールド

# 《MACアドレス》
MACアドレスはLANに接続している端末の識別IDで6バイト（48ビット）で構成されている。
物理マシンであれば、物理NICを製造する時、ROMに書き込まれる。
仮想マシンで有れば、デフォルトでハイパーバイザーから仮想NICに対して割り当てられる。
コンテナであれば、デフォルトで起動時に割り当てられたIPアドレスから自動的にMACアドレスが生成される。

MACドレスの中でも特別な意味を持つビットが、先頭から8ビット目にある「I/Gビット」と7ビット目にある「U/Lビット」
I/Gビットは通信の種類を表し、U/Lビットは運用管理方法を表している。
I/Gビットは、そのMACアドレスが「ユニキャストアドレス」か「マルチキャストアドレス」かを表している。
U/Gビットは、そのMACアドレスがIEEEによって運用されている「ユニバーサルアドレス」か、組織内で運用管理されている「ローカルアドレス」かを表している。

MACアドレスはIEEEが一意に管理しているOUIと、ベンダーが一意に管理しているUAAで、世界で1つだけの物になるとされていたが、最近はベンダーの中でUAAが使い回されていたり、仮想化環境などではUAAを独自のアルゴリズムで生成したりするようになっているため、必ずしも一意になると限られなくなっている。
1つのLANに同じMACアドレスを持つ端末が複数存在すると、その端末たちは正常に通信できない。

# 《ARP》
ネットワークの世界においてアドレスを示すものは「MACアドレス」と「IPアドレス」の2つ。

MACアドレスはNICそのままに指定するアドレスで、データリンク層で動作する。
IPアドレスはOSに設定するアドレスで、ネットワーク層で動作する。
この2つのアドレスが独立して動作してしまうと、データリンク層とネットワーク層の情報の整合性が取れず、通信が成立しない。

この2つのアドレスを紐づけ、データリンク層とネットワーク層の架け橋的な役割を担っているプロトコルが「ARP」実際のデータ通信に先だって、ARPで宛先IPアドレスから宛先MACアドレスを求める。（アドレス解決）

#### ARPのフレームフォーマット
ARPはイーサネットヘッダーのタイプコードで「0x0806」と定義されている。
また、イーサネットペイロードにデータリンク層やネットワーク層の情報を詰め込むことによってMACアドレスとIPアドレスの紐づけを行っている。
- <b>ハードウェアタイプ</b>
使用しているレイヤー2プロトコルを表す2バイト（16ビット）のフィールド
イーサネットの場合は「0x0001」が入る。
<p>

- <b>プロトコルタイプ</b>
使用しているレイヤー3プロトコルを表す2バイト（16ビット）のフィールド
IPv4の場合は「0x0800」が入る。
<p>

- <b>ハードウェアアドレスサイズ</b>
MACアドレスの長さをバイト単位で表す1バイト（8ビット）のフィールド
MACアドレスは48ビット=6バイトなので「6」が入る。
<p>

- <b>プロトコルアドレスサイズ</b>
ネットワーク層で使用するアドレス、IPアドレスの長さをバイト単位で表す1バイト（8ビット）のフィールド
IPv4のアドレスは32ビット=4バイトなので「4」が入る。
<p>

- <b>オペレーションコード（オプコード、動作コード）</b>
ARPフレームの種類を表す2バイト（16ビット）のフィールド
ARP Requestを表す「1」、ARP Replyを表す「2」の2つが実際の現場でよく見るコード
<p>

- <b>送信元MACアドレス/送信元IPアドレス</b>
ARPを送信する端末のMACアドレスとIPアドレスを表す可変長のフィールド
<p>

- <b>目標MACアドレス/目標IPアドレス</b>
ARPでアドレス解決したいMACアドレスとIPアドレスを表す可変長フィールド
最初はMACアドレスを知りようがないので、ダミーのMACアドレス「00:00:00:00:00:00」をセットする。


#### APRによるアドレス解決の流れ
1. ネットワーク層から受け取ったIPパケットに含まれる宛先IPアドレスを見て、自身の「ARPテーブル」を検索する。ARPテーブルは、ARPでアドレス解決した情報を一定時間保持するメモリ上のテーブルのこと。
最初は当然空っぽなのでARP Requestの処理に移行する。<p>

2. ARP Requestを送信するために、まずARPの各フィールドの情報を組み立てる
オペレーションコードは、ARP Requestを表す「1」目標MACアドレスは、ARP Requestでは無視されるため、ダミーのMACアドレスになる。
目標IPアドレスは、IPヘッダーに含まれるIPアドレスによって変わる。
宛先IPアドレスが同じネットワークにいる場合は、そのまま宛先IPアドレスを目標IPアドレスとして使用する。<br>
異なるネットワークにある場合は、そのネットワークの出口となる「ネクストホップ」を目標IPアドレスとして使用する。
次にイーサネットヘッダーを組み立てる。ARP Requestはブロードキャストを使用する。  
したがって宛先MACアドレスはブロードキャスト、送信元MACアドレスは自身のMACアドレスになる。<p>

3. ARP Requestはブロードキャストなので、そのイーサネットネットワークにいる端末すべてに行き渡る。  
アドレス解決対象機器はARP Requestを自分に対するARPフレームであると判断して、受け入れる。  
合わせて、ARPフィールドに含まれる送信元MACアドレスと送信元IPアドレスをARPテーブルに書き込む。<p>  

4. ARP Requestを受けった機器は、ARP Replyを返信するために、まずARPの各フィールドの情報を組み立てる。  
オペレーションコードはARP Replyを表す「2」次にイーサネットヘッダーを組み立てる。ARP Replyはユニキャストを使用する。<p>

5. ARP Requestを送信した機器はARP ReplyのARPフィールドに含まれる送信元MACアドレスと送信元IPテーブルを見て、MACアドレスを認識する。あわせてARPテーブルに書き込み一時保存する。<p>

6. アドレス解決したMACアドレスをイーサネットヘッダーの宛先MACアドレスに、IPアドレスをIPヘッダーの宛先IPアドレスに入れて、データ通信を開始する。<p>


#### ARPのキャッシュ機能
すべての通信の始まりの始まりはARP。
ARPでパケットを送信するべきMACアドレスを知って、初めて通信できるようになる。  
ARPの弱点は「ブロードキャストを前提としている」ということ、とは言え最初は相手のMACアドレスを知らないので、ブロードキャストを使用するのは仕方ない。
ブロードキャストは同じネットワークにいるすべての端末に対してパケットを送ってしまう非効率な通信であるため、APRはアドレス解決した内容を保持する「キャッシュ機能」を備えている。
可能な限りブロードキャストをしないようにして、ネットワークがARPでいっぱいにならないようにARPの処理を行っている。
キャッシュ機能の動作はOSやそのバージョンによって異なる。

# 《L2スイッチング》
L2スイッチは、複数の有線LAN端末を接続し、イーサネットフレームを転送するネットワーク機器L2スイッチは、イーサネットヘッダーに含まれている送信元MACアドレスと自分自身のポート番号（インタフェース番号）を管理することによって、イーサネットフレームの転送先を切り替え、通信の効率化を図っている。
このイーサネットフレームの転送先を切り替える技術のことを<b>「L2スイッチング」</b>という。  
また、送信元MACアドレスとポート番号を管理するテーブルのことを<b>「MACアドレステーブル」</b>という。

#### MACアドレステーブルの作られ方
1. イーサネットフレーム（リクエストパケット）を作り、LANケーブルに流す。  
この時点でスイッチのMACアドレステーブルはまだ空っぽ<p>  

2. イーサネットフレームを受け取ったスイッチはそのフレームの送信元MACアドレスとフレームを受け取ったポート番号をMACアドレステーブルに登録する。<p>

3. スイッチはこの時点で自身のどのインタフェースに宛先の機器が接続されているか分からない。そこで、イーサネットフレームのコピーを接続されているすべてのインタフェースに送信する。この動作を<b>「フラッディング」</b>という。<p>

4. コピーフレームを受け取った受信機器は、送信機器に対するイーサネットフレーム（リプライパケット）を作り、LANケーブルに流す。<p>

5. イーサネットフレーム（リプライパケット）を受け取ったスイッチは、イーサネットフレームの送信元MACアドレスに入っているMACアドレスと、そのフレームを受け取ったポート番号をMACアドレステーブルに登録する。<p>  

6. これでどのポートに機器が接続されているかを認識できたので、これ以降は通信を直接転送するようになる。（フラッディングは行わない） <p> 

7. スイッチは機器が一定期間通信しなくなると、MACアドレステーブルの中の関連している行を削除する。
削除するまでの時間（エージングタイム）は機器によって異なるが、任意に変更することも可能。<p>

# 《VLAN》
VLANは1台のL2スイッチを仮想的に複数のL2スイッチに分割する技術のこと。  
L2スイッチのポートにVLANの識別番号となる<b>「VLAN ID」</b>という数字を設定し、  
異なるVLAN IDが設定されているポートにはイーサネットフレームを転送しないようにする。  

#### ポートVLANとタグVLAN
- <b>ポートVLAN（ポートベースVLAN、アクセスVLAN）</b>
1つのポートに対して、1つのVLANを割り当てる技術。
フラッディングもそれぞれのVLANで完結するので、同じVLANのポートに接続されている端末とは直接イーサネットフレームをやり取りできるが、異なるVLANのポートに接続されている端末とは直接やり取りできない。<p>

- <b>タグVLAN</b>
イーサネットフレームにVLAN情報を「VLANタグ」としてくっつける技術でIEEE802.1Qで標準化されている。
タグVLANを使用すると、VLANタグを利用してVLANを識別できるようになり、1つのポートで複数のVLANのイーサネットフレームを処理できるようになる。
タグVLANのポートは、VLANタグが付いていない、純粋なイーサネットフレームを受け取ったときに、どのVLANイーサネットとして処理するか決めておく必要がある。このVLANを<b>「ネイティブVLAN」</b>という。  

# 参考資料

https://www.sbcr.jp/product/4815618599/