Структура 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
- EtherType - что в payload:
0x0800- IPv40x0806- arp0x86DD- IPv60x8100- 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-таблице - пары IP↔MAC. В выводе [[#cmd-tcpdump|tcpdump]] с флагом
-e - header'ы frame'а. В /sys/class/net/<iface>/mtu - текущий MTU.