diff --git a/doc/nat_detection.txt b/doc/nat_detection.txt index 95aca4b5..c1e29136 100644 --- a/doc/nat_detection.txt +++ b/doc/nat_detection.txt @@ -60,6 +60,14 @@ eim filtered — внешний IP:порт одинаковый, серия п Известный тип NAT можно сохранить, даже если входящие проверить не удалось. Таймаут и отсутствие подходящих узлов сами по себе не означают strict. +Если один пир уже увидел публичный IP:порт, отличный от локального, этот адрес +сразу сохраняется как NAT с type=UNKNOWN. Он публикуется отдельно от адреса +интерфейса и остаётся кандидатом для пробного подключения: одного наблюдения +недостаточно, чтобы обещать тот же адрес для других IP или открытый вход. +Уже знакомый помощник пригоден для измерения типа NAT, хотя проверить незнакомый +вход через него нельзя. Потеря результата входящих не останавливает сравнение +адресов через доступные публичные узлы; ожидание одного этапа ограничено по времени. + Соединения по LAN работают независимо и не сбрасывают интернет-профиль. Если доступны только локальные узлы, определить интернет-NAT нельзя. Результат относится к проверенному UDP-сокету: проверка STUN с другого порта diff --git a/src/routing_layer/nat_detection.c b/src/routing_layer/nat_detection.c index 3ce0248b..1d51f62f 100644 --- a/src/routing_layer/nat_detection.c +++ b/src/routing_layer/nat_detection.c @@ -770,7 +770,7 @@ static void owner_ping_cb(int success, uint16_t rtt, void *arg, uint64_t nonce, !route_ping_addr_equal(&state->measured_address, &observed, 1))) clear_profile(state, NAT_REASON_ADDRESS_CHANGED); remember_address(state, &observed); - if (!state->helper) { owner_finish(state, NAT_REASON_NO_HELPER); return; } + if (!state->helper) { state->cycling = 0; owner_finish(state, NAT_REASON_NO_HELPER); return; } if (owner_run(state, NAT_STEP_PREPARE)) owner_finish(state, NAT_REASON_CONTROL_LOST); return; } diff --git a/src/routing_layer/nat_detection.h b/src/routing_layer/nat_detection.h index ee72fd84..6ad4a443 100644 --- a/src/routing_layer/nat_detection.h +++ b/src/routing_layer/nat_detection.h @@ -4,6 +4,8 @@ * DEPENDENT (strict) — внешний IP:порт зависит от IP назначения. * inbound: OPEN — пакеты от незнакомого IP проходят; CONTACT — проходят после исходящего контакта (оценка filtered). * UNKNOWN в любом свойстве означает, что данных для его определения пока недостаточно. + * Одно соединение может подтвердить NAT-адрес: он сохраняется в socket->nat_addr с типом UNKNOWN + * и публикуется как NAT-кандидат. Это не адрес интерфейса и не подтверждение открытого входа. * Для UDP сочетания EIM+OPEN и EIM+CONTACT означают eim open и eim filtered. TCP-вход проверяется отдельно. * create(instance) запускает автоматические асинхронные проверки через доступные узлы сети. * get_status(detector, socket, &status) возвращает результат в status.effective_profile и ход проверки в остальных полях.