Когда ваш компьютер отправляет данные в интернет, пакет проходит через множество промежуточных узлов (маршрутизаторов), прежде чем достигнет цели. Иногда возникает необходимость узнать точный маршрут — например, для диагностики проблем с доступностью сайта или для проверки правильности настройки сети.
Для этого существуют утилиты traceroute (в Linux/macOS) и tracert (в Windows).
Как это работает? #
Traceroute отправляет пакеты с последовательно увеличивающимся значением TTL (Time To Live):
- Первый пакет с TTL=1 — первый маршрутизатор уменьшает TTL до 0, отбрасывает пакет и отправляет обратно ICMP-сообщение “Time Exceeded”.
- Второй пакет с TTL=2 — проходит первый маршрутизатор, но отбрасывается вторым.
- Третий пакет с TTL=3 — проходит два маршрутизатора, но отбрасывается третьим.
И так далее, пока пакет не достигнет целевого узла.
Таким образом, мы получаем список всех “прыжков” (hops) до конечного сервера. Каждый маршрутизатор на пути идентифицирует себя по IP-адресу, а время отклика показывает задержку на каждом участке сети.
traceroute (Linux/macOS) #
По умолчанию traceroute в Linux отправляет UDP-пакеты.
По умолчанию утилита пытается определить текстовые имена (PTR-записи) для каждого IP-адреса. Это замедляет процесс. Ключ -n заставит её выводить только «чистые» IP-адреса, что ускоряет трассировку в несколько раз.
# TCP-трассировка на порт 80
traceroute -T -p 80 ya.ru
# UDP-трассировка на порт 443
traceroute -U -p 443 ya.ru
# ICMP-трассировка
traceroute -I ya.ru
# Быстрая TCP-трассировка без DNS (-n)
traceroute -n -T -p 443 ya.ru
tracert (Windows) #
# Стандартная ICMP-трассировка
tracert ya.ru
# Быстрая ICMP-трассировка без DNS (-d)
tracert -d ya.ru
Проблема: ICMP заблокирован на магистральных маршрутизаторах #
Рассмотрим реальный пример трассировки до ya.ru:
traceroute -n -T -p 80 ya.ru
...
traceroute to ya.ru (77.88.55.242), 30 hops max, 60 byte packets
1 192.168.88.1 0.528 ms 0.480 ms 0.738 ms
2 115.236.161.111 1.180 ms 1.169 ms 1.158 ms
3 115.236.160.241 8.840 ms 8.829 ms 8.818 ms
4 115.236.160.106 8.813 ms 8.802 ms 8.791 ms
5 128.75.225.20 8.781 ms 8.770 ms 8.760 ms
6 128.75.225.255 21.033 ms 20.621 ms 20.774 ms
7 128.75.225.106 32.137 ms 31.669 ms 31.602 ms
8 * * *
9 * * *
10 * * *
11 * * *
12 * * *
13 * * *
14 * * *
15 * * *
16 * * *
17 * * *
18 * * 77.88.55.242 43.966 ms
Что здесь происходит?
Начиная с 8-го прыжка вы видите * * * — это не потеря пакетов, а блокировка ICMP-ответов.
Объяснение:
- Пакеты успешно доходят до 7-го маршрутизатора.
- Дальнейшие маршрутизаторы настроены на игнорирование ICMP Time Exceeded (TTL-превышений).
- Но сам ya.ru (77.88.55.242) на 18-м прыжке отвечает (43.966 ms)!
Это классическое поведение для крупных провайдеров и CDN-сетей. Они скрывают свою внутреннюю инфраструктуру от посторонних глаз, блокируя ICMP-ответы на промежуточных маршрутизаторах. При этом трафик отлично доходит до цели.
Вывод: Если вы видите длинную цепочку звездочек, но последний хоп отвечает — маршрут работает, и все в порядке.
Почему три значения? #
Traceroute по умолчанию отправляет три зонда (пакета) на каждый прыжок. Это делается для получения более точной статистики:
- Первое значение — время отклика первого пакета.
- Второе значение — время отклика второго пакета.
- Третье значение — время отклика третьего пакета.
Зачем нужно три замера?
- Усреднение — можно вычислить среднее время (
(0.528 + 0.480 + 0.738) / 3 ≈ 0.582 ms). - Выявление нестабильности — если значения сильно различаются (например,
5 ms, 100 ms, 150 ms), это указывает на проблемы с маршрутизатором или перегруженный канал. - Отбраковка выбросов — если один из трех пакетов потерялся (вы увидите звездочку вместо времени), два других все равно дадут информацию о доступности узла.
Три значения в traceroute — это три независимых измерения задержки до одного и того же маршрутизатора.
В реальных условиях первое значение часто показывает минимальную задержку, второе и третье — усредненную картину. Если все три значения близки — канал стабилен, если разброс большой — возможны проблемы.