# Ethernet frame _Сеть: L2 / L3 · LinuxLab Knowledge Base_ **TL;DR:** Ethernet-frame - единица передачи на L2: dst-MAC, src-MAC, ethertype, payload (обычно IP-пакет), FCS-checksum. Стандартный MTU = 1500 байт. ## Структура frame'а ``` [ Preamble ] [ Dst MAC ] [ Src MAC ] [ EtherType ] [ Payload ] [ FCS ] 7+1 6 6 2 46 - 1500 4 ``` - **Preamble + SFD** (8 байт) - синхронизация на физическом уровне; редко видно в tcpdump'е, его обычно отрезают - **Dst MAC / Src MAC** - см. [mac-address](/kb/mac-address.md) - **EtherType** - что в payload: - `0x0800` - IPv4 - `0x0806` - [arp](/kb/arp.md) - `0x86DD` - IPv6 - `0x8100` - 802.1Q VLAN tag - **Payload** - собственно содержимое (IP-пакет в большинстве случаев) - **FCS** - Frame Check Sequence (CRC32) для контроля целостности; железо проверяет автоматически, в tcpdump обычно не видно ## MTU и фрагментация **MTU** (Maximum Transmission Unit) - максимальный payload-размер frame'а. Стандартный Ethernet - **1500 байт**. Внутри: - 20 байт IPv4 header - 20 байт TCP header (без options) - **1460 байт** доступно под TCP-payload - это **MSS** (Maximum Segment Size) Если IP-пакет больше MTU и DF (Don't Fragment) не выставлен - роутер фрагментирует его на куски. В IPv6 фрагментация только на источнике (ICMP «Packet Too Big» → отправитель уменьшит размер). Меньший MTU - VPN-туннели (IPSec/Wireguard ~1420), PPPoE (~1492), Jumbo - 9000 байт (внутри ДЦ для уменьшения header overhead). Знать свой MTU критично для производительности - пакеты больше MTU дропаются без явной ошибки приложения (особенно через VPN). ## VLAN tagging Если frame идёт по transit-link'у с несколькими VLAN'ами, между Src MAC и EtherType вставляется 4-байтный 802.1Q-tag - VLAN ID + priority. EtherType становится 0x8100, реальный EtherType (0x0800 для IP) идёт после tag'а. Видно как `eth0.100` (VLAN 100 на eth0) или явно через `tcpdump -e`: ``` vlan 100, p 0, ethertype IPv4 (0x0800), 10.0.0.1 > 10.0.0.2: ... ``` ## Где увидеть В [arp](/kb/arp.md)-таблице - пары IP↔MAC. В выводе [[#cmd-tcpdump|tcpdump]] с флагом `-e` - header'ы frame'а. В `/sys/class/net//mtu` - текущий MTU. ## Команды ```bash ip link show eth0 | awk '/mtu/ {print}' ``` MTU интерфейса ```bash sudo ip link set eth0 mtu 9000 ``` Поменять MTU (jumbo frames внутри ДЦ); требует поддержки коммутаторов и обоих сторон ```bash sudo tcpdump -nei eth0 -c 5 ``` tcpdump с -e показывает MAC-адреса source/destination в каждом frame'е ```bash ping -M do -s 1500 8.8.8.8 ``` -M do: Don't Fragment; -s 1500: payload 1500 байт. Если упрётся - увидишь ICMP «frag needed» ```bash tracepath 8.8.8.8 ``` Найти Path MTU - минимальный MTU на маршруте до цели ## См. также - [MAC address](/kb/mac-address.md) - [ARP - Address Resolution Protocol](/kb/arp.md) - [VLAN и trunk - 802.1Q](/kb/vlan-and-trunk.md) - [Linux bridge - программный свитч](/kb/linux-bridge.md) - [MTU и Path MTU Discovery (PMTUD)](/kb/mtu-and-pmtud.md)