Оригинал и полная версия доступна тут>>>.
Содержание
Основы traceroute
“Просмотр результатов traceroute
схож с наблюдением с высоты птичьего полета за движением автомобиля из одной точки в другую: вы видите каждую из дорог (маршрутов) и перекрестков (роутеров), которые встречаются по пути” (с) Richard Steenbergen, NANOG presentation.
Каждая строка в выводе traceroute
представляет собой один “прыжок” (“hop“) через роутер и отображает путь, который прошел пакет от источника до заданного направления. По умолчанию – большинство реализаций traceroute
выполняет три обращения к каждому роутеру (“хопу”), отображая три значения его “отзывчивости”, измеряемые в милисекундах.
В некоторых случах – эти обращения к хопу могут пройти по различным каналам (хопы 1-4 и 8-9 в примере ниже), что приведет к отображению нескольких строк результата для хопа:
[simterm]
$ 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 *
[/simterm]
Как работает 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
считает, что трассировка завершена и заверает процесс.
Пример:
[simterm]
$ 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
[/simterm]
И результат tcpdump
:
[simterm]
$ sudo tcpdump -nvv -i eth0 host ya.ru tcpdump: listening on eth0, link-type EN10MB (Ethernet), capture size 65535 bytes 12:37:58.010599 IP (tos 0x0, ttl 1, id 15601, offset 0, flags [none], proto UDP (17), length 60) 192.168.1.149.42448 > 93.158.134.3.33434: [bad udp cksum 0xa618 -> 0x3c4f!] UDP, length 32 ... 12:38:03.017059 IP (tos 0x0, ttl 12, id 16527, offset 0, flags [none], proto UDP (17), length 60) 192.168.1.149.60885 > 93.158.134.3.33468: [bad udp cksum 0xa618 -> 0xf427!] UDP, length 32
[/simterm]
- в результатах видно значение 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) и и виде презентации.