Ответ на вопрос
Кратко и по существу — последовательность действий для диагностики, что именно смотреть в tcpdump/wireshark, возможные причины на уровнях приложения и сетевого оборудования и способы исправления.
1) Подготовка и сбор трафика
- Сузьте область: зафиксируйте IP-адреса/порты конечных точек и интервал времени, когда проблема воспроизводится.
- Снимайте трафик на обеих сторонах и, если возможно, на промежуточном коммутаторе/маршрутизаторе (асимметрия маршрута — частая ловушка).
- Пример команд:
- на хосте A: `tcpdump -i eth0 -s \(0\) -w hostA.pcap host 10.0.0.2 and tcp and port \(80\)`
- на хосте B: `tcpdump -i eth0 -s \(0\) -w hostB.pcap host 10.0.0.3 and tcp and port \(80\)`
- для бесконечной ротации: `-W`/`-C` опции tcpdump.
- Синхронизируйте часы (NTP/chrony) на всех устройствах для корреляции по времени.
2) Быстрый анализ в Wireshark
- Откройте захват(ы), примените фильтры:
- проблемы с потерями/ретрансмисиями: `tcp.analysis.retransmission || tcp.analysis.fast_retransmission || tcp.analysis.out_of_order`
- дублированные ACK: `tcp.analysis.duplicate_ack`
- SACK/Window: `tcp.options.sack && tcp.analysis.zero_window` и т.д.
- Найдите место, где:
- сегмент отправлен, за ним не приходит соответствующий ACK;
- появляются повторяющиеся ACK (обычно при потере сегмента появляются \(\)3\(\) дупликат-ACK -> fast retransmit);
- или наблюдается множественная ретрансмиссия/timeout.
- Сопоставьте sequence/ack: смотрите поля `tcp.seq`, `tcp.ack`, `tcp.len`. Определите пропавший сегмент как разрыв в последовательных `tcp.seq`/`tcp.len`.
- Проверяйте наличие SACK (`tcp.options.sack`) — если есть, смотрите, как стек использует SACK при восстановлении.
- Обратите внимание на тайминги: время между отправкой сегмента и появлением dup-ACK, интервалы retransmit (RTO).
3) Диагностические признаки и интерпретация
- Если видите по ходу: отправка -> несколько dup-ACK -> fast retransmit: классическая потеря сегмента в сети (обычно средняя часть сети).
- Если видите: отправка -> нет ACK вовсе -> RTO: возможно большой пакет пропал и повтор не обнаружен; либо ACK теряется.
- Если ACK дублируются на обеих сторонах (двойная передача ACK) — возможны:
- реальное повторное получение ACK по сети (дублирование в сети/маршрутизации);
- артефакты offload (GRO/LRO/TCP segmentation offload) — при агрегировании/деградации пакетов хост может показывать «двойные» ACK;
- асимметрия захвата (видите ACK на спане и на хосте — повторная запись).
- Если видны CRC/другие ошибки в счётчиках интерфейса — вероятен уровень физики/линка.
4) Проверки на хосте и сетевом оборудовании
- На хостах:
- ifconfig/ip -s link, `ethtool -S eth0` — ошибки, dropped, rx_crc, tx_errors.
- проверить offload: `ethtool -k eth0` и временно отключить TSO/GSO/GRO: `ethtool -K eth0 tso off gso off gro off` — повторить захват.
- посмотреть логи ядра (`dmesg`) и загрузку CPU/прерываний (cpustat) — NIC/CPU перегрузка может вызывать drops.
- проверить стек приложения: блокировка чтения сокета (приложение не читает, окно 0 -> затем резкая перераспределённость), использовать strace, lsof.
- На сетевом оборудовании:
- просмотреть counters портов (CRC, collisions, discards), проверить дуплекс/скорость (duplex mismatch).
- если используется LACP/ECMP — проверять балансировку (пакетный reordering).
- проверить QoS/traffic policing/queue overflow, и перезаполненные буферы на интерфейсах.
- обновить прошивку/драйверы, если есть баги в ASIC/firmware.
- На промежуточных устройствах (firewall, NAT, load-balancer):
- убедиться, что они корректно обрабатывают TCP (не генерируют активные модификации ACK/перепосылки).
- проверить connection tracking и таймауты.
5) Возможные причины и способы исправления (по уровням)
- Уровень физический/канальный:
- причины: плохие кабели, битовые ошибки, duplex mismatch, перегрузка порта.
- исправление: заменить кабели, настроить правильный duplex/speed, проверить и заменить аппарат.
- Уровень коммутатор/маршрутизация:
- причины: переполнение очередей (drops), некорректная балансировка ECMP (reordering), баги в прошивке, span mirror overload.
- исправление: увеличить очереди/тайминги, настроить QoS, обновить прошивку, захватить трафик на обоих концах, убрать лишний SPAN при тесте.
- MID-box (firewall/load-balancer/NAT):
- причины: stateful inspection, асинхронная обработка, баги/перезаписи.
- исправление: временно обойти устройство, обновить ПО, проверить конфигурацию.
- NIC/OS (offloads, coalescing):
- причины: TSO/GSO/GRO/LRO/interrupt coalescing создают разницу между "пакетом, который видел стек" и фактическим on-wire; артефакты dup ACK.
- исправление: отключить отладочно offload, обновить драйвер, настроить coalescing/interrupt moderation.
- Приложение/стек TCP:
- причины: приложение не читает данные (zero-window), неправильно использует неблокирующие сокеты, перегрузка CPU, неактивные ACK/задержка Delayed ACK.
- исправление: профилирование приложения, увеличить сокетные буферы, включить SACK, настроить TCP параметры (RTO, window scaling), оптимизировать обработку.
6) Практический план устранения (checklist)
- Сделать захваты на обеих сторонах и на промежуточном устройстве одновременно.
- Синхронизировать время и сопоставить пакеты.
- В Wireshark найти точный пропавший сегмент по seq/len и количество dup-ACK (\(3\) — fast retransmit).
- Проверить интерфейсные счётчики (ifconfig/ethtool) на ошибки.
- Отключить TSO/GSO/GRO и повторить тест; если артефакты пропали — проблема в offload/драйвере.
- Проверить логи сетевого оборудования и counters на стековых портах.
- Если причиняет congestion — изменить QoS/увеличить буферы/внедрить ECN или снизить скорость отправителя.
- Если приложение виновато — отладить чтение сокета, увеличить буферы/размер окна.
7) Итог: как отличить реальные потери от артефактов
- Если ретрансмиссии остаются после отключения offload и накапливаются ошибки на интерфейсе/коммутаторе — это реальные потери в сети.
- Если ретрансмиссии исчезают после отключения offloads или в локальном capture пакеты на wire не дублируются — это артефакт стек/драйвера.
- Всегда подтверждайте проблему захватами на обеих сторонах и логами оборудования перед заменой железа или изменением сетевых политик.
Если нужно, могу привести конкретные примеры tcpdump/wireshark-фильтров и порядок действий для вашего конкретного IP/порта (укажите адреса/порты и интерфейсы).
Еще