Физический уровень (L1): от электрических сигналов до битовых потоков в Linux
Физический уровень (L1): от электрических сигналов до битовых потоков в Linux
Ядро Linux ничего не знает о медных проводах, оптоволокне, фотонах или электромагнитных наводках. Для операционной системы сеть начинается с кольцевого буфера в оперативной памяти и аппаратного прерывания. Но если вытащить кабель из коммутатора, в консоли Linux интерфейс мгновенно перейдет в состояние DOWN. Как именно ядро узнает о физическом разрыве линка, если оно работает только с памятью?
Чтобы стать инженером, который не просто «перезапускает сеть», а понимает первопричины потерь пакетов, необходимо спуститься на самый нижний уровень — туда, где аналоговая физика превращается в цифровой битовый поток.
Анатомия сетевой карты: разделение на PHY и MAC
В предыдущем курсе мы разобрали, как MAC-контроллер (Media Access Control) через механизм DMA перекладывает кадры в Ring Buffer оперативной памяти. Однако сам MAC-контроллер не умеет работать с кабелем.
Любая сетевая карта (NIC — Network Interface Card) концептуально разделена на два фундаментальных блока:
- PHY (Physical Layer Transceiver) — чип, отвечающий исключительно за физический уровень (L1).
- MAC (Media Access Control) — контроллер, отвечающий за канальный уровень (L2) и взаимодействие с шиной PCIe.
PHY-чип — это переводчик. С одной стороны в него «втыкается» кабель (витая пара или оптика). Здесь царит аналоговый хаос: затухания сигнала, перекрестные помехи, изменения напряжения или вспышки света. Задача PHY — демодулировать этот аналоговый сигнал, очистить его от шума с помощью DSP (Digital Signal Processing) и превратить в идеальные нули и единицы.
С другой стороны PHY соединен с MAC-контроллером на печатной плате сетевой карты. Для передачи битов между ними используется шина MII (Media Independent Interface) или ее современные высокоскоростные аналоги (GMII, XGMII).
Но как Linux управляет PHY-чипом, если процессор общается только с MAC-контроллером через PCIe? Для этого существует отдельная управляющая шина — MDIO (Management Data Input/Output).
Когда вы вводите команду в Linux для изменения скорости линка, происходит следующая цепочка:
- Утилита из User Space делает системный вызов (через ioctl/netlink).
- Драйвер сетевой карты в ядре получает команду.
- Драйвер отправляет инструкцию в регистры MAC-контроллера через шину PCIe.
- MAC-контроллер по низкоскоростной шине MDIO передает команду в регистры PHY-чипа.
- PHY-чип меняет параметры модуляции электрического сигнала на порту.
Модульность L1: трансиверы SFP
В современных серверах и коммутаторах PHY-чип не всегда намертво впаян в плату. Чтобы не выпускать отдельные сетевые карты для медных кабелей, одномодовой и многомодовой оптики, индустрия перешла на модульный стандарт — SFP (Small Form-factor Pluggable).
При использовании SFP сетевая карта предоставляет стандартизированный слот. Сам модуль SFP содержит внутри себя лазер (или медный коннектор) и часть логики PHY-чипа. Это позволяет «на лету» менять среду передачи данных, просто вставив другой модуль, в то время как MAC-контроллер и драйвер Linux остаются неизменными.
Автосогласование (Autonegotiation): как устройства договариваются
Когда вы соединяете два устройства кабелем, они изначально не знают, какую скорость и режим дуплекса поддерживает собеседник. Передача данных на скорости 1 Гбит/с кардинально отличается по физике кодирования от 100 Мбит/с. Если одно устройство начнет вещать на гигабитной скорости, а второе ожидает 100 мегабит, линк просто не поднимется.
Для решения этой проблемы был создан механизм Autonegotiation (автосогласование).
Как только появляется электрический контакт, PHY-чипы начинают обмениваться специальными короткими импульсами — FLP (Fast Link Pulses). Эти импульсы передаются на базовой, самой медленной скорости (совместимой со старым стандартом 10Base-T), которую гарантированно поймет любой чип.
В FLP-импульсах закодировано «резюме» порта:
- Поддерживаемые скорости (10, 100, 1000 Мбит/с).
- Поддерживаемый дуплекс (Half Duplex, Full Duplex).
- Поддержка управления потоком (Flow Control).
Правило максимального знаменателя При автосогласовании устройства сравнивают свои возможности и всегда выбирают максимально возможную скорость и режим Full Duplex, поддерживаемые обоими концами.
Только после того, как согласование успешно завершено, PHY-чипы переключаются на выбранный метод модуляции (например, PAM-5 для гигабита), устанавливают физический линк и сообщают MAC-контроллеру: «Линк поднят на скорости 1000/Full». MAC генерирует аппаратное прерывание, и ядро Linux меняет статус интерфейса на LOWER_UP.
Взгляд из Linux: утилита ethtool
Если утилита ip (которую мы разбирали ранее) управляет L2 и L3 уровнями ядра, то для работы с L1 (опроса PHY-чипа) в Linux используется утилита ethtool.
Посмотрим на типичный вывод команды ethtool eth0:
Settings for eth0:
Supported ports: [ TP ]
Supported link modes: 10baseT/Half 10baseT/Full
100baseT/Half 100baseT/Full
1000baseT/Full
Supported pause frame use: Symmetric
Supports auto-negotiation: Yes
Advertised link modes: 10baseT/Half 10baseT/Full
100baseT/Half 100baseT/Full
1000baseT/Full
Advertised auto-negotiation: Yes
Speed: 1000Mb/s
Duplex: Full
Port: Twisted Pair
PHYAD: 1
Transceiver: internal
Auto-negotiation: on
Link detected: yes
Разберем ключевые строки:
- Supported link modes: Аппаратные возможности вашего PHY-чипа (что он в принципе умеет).
- Advertised link modes: Что ваш PHY-чип сообщает соседу в FLP-импульсах прямо сейчас. Вы можете урезать этот список административно, заставив гигабитную карту притворяться 100-мегабитной.
- Speed / Duplex: Результат автосогласования. Текущие рабочие параметры L1.
- Auto-negotiation: on: Механизм FLP включен.
- Link detected: yes: PHY-чип рапортует о наличии несущего сигнала (carrier) от соседа. Именно этот параметр транслируется в флаг
LOWER_UPв выводеip link.
Классическая проблема L1: Duplex Mismatch
Понимание работы автосогласования необходимо для диагностики одной из самых коварных сетевых проблем — Duplex Mismatch (несовпадение дуплекса).
Исторически сложилось правило: если администратор жестко фиксирует скорость и дуплекс на одном конце линка (отключая Autonegotiation), этот порт перестает отправлять FLP-импульсы.
Представьте ситуацию: сервер Linux подключен к коммутатору.
- На коммутаторе администратор жестко задал:
Speed 100,Duplex Full(Autonegotiation = off). - На сервере Linux оставлены настройки по умолчанию (Autonegotiation = on).
Что произойдет на физическом уровне? Сервер Linux отправляет FLP-импульсы, но коммутатор молчит (он жестко сконфигурирован). По стандарту Ethernet, если устройство с включенным Autonegotiation не получает ответов, оно обязано определить скорость по электрической сигнатуре (в данном случае это будет 100 Мбит/с), но обязано упасть в безопасный режим Half Duplex.
В результате линк поднимется (Link detected: yes). Утилита ping даже будет работать. Но как только пойдет реальный трафик, сервер (в Half Duplex) будет считать, что канал разделяемый, и прекращать передачу при любой активности коммутатора, а коммутатор (в Full Duplex) будет слать данные непрерывно. Возникнут массовые коллизии, ошибки FCS на L2 и катастрофическое падение пропускной способности.
Умение читать вывод ethtool и понимать границу между PHY и MAC — это первый шаг к локализации проблем, которые невозможно решить на уровне IP-маршрутизации или TCP-тюнинга. Физический уровень сформировал битовый поток. В следующей главе мы разберем, как MAC-контроллер нарезает этот поток на осмысленные блоки — кадры Ethernet II, и как проверяет их целостность.