«Просмотр результатов traceroute схож с наблюдением с высоты птичьего полета за движением автомобиля из одной точки в другую: вы видите каждую из дорог (маршрутов) и перекрестков (роутеров), которые встречаются по пути» (с) Richard Steenbergen, NANOG presentation.
Каждая строка в выводе traceroute представляет собой один «прыжок» («hop«) через роутер и отображает путь, который прошел пакет от источника до заданного направления. По умолчанию — большинство реализаций traceroute выполняет три обращения к каждому роутеру («хопу»), отображая три значения его «отзывчивости», измеряемые в милисекундах.
В некоторых случах — эти обращения к хопу могут пройти по различным каналам (хопы 1-4 и 8-9 в примере ниже), что приведет к отображению нескольких строк результата для хопа:
$ traceroute ya.ru
traceroute to ya.ru (213.180.193.3), 30 hops max, 60 byte packets
1 ec2-79-125-0-240.eu-west-1.compute.amazonaws.com (79.125.0.240) 20.016 ms ec2-79-125-0-238.eu-west-1.compute.amazonaws.com (79.125.0.238) 16.594 ms ec2-79-125-0-236.eu-west-1.compute.amazonaws.com (79.125.0.236) 14.084 ms
2 100.64.0.14 (100.64.0.14) 17.023 ms 100.64.1.138 (100.64.1.138) 16.738 ms 100.64.0.140 (100.64.0.140) 18.981 ms
3 100.64.0.67 (100.64.0.67) 19.692 ms 100.64.1.69 (100.64.1.69) 11.952 ms 100.64.1.135 (100.64.1.135) 21.865 ms
4 100.64.17.79 (100.64.17.79) 0.772 ms 100.64.16.15 (100.64.16.15) 0.794 ms 100.64.16.67 (100.64.16.67) 0.813 ms
5 * * *
6 * * *
7 178.236.0.94 (178.236.0.94) 1.385 ms 1.257 ms 2.842 ms
8 176.32.106.15 (176.32.106.15) 19.619 ms 54.239.41.101 (54.239.41.101) 19.472 ms 54.239.41.103 (54.239.41.103) 19.680 ms
9 178.236.3.77 (178.236.3.77) 19.070 ms 178.236.3.75 (178.236.3.75) 18.986 ms 178.236.3.77 (178.236.3.77) 19.149 ms
10 178.236.3.78 (178.236.3.78) 18.787 ms 18.756 ms 18.881 ms
11 retn.franceix.net (37.49.236.17) 22.525 ms 22.519 ms 22.515 ms
12 ae9-5.RT.TC2.AMS.NL.retn.net (87.245.232.137) 23.762 ms 23.779 ms 23.801 ms
13 GW-Yandex.retn.net (87.245.246.14) 22.841 ms 22.752 ms 22.837 ms
14 jansson-et-4-1-0.yndx.net (213.180.213.95) 50.320 ms 50.371 ms 50.353 ms
15 std-p2-hu0-1-0-1.yndx.net (213.180.213.125) 70.594 ms 70.834 ms 70.770 ms
16 fol5-c2-ae3.yndx.net (87.250.239.130) 70.457 ms 70.461 ms 70.413 ms
17 * * *
18 www.yandex.ru (213.180.193.3) 76.072 ms 71.745 ms 73.028 ms
19 www.yandex.ru (213.180.193.3) 70.038 ms 70.212 ms *
Как работает traceroute
Внутри каждого IP-пакета имеется поле, известное как TTL — Time To Live. Это поле содержит значение «времени жизни» пакета, измеряемое в количестве пройденных этим пакетом хопов (роутеров) и используется для предотвращения закольцовывания маршрута и бесконечного потребления сетевых ресурсов, ограничивая количество хопов, через которые может быть пропущен этот пакет.
Частью роутинга IP пакетов является уменьшение значения TTL пакета на 1 каждый роутером, который его обрабатывает. Если значение достигает значения 0 — пакет отбрасывается, а отправителю отправляется сообщение ICMP TTL Exceeded (ICMP тип 11), уведомляя о сбросе пакета. traceroute использует эту неотъемлемую часть процесса роутинга пакетов IP для составления «карты» с каждым роутером, который проходит пакет, отправляя серию «зондирующих» пакетов, TTL которых должен истекать до достижения точки назначения и подсчитывая количество полученных сообщений ICMP TTL Exceeded:
Каждый такой зондирующий пакет следует следующей схеме:
traceroute отправляет пакет к точке назначения, устанавливая TTL равным 1;
каждый роутер в маршруте уменьшает значение TTL на единицу, пока TTL не достингнет нуля;
когда TTL становится == 0 то роутер, который отбрасывает этот пакет, отправляет отправителю сообщение ICMP TTL Exceeded, в которое включаются первые 28 байт оригинального «зондирующего» пакета;
traceroute получает это сообщение и использует разницу во времени между отправкой оригинального пакета и полученным в ответ пакетом ICMP для посчета задержки доставки к этому роутеру/хопу;
процесс повторяется с п. 1, но с TTL увеличенным на 1, пока…
окончательный получатель получает пакет от traceroute и отправляет в ответ сообщение, отличное от ICMP TTL Exceeded. Тогда traceroute считает, что трассировка завершена и заверает процесс.
Пример:
$ traceroute ya.ru
traceroute to ya.ru (93.158.134.3), 30 hops max, 60 byte packets
1 192.168.1.1 (192.168.1.1) 0.519 ms 0.915 ms 0.909 ms
...
11 www.yandex.ru (93.158.134.3) 23.488 ms * 27.964 ms
в результатах видно значение TTL, которое увеличивается от 1 в первом пакете — IP (tos 0x0, ttl 1) и в последнем — IP (tos 0x0, ttl 12), всего 11 хопов
порт назначения для первого пакета: 93.158.134.3.33434
ответ ICMP TTL Exceeded: 93.158.134.3 > 192.168.1.149: ICMP time exceeded in-transit
Какие хопы вы видите в результатах traceroute?
Когда роутер отбрасывает пакет из-за истекшего значения TTL — он создает сообщение ICMP TTL Exceeded, в котором указывается IP-адрес интерфейса источника пакета, который получил оригинальный пакет. Далее, когда traceroute получает этот ICMP ответ — он использует адрес источника для преставления очередного роутера:
В примере выше маршрут, который отобразит traceroute, будет:
172.16.2.1
10.3.2.2
Важно помнить, что traceroute не предоставляет никакой информации об «исходящих» интерфейсах роутра или об обратном пути пакета ICMP.
Реализации traceroute
Фактически — любой тип пакетов IP может использоваться как «зондирующий» пакет traceroute, так как единственное требование — это наличие поля TTL.
Наиболее часто используемые реализации traceroute:
классический UNIX Traceroute — использует UDP пакеты, с портом получателя 33434, который увеличивается на 1 с каждым новым пакетом. По умолчанию traceroute отправляет три пакета к каждому узлу. Порт получателя UDP пакета используется traceroute для индентификации зондирующих пакетов. После того, как пакет достингет точки назначения — получатель отправляет сообщение ICMP Destination Unreachable (ICMP тип 3), обозначая таким образом завершение выполнения traceroute. Многие реализации traceroute позволяют использовать UDP, ICMP или TCP для создания таких «зондирующих» пакетов.
интересный факт: стартовый порт 33434 является суммой значений 32768 (215 — половина максимального значения диапазона портов UDP) и 666 («Число Зверя» или «Число Дьявола»).
Windows Traceroute (вернее — tracert.exe) использует пакеты ICMP Echo Request (ICMP Тип 8), а не UDP, как это делает UNIX-реализация traceroute, а по достижении точки назначения — tracert ожидает получения пакета ICMP Echo Reply (ICMP тип 0).
В оригинале, на http://www.nanog.org, есть еще очень много интерсных деталей как о самом traceroute — так и правильной интерпретации данных, полученных с его помощью.
Доступны два варианта — в виде книги (PDF) и и виде презентации.