← Назад к проектам

Туннель поднялся, но трафика нет

После цикла выключения и включения туннель поднимался, но не пропускал трафик, и лечился только перезапуском клиента. Диагностика заняла три итерации с прогонами на клубных машинах, и под одним симптомом оказались три независимых дефекта.

Первый: признак «связь есть» приходил раньше, чем поднимался адаптер — демон при выключении оставался жить, рукопожатие в пире сохранялось, и клиент спрашивал о канале через секунду после старта. Единственная проба ICMP не возвращалась, и клиент винил канал. Починил повторами пробы: настоящий обрыв остаётся обрывом, преждевременный вопрос — нет.

Второй: при повторном подъёме код снимал собственный адрес перед тем, как поставить его обратно. В окне без адреса интерфейс уходил в APIPA, и ICMP уходил с исходником, которого узел не знает. Счётчики пира показали это дословно: ушло 504 байта, вернулось 92 — то есть только рукопожатие.

Третий: адрес, поставленный на здоровом интерфейсе, оставался в состоянии Tentative, а из такого адреса Windows молча выбрасывает всё отправленное. В коде стояла строка, которая должна была отключать проверку на дубликаты, но поле в этой структуре выходное и на входе игнорируется — проверка всё это время работала. Отключил её у интерфейса, а успехом постановки стал считаться не код возврата, а прочитанное состояние адреса.

Оставшееся окно закрыл иначе: посекундный хронометраж показал, что после остановки туннеля интерфейс несколько секунд перенастраивается и выбрасывает любую постановку, возвращая при этом успех — тридцать попыток подряд не дали ничего. Ожиданием это не лечится, поэтому клиент стал заводить новый адаптер сам. Именно это и делал перезапуск, который «помогал».

Фактура

  • Гипотезу про DHCP проверил и снял: Get-NetIPInterface показал Dhcp: Disabled.
  • Диагностика по счётчикам пира и снимку адресов, а не по догадкам.
  • Тесты через подставную таблицу адресов, которая умеет «съедать» постановку — возвращать успех, не заводя адреса. Без такого мока дефект нечем воспроизвести.
  • Проверка тестов возвратом старого поведения: падают ровно те тесты, что должны.