このページの目次
Ethernet と MAC
イーサネットフレームは「あらゆるものをカプセル化できる」の起点です。MACアドレスからVLAN、リンクアグリゲーションに至るまで、レイヤー2はすべての上位プロトコルの基盤となる伝送路です。フレーム構造とスイッチングの原理を理解すれば、「パケットが1本のケーブルから別のケーブルへどのように移動するか」を理解したことになります。
概要
Ethernetは、世界で最も広く展開されているLAN技術です。1973年にXerox PARCでBob Metcalfeによって開発された2.94Mbpsのプロトタイプから、現在の800Gbps光インターフェースに至るまで、コアとなるフレームフォーマットはほとんど変化していません。これはOSIモデルのL2(データリンク層)で動作し、同じブロードキャストドメイン内で、フレームをソースMACアドレスからターゲットMACアドレスへ配信する役割を担います。802.3標準ファミリは、これに基づいてVLAN分離(802.1Q)、フロー制御(802.3x PAUSE)、リンクアグリゲーション(802.3ad LACP)などの機能を拡張しています。Linuxカーネルは、net/ethernet/ と drivers/net/ を通じて、プロトコル処理とハードウェアドライバの抽象化を提供します。
802.3 フレームフォーマット
Ethernetフレーム構造は、1980年のDIX仕様以来、本質的な変化はありません。注目すべき進化は、802.1Q VLANタグの挿入と、802.3ad LACPのネゴシエーション層のみです。
Octet 0-6: Preamble (7 × 0x55)
PHY層で使用され、クロック同期とビットロックに使用されます。10Mbpsでは極めて重要
(Manchester符号化) ですが、現代のSerDesでは不要ですが、削除されていません。
Octet 7: SFD (Start Frame Delimiter = 0xD5)
フレームの開始を示します。最後のPreambleバイトの下位ビットが異なります — 0x55 →
0xD5 (bit 0: 1→1, bit 2: 1→0) — ハードウェアはこの遷移を検出してバイト境界をロックします。
Octet 8-13: Destination MAC (6 bytes)
バイト0のbit 0: 0 = ユニキャスト, 1 = マルチキャスト.
全1 (ff:ff:ff:ff:ff:ff) = ブロードキャスト — スイッチはすべてのポートにフローディングします。
Octet 14-19: Source MAC (6 bytes)
Octet 20-21: EtherType または Length (2 bytes)
≤ 1500 (0x05DC): Lengthとして解釈 (802.3 rawモード、ほとんど使用されない)
≥ 1536 (0x0600): EtherTypeとして解釈
重要な値:
0x0800 IPv4
0x0806 ARP
0x8100 VLAN (802.1Q)
0x86DD IPv6
0x88A8 Q-in-Q / Provider Bridge (802.1ad)
0x8870 Jumbo frame (非標準、一部のドライバで使用)
0x8809 Slow Protocols (LACP, 802.3x PAUSE)
Octet 22+: Payload
標準: 46-1500 bytes (VLANタグを除く)。
46バイトに満たない場合 → 46バイトまでパディング (padding)。パディングの内容は未定義 —
Linuxはゼロでパディングしますが、他のドライバはランダムデータを使用する可能性があります。
PaddingはIPヘッダーのTotal Lengthには含まれません — 受信側は
EtherType/LengthフィールドまたはL3ヘッダーのlengthフィールドによって区別します。
CRC: FCS (Frame Check Sequence, 4 bytes, CRC-32)
多項式: x³² + x²⁶ + x²³ + x²² + x¹⁶ + x¹² + x¹¹ + x¹⁰ + x⁸ + x⁷ +
x⁵ + x⁴ + x² + x + 1
計算範囲: Destination MAC から Payload末尾まで (Preamble/SFD/FCS自身を除く)
ハードウェア (MACコントローラ) によって計算および検証される → エラーフレームはハードウェアによって破棄され、カーネルはこれを認識しません。
一部のドライバでは「エラーフレームの受信」モードを設定できます (ethtool -K rx-fcs on)、
デバッグ用 (tcpdumpでFCSエラーカウントを確認可能)。
Inter-Frame Gap (IFG):
フレーム間インターバル: 12バイトタイム (96ビットタイム) のアイドル状態。
1000BASE-T: 96 ns
10GBASE-R: 9.6 ns
100GBASE-R: 0.96 ns
高速レートではIFGが非常にタイトです — ハードウェアは1つのIFG内で前のフレームの処理を完了し、次のフレームのpreamble
検出を開始しなければなりません。これが、高速NICがフレームごとの割り込みではなく、バッファディスクリプタリングを必要とする理由です。
MACアドレス構造
48 bits (6 bytes)、IEEE割り当て、グローバルユニーク (理論上):
Byte 0, bit 0 (I/G bit):
0: ユニキャスト (individual address)
1: マルチキャスト (group address)
→ これはMAC層が「このフレームは自分宛てかどうか」を判断する第一歩です — NICハードウェアがチェックします
Byte 0, bit 1 (U/L bit):
0: ユニバーサルアドミニステレーテッド (ベンダーが焼込んだOUI)
1: ローカルアドミニステレーテッド (ソフトウェアで設定、例: 仮想NIC、コンテナ、MACランダム化)
OUI (Organizationally Unique Identifier): バイト0-2 = IEEE割り当て
NIC固有: バイト3-5 = ベンダー内での割り当て
Linux操作:
ip link set eth0 address aa:bb:cc:dd:ee:ff ← MACアドレス変更 (down状態が必要)
ip link show eth0 | grep link/ether
802.1Q VLAN
VLANタグ (4 bytes) は、Source MACの直後、EtherTypeの前に挿入されます:
Octet 0-1: TPID (Tag Protocol Identifier)
0x8100 = Customer VLAN (C-VLAN)
0x88A8 = Service Provider VLAN (S-VLAN, 802.1ad)
0x9100 = 旧式 (0x88A8に置き換えられた)
Octet 2-3: TCI (Tag Control Information):
Bits 0-2: PCP (Priority Code Point, 802.1p)
0 = Best Effort, 1 = Background, 2 = Spare, 3 = Excellent Effort,
4 = Controlled Load, 5 = Video, 6 = Voice, 7 = Network Control
→ sk_buff->priority にマッピングされ、tc qdisc のキュー選択に使用されます
Bit 3: DEI (Drop Eligible Indicator)
1 = 輻輳時に優先的に破棄可能 (IP DSCPのECNとは異なります)
Bits 4-15: VID (VLAN Identifier)
有効値: 1-4094 (0 = VLANなし, 4095 = 予約済み)
各イーサネットインターフェースは複数のVLANに属することができます (trunk port)
Q-in-Q (802.1ad, Provider Bridge):
二重VLANタグ:
[DA][SA][0x88A8][S-VLAN TCI][0x8100][C-VLAN TCI][EtherType][Payload]
外側 (S-VLAN) = プロバイダネットワークの分離
内側 (C-VLAN) = クライアント自用のVLAN
Linux:
ip link add link eth0 name eth0.100 type vlan id 100
ip link add link eth0.100 name eth0.100.200 type vlan id 200 proto 802.1ad
Jumbo Frames
標準MTU 1500バイトは、10Mbps Ethernet時代の妥協点です — 小さなMTUは短いスロットタイムを意味し、 短い衝突検出ウィンドウとなります。スイッチドEthernetへの移行後、物理的にこの制限は不要になりましたが、 標準MTUはすべての上位プロトコルでデフォルト値として仮定されています。
Jumbo MTU: 通常 9000 bytes (非標準ですが、広くサポートされています)
利点:
- 割り込みの削減: 1 × 9000B フレーム vs 6 × 1500B フレーム — 割り込みが6分の1に
- CPU処理の削減: NICのパーパケットオーバーヘッド (ディスクリプタ、DMA同期) が6分の1に
- ヘッダーオーバーヘッドの削減: 5つの追加フレームの (14B Eth + 20B IP + 20B TCP) × 5 = 270B の節約
- NFS/iSCSI: 大部分のIOは4KB-64KBであり、jumboフレームではより多くのデータを1つのフレームに収められる
代償:
- パス上のすべてのデバイス (スイッチ、ルータ、NIC) がjumboをサポートする必要があります
- jumboをサポートしないデバイス: 静かに破棄される (IP DFビットが設定されていない限り、ICMP Frag Neededは送信されない)
→ 「MTUブラックホール」— 最もトラブルシューティングが難しいネットワーク問題の一つ
設定:
ip link set eth0 mtu 9000
/etc/dhcpcd.conf または NetworkManager: MTUの永続化
注意: ブリッジのMTUは、すべてのスレーブの最小MTU以上でなければなりません
PAUSE (802.3x) と PFC (802.1Qbb)
802.3x PAUSE フレーム:
EtherType: 0x8808
MAC Control Opcode: 0x0001 (PAUSE)
Pause Time: 2 bytes (512ビットタイム単位)
マルチキャストアドレス 01:80:c2:00:00:01 に送信
受信側: PAUSEフレームを送信 (pause_time=N)
送信側: N × 512ビットタイムの間、送信を停止
問題: 1つのフローの輻輳 → 全体のリンクのトラフィックが停止
→ 複数フローが混在するシナリオには不向き (データセンターではPFCを使用)
PFC (Priority-based Flow Control, 802.1Qbb):
PCP (8つの優先度) ごとに独立して制御:
輻輳している優先度のみが一時停止 → 他の優先度は転送を継続
→ RoCE (RDMA over Converged Ethernet) のハードウェア基盤
LACP (802.3ad / 802.1AX)
LACPは、複数の物理ポートを1つの論理リンクに束ねます:
LACPDU (Link Aggregation Control Protocol Data Unit):
EtherType: 0x8809 (Slow Protocols)
Subtype: 0x01 (LACP)
30秒ごと (slow) または1秒ごと (fast) に送信
LACPDUの内容:
Actor: system_priority + system_id (MAC) + key + port_priority + port_number + state
Partner: (同上、遠端情報)
Collector: max_delay
State bits (重要):
LACP_Activity (bit 0): Active (積極的にLACPDUを送信) vs Passive (応答のみ)
LACP_Timeout (bit 1): Long (30秒) vs Short (1秒)
Aggregation (bit 2): このポートはアグリゲーション可能
Synchronization (bit 3): このポートは同期済み (転送準備完了)
Collecting (bit 4): 着信トラフィックを転送可能
Distributing (bit 5): 発信トラフィックを転送可能
Defaulted (bit 6): デフォルトパラメータを使用 (partnerが応答していない)
Linux bonding modes:
mode=0 (balance-rr): ラウンドロビン — LACPに依存せず、ロードバランシングのみ
mode=1 (active-backup): アクティブ/スタンバイ — LACPに依存しない
mode=2 (balance-xor): MACハッシュに基づく — スイッチとの連携が必要
mode=4 (802.3ad): LACPダイナミックネゴシエーション — スイッチでもLACPを有効にする必要がある
参考
- 802.3-2022: IEEE標準 (P802.3 作業部会)
- カーネル:
net/ethernet/eth.c(プロトコル処理),drivers/net/bonding/(LACP),net/8021q/(VLAN) - LWN: "Jumbo frames and MTU in Linux"
キーワード: Ethernet, 802.3, MACアドレス, 802.1Q, VLAN, Q-in-Q, jumbo frame, PAUSE, LACP, 802.3ad