Кратко

  • История Тобиаса Фибига на RIPE 93 сначала напоминала ограничение скорости со стороны сети доступа. Разрешение ICMP на серверном межсетевом экране не помогло; сравнение двух виртуальных машин показало разные модели сетевых карт.
  • TCP offload эмулируемой RTL8139 оставался привязан к MTU 1500 байт, хотя маршрут нашёл значение 1420. Более конкретный маршрут с MTU 1320 восстановил передачу.

Анализ

Виноватым казался провайдер. Пакетный захват указал глубже — на виртуальную сетевую карту, которая упрямо считала 1500 байт допустимым размером для любого пути.

На закрывающей пленарной сессии RIPE 93 Тобиас Фибиг рассказал о медленной передаче большого файла. Клиенты за путём с MTU меньше 1500 получали данные с черепашьей скоростью, тогда как с соседней виртуальной машины сервис работал. Подозрение на сеть доступа или фильтрацию ICMP было логичным. Команда разрешила на серверном firewall сообщение «packet too big». Скорость не изменилась: правило исправили, но не саму причину.

Проверка маршрута на проблемном клиенте уже показывала MTU пути 1420 байт. Хост знал, что маршрут уже локального интерфейса с MTU 1500. Но TCP продолжал повторно передавать пакеты. Фибиг добавил более конкретный маршрут и зафиксировал MTU на 1320 — после этого передача заработала. 1420 — найденный размер пути; 1320 — сработавший обходной параметр. Это разные числа и разные роли.

Первая попытка повторить сбой тоже не сработала. Фибиг поднял другую виртуальную машину с тем же ПО и отправил тот же тестовый пакет — проблема не появилась. Сравнение виртуального оборудования обнаружило отличие: в неисправной машине была эмулируемая Realtek RTL8139, в тестовой — другой сетевой адаптер. Совпадение программного стека не воспроизвело сбой, потому что в тесте отсутствовал его настоящий участник.

След привёл в net/hw/8139.c QEMU: TCP offload использовал фиксированный MTU 1500 байт. Официальная задача QEMU № 1312 описывает тот же набор признаков: низкая скорость за каналами менее 1500 MTU, игнорирование PMTUD, повторы TCP и смягчение проблемы после снижения MTU гостевой ОС. В докладе Фибиг отнёс это предположение в коде к 2006 году и упомянул обсуждение с предложением исправления в 2016-м. Он также назвал отключение TCP offload обходом; в описанной системе заменили старую виртуальную карту на VirtIO и проблема исчезла.

Path MTU Discovery нужна, чтобы отправитель подстраивал размер данных под самое узкое звено. RFC 1191 описывает механизм для IPv4; RFC 2923 разбирает TCP-сбои, когда сообщения ICMP теряются или обрабатываются неверно. Поэтому firewall выглядел разумной первой целью. Когда разрешение ICMP не изменило результат, искать пришлось на границе гостевой системы и виртуального устройства.

Рабочая последовательность коротка: захватить реальные пакеты, сверить MTU маршрута, записать модель виртуальной NIC и состояние offload. В открытой записи нет точной версии QEMU и настроек offload проблемной машины; эти данные покажут, насколько широко повторяется именно эта комбинация.

Источники

Стенограмма закрывающей пленарной сессии RIPE 93; задача QEMU 1312; RFC 1191; RFC 2923; страница Тобиаса Фибига в TU Wien; страница сессии RIPE 93.