Алгоритм работы утилиты tracert. Как работает traceroute

    Утилита трассировки маршрута до заданного узла TRACERT.EXE является одним из наиболее часто используемых инструментов сетевой диагностики. Основное ее назначение - получить цепочку узлов, через которые проходит IP-пакет, адресованный конечному узлу, имя или IP-адрес которого задается параметром командной строки.

Формат командной строки:

tracert [-d] [-h максЧисло] [-j списокУзлов] [-w таймаут] [-R] [-S адресИсточника] [-4] [-6] конечноеИмя

Параметры командной строки:

-d - не использовать разрешение в имена узлов.

-h максЧисло - максимальное число прыжков при поиске узла.

-j списокУзлов - свободный выбор маршрута по списку узлов (только IPv4).

-w таймаут - таймаут каждого ответа в миллисекундах.

-R - трассировка пути (только IPv6).

-S адресИсточника - использовать указанный адрес источника (только IPv6).

-4 - принудительное использование IPv4.

-6 - принудительное использование IPv6.

В основе трассировки заложен метод анализа ответов при последовательной отправке ICMP-пакетов на указанный адрес с увеличивающимся на 1 полем TTL. ("Время жизни" - Time To Live). На самом деле это поле не имеет отношения к времени, а является счетчиком числа возможных переходов при передаче маршрутизируемого пакета. Каждый маршрутизатор, получив пакет, вычитает из этого поля, сохраняемого в заголовке пакета, единицу и проверяет полученное значение счетчика TTL. Если значение стало равным нулю, такой пакет отбрасывается и отправителю посылается ICMP-сообщение о превышении времени жизни (сообщение "Time Exceeded", значение 0x11 в заголовке ICMP).

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

    При выполнении команды tracert.exe сначала выполняется отправка ICMP пакета с полем TTL в заголовке равным 1 и первый в цепочке маршрутизатор (обычно это основной шлюз из настроек сетевого подключения) вычтя единицу из TTL получает его нулевое значение и сообщает о превышении времени жизни. Таким образом, утилита TRACERT.EXE получает IP-адрес первого маршрутизатора, участвующего в доставке пакетов конечному узлу. Эта последовательность повторяется трижды, поэтому в строке результата, формируемой tracert.exe, после номера перехода отображаются три значения времени отклика:
1     1 ms     1 - номер перехода (1 - первый маршрутизатор)
1 ms 192.168.1.1 - его адрес (или имя)

    Затем процедура повторяется, но TTL устанавливается равным 2 - первый маршрутизатор его уменьшит до 1 и отправит следующему в цепочке, который после вычитания 1 обнулит TTL и сообщит о превышении времени жизни. Утилита TRACERT.EXE получит второй IP-адрес узла, участвующего в доставке пакета получателю и его время ответа. Процесс трассировки будет продолжаться до тех пор, пока не будет достигнут конечный узел, имя или адрес которого заданы в качестве параметра командной строки, например, tracert yandex.ru , или до обнаружения неисправности, не позволяющей доставить пакет. По умолчанию, утилита TRACERT.EXE использует счетчик максимального числа переходов равный 30, что должно быть достаточно для достижения любого узла на планете. При необходимости, иное значение счетчика можно задать с помощью параметра -h

Пример результатов выполнения tracert google.com

tracert google.com - трассировка маршрута к узлу google.com

Результат:


Трассировка маршрута к google.com с максимальным числом прыжков 30:
1 1 ms 2 498 ms 444 ms 302 ms ppp83-237-220-1.pppoe.mtu-net.ru
3 * * * .
4 282 ms * * a197-crs-1-be1-53.msk.stream-internet.net
5 518 ms 344 ms 382 ms ss-crs-1-be5.msk.stream-internet.net
6 462 ms 440 ms 335 ms m9-cr01-po3.msk.stream-internet.net
7 323 ms 389 ms 339 ms bor-cr01-po4.spb.stream-internet.net
8 475 ms 302 ms 420 ms anc-cr01-po3.ff.stream-internet.net
9 334 ms 408 ms 348 ms 74.125.50.57
10 451 ms 368 ms 524 ms 209.85.255.178
11 329 ms 542 ms 451 ms 209.85.250.140
12 616 ms 480 ms 645 ms 209.85.248.81
13 656 ms 549 ms 422 ms 216.239.43.192
14 378 ms 560 ms 534 ms 216.239.43.113
15 511 ms 566 ms 546 ms 209.85.251.9
16 543 ms 682 ms 523 ms 72.14.232.213
17 468 ms 557 ms 486 ms 209.85.253.141
18 593 ms 589 ms 575 ms yx-in-f100.google.com

Трассировка завершена.

    В результатах трассировки могут присутствовать строки, где вместо адреса узла отображается звездочка (узел номер 3 в примере). Это не обязательно является признаком неисправности маршрутизатора, и чаще всего, говорит о том, что настройки данного узла запрещают отправку ICMP-сообщений по соображениям безопасности и уменьшения нагрузки на канал при в случае некоторых разновидностей DDoS-атак. Например, подобные настройки используются в сетях Microsoft . Серверы корпорации не отвечают на ping и не позволяют выполнить трассировку маршрута к ним.

Примеры использования TRACERT

tracert google.com - выполнить трассировку маршрута к узлу google.com .

tracert 8.8.8.8 - выполнить трассировку маршрута к узлу с IP-адресом 8.8.8.8

tracert -d yandex.ru - выполнить трассировку маршрута к узла yandex.ru без разрешения IP-адресов в имена узлов. Трассировка в таком режиме выполняется быстрее.

tracert -d -6 ipv6.google.com - выполнить трассировку с использованием протокола IPv6.

Пример результатов трассировки с использованием протокола IPv6:

trace to ipv6.google.com (2a00:1450:4013:c00::71), 30 hops max, 40 byte packets 1 2a02:348:82::1 (2a02:348:82::1) 8.087 ms 8.063 ms 8.086 ms 2 te0-22.cr1.nkf.as49685.net (2001:4cb8:40b:1::1d01) 2.143 ms 2.129 ms 2.103 ms 3 amsix-router.google.com (2001:7f8:1::a501:5169:1) 1.379 ms 1.415 ms 1.422 ms 4 (2001:4860::1:0:87ab) 1.437 ms (2001:4860::1:0:87aa) 2.157 ms (2001:4860::1:0:87ab) 1.408 ms 5 (2001:4860::8:0:87b0) 1.494 ms 1.469 ms (2001:4860::8:0:87b2) 8.350 ms 6 (2001:4860::8:0:b1b7) 5.364 ms 5.321 ms 4.748 ms 7 (2001:4860::2:0:8651) 4.653 ms 6.994 ms (2001:4860::2:0:8652) 13.926 ms 8 ee-in-x71.1e100.net (2a00:1450:4013:c00::71) 4.732 ms 4.733 ms 4.783 ms

При поиске причин неполадок в сети, утилита tracert занимает второе место после утилиты ping . Tracert (в Linux"e traceroute ) позволяет определить на каком участке сети (между какими маршрутизаторами) возникла проблема. Для использования программы необходимо в командной строке Windows или Linux выполнить команду:

Tracert yandex.ru

нажимаем enter, и видим примерно следующее:

На картинке выше видно, что между моим компьютером и сервером yandex.ru находятся 12 промежуточных маршрутизаторов, указаны IP адреса маршрутизаторов и время прохождения пакета до каждого маршрутизатора.

Если на каком-нибудь участке сети возникла проблема (нет маршрута до сети назначения, нет связи с следующим маршрутизатором, нет узла назначения в указанной сети и т.д.) тогда мы увидим вместо временипрохождения пакета звёздочки, а вместо IP адреса маршрутизатора сообщение "Превышен интервал ожидания для запроса":

Так как же работает утилита tracert?

Для того чтобы ответить на этот вопрос, нужно вспомнить структуру IP пакета, а точнее вспомнить про одно из его полей - TTL (Число переходов):

При отправке пакета это поле выставляется в 255 и затем, каждый маршрутизатор, через который пройдёт данный пакет уменьшает это значение на 1 т.е. TTL=TTL-1 . Маршрутизатор, который получает пакет с значением TTL=1, уменьшает его на единицу, а затем удаляет пакет, т.к. значение поля TTL у пакета стало равно 0. После того как пакет был отброшен маршрутизатором, отправителю пакета отправляется ICMP-сообщение с кодом 11: "Превышение временного интервала". В заголовке IP-пакета с ICMP сообщением источником является IP-адрес маршрутизатора, дропнувшего пакет, а назначением - IP-адрес компьютера, отправившего отброшенный пакет.

Теперь не сложно догадаться как работает Tracert :

  • Отправляется IP-пакет на указанный узел (в нашем примере yandex.ru) со значением поля TTL=1
  • первый маршрутизатор на пути пакета уменьшает TTL и дропает(уничтожает) пакет
  • Маршрутизатор отправляет ICMP уведомление что пакетик умер
  • Утилита Tracert извлекает из ICMP пакета IP-адрес маршрутизатора измеряет потраченное время на прохождение пакета до маршрутизатора
  • Если не указано иное в параметрах запуска Tracert , то посылается запрос DNS-серверу и определяется доменное имя маршрутизатора, если такое имеется
  • В консоль выводится IP-адрес (или доменное имя) первого маршрутизатора
  • Снова отправляется IP пакет на указанный узел, но с TTL=2
  • Пакет дропается на втором промежуточном маршрутизаторе
  • Процедура повторяется до тех пор, пока не придёт ответ от узла назначения (yandex.ru) либо число промежуточных узлов не привысит максимального значения для tracert - 30 узлов.

Вот собственно и всё, ничего сложного!

Не всегда сеть работает так, как от нее требуется, иногда определенный компьютер в вашей локальной сети компании, или удаленный может не отвечать. Казалось бы, все работает, все подключено, но похоже на каком-то из узлов, на пути от вашего компьютера, до нужного случается ошибка.

Утилита ping позволяет только определить наличие проблемы, что узел не отвечает, но как узнать где обрывается соединение? Для этого применяется утилита traceroure. В этой небольшой инструкции мы рассмотрим как пользоваться traceroute linux, как понимать ее вывод и определить где же все-таки проблема. Но сначала рассмотрим, как работает traceroute.

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

Каждый пакет проходит на своем пути определенное количество узлов, пока достигнет своей цели. Причем, каждый пакет имеет свое время жизни. Это количество узлов, которые может пройти пакет перед тем, как он будет уничтожен. Этот параметр записывается в заголовке TTL, каждый маршрутизатор, через который будет проходить пакет уменьшает его на единицу. При TTL=0 пакет уничтожается, а отправителю отсылается сообщение Time Exceeded.

Команда traceroute linux использует UDP пакеты. Она отправляет пакет с TTL=1 и смотрит адрес ответившего узла, дальше TTL=2, TTL=3 и так пока не достигнет цели. Каждый раз отправляется по три пакета и для каждого из них измеряется время прохождения. Пакет отправляется на случайный порт, который, скорее всего, не занят. Когда утилита traceroute получает сообщение от целевого узла о том, что порт недоступен трассировка считается завершенной.

Утилита Traceroute

Перед тем как перейти к примерам работы с утилитой давайте рассмотрим ее синтаксис и основные опции. Синтаксис вызова очень прост:

$ traceroute опции адрес_узла

В качестве адреса может использоваться ip адрес или доменное имя. Рассмотрим основные опции:

  • -4 или -6 - использовать ipv4 или ipv6 протокол;
  • -I - использовать ICMP пакеты вместо UDP;
  • -T - использовать TCP пакеты вместо UDP;
  • -F - не фрагментировать пакеты;
  • -f - указать TTL с которого нужно начать;
  • -g - передавать пакет через указанный шлюз;
  • -i - передавать пакет через указанный интерфейс;
  • -m - максимальное количество узлов, через которые пройдет пакет;
  • -q - количество пакетов, отправляемых за раз, по умолчанию три;
  • -n - не узнавать доменные имена;
  • -p - указать порт вместо порта по умолчанию;
  • -w - установить время ожидания ответа от узла, по умолчанию полсекунды;
  • -r - использовать другой роутер вместо того, что указанный в таблице маршрутизации;
  • -z - минимальный интервал между пакетами;
  • -U - использовать UDP с увеличением номера порта;
  • -UL - использовать протокол UDPLITE;
  • -D - использовать протокол DCCP;
  • --mtu - указать размер пакета;
  • -P - протокол, доступны такие значения: raw, dccp, udplite, udp, tcpconn, tcp, icmp.

Это не все опции утилиты, но все основные, которыми вы будете пользоваться. Дальше перейдем практике того, как выполняется трассировка сети Linux.

Примеры трассировки сети в Linux

Например, выполним трассировку до сервера сайт:

sudo traceroute сайт

Как видите, пакет прошел через 6 узлов перед тем, как дойти до цели. На каждый узел отправлялось по три пакета и для каждого из них было засечено время прохождения. И если на одном из узлов возникнет проблема, теперь вы будете знать на каком.

У вас, наверное, возник вопрос, почему время прохождения для некоторых узлов такое долгое? Ведь если выполнить ping, то общее время будет намного меньше. Дело в том, что время засекается для пути пакета туда и обратно. От запроса до ответа. Это раз, но еще нужно учитывать что маршрутизаторы дают высший приоритет для приходящих пакетов, когда для сервисных задержки могут быть более длинными.

Еще, вместо одного узла вы можете видеть звездочки traceroute. Это еще не значит, что он не работает. Это означает что всего лишь он не захотел нам отвечать. Давайте проверим еще что-нибудь, например, публичный DNS google:

sudo traceroute 8.8.8.8

Здесь уже больше узлов, и такая же ситуация со звездочками. Если бы на пути к серверу возникла ошибка, мы бы это увидели. Например, узел 195.153.14.1 нам не ответил и мы смогли отследить запрос только до 212.162.26.169.

sudo traceroute 195.153.14.1

Иногда трассировка с помощью UDP не работает, это может произойти потому, что фаервол блокирует все лишние пакеты. Мы можем воспользоваться ICMP с помощью опции -I.

sudo traceroute history.pl

sudo traceroute -I history.pl

Но трассировка может использоваться не только для обнаружения обрыва в цепочке маршрутизаторов. У нее еще есть достаточно интересное применение по исследованию сети. Например, вы можете попытаться определить использование подсетей провайдером. Отправим три запроса на разные адреса:

sudo traceroute сайт
$ sudo traceroute history.pl
$ sudo traceroute habrahabr.ru


Затем сравните выводы этих команд. Вы увидите, что начальные IP адреса одинаковые. Мы можем сделать вывод, что наш роутер 192.168.1.1 подключен к локальной сети провайдера 195.5.8.0/24, которая, в свою очередь, подключена к сети 10.50.50.0/24 откуда уже получает доступ к внешней сети.

Выполняет трассировку до точки назначения с помощью посылки адресату эхо-сообщений. Посылка осуществляется по протоколу Control Message Protocol (ICMP) с постоянным увеличением значений срока жизни пакетов (Time to Live, TTL).

Выведенный путь - это список ближайших интерфейсов маршрутизаторов, находящихся на пути между узлом источника и точкой назначения. Ближний интерфейс представляют собой интерфейс маршрутизатора, который является ближайшим к узлу отправителя на пути. Запущенная без параметров, команда tracert выводит справку.

Для проверки сети также можно воспользоваться командами:

  • PING - основная TCP/IP-команда, используемая для устранения неполадки в соединении, проверки возможности доступа и разрешения имен;
  • PATHPING - предоставляет информацию о латентности сети и потерях данных на промежуточных узлах.

Параметры и ключи утилиты TRACERT

tracert [-d] [-h максимальное_число_переходов] [-j список_узлов] [-w интервал [имя_конечного_компьютера]

  • -d - Предотвращает попытки команды tracert разрешения IP-адресов промежуточных маршрутизаторов в имена. Увеличивает скорость вывода результатов команды tracert.
  • -h максимальное_число_переходов - Задает максимальное количество переходов на пути при поиске конечного объекта. Значение по умолчанию равно 30.
  • -j список_узов - Указывает для сообщений с эхо-запросом использование параметра свободной маршрутизации в заголовке IP с набором промежуточных мест назначения, указанных в списке_узлов. При свободной маршрутизации успешные промежуточные места назначения могут быть разделены одним или несколькими маршрутизаторами. Максимальное число адресов или имен в списке - 9. Список_адресов представляет набор IP-адресов (в точечно-десятичной нотации), разделенных пробелами.
  • -w интервал - Определяет в миллисекундах время ожидания для получения эхо-ответов протокола ICMP или ICMP-сообщений об истечении времени, соответствующих данному сообщению эхо-запроса. Если сообщение не получено в течение заданного времени, выводится звездочка (*). Таймаут по умолчанию 4000 (4 секунды).
  • имя_конечного_компьютера - Задает точку назначения, указанную IP-адресом или именем узла.
  • -? - Отображает справку в командной строке по утилите tracert.

Примеры команды TRACERT

  • Чтобы отобразить справку в командной строке по команде введите: tracert /? ;
  • Чтобы выполнить трассировку пути к узлу, введите команду: tracert ya.ru;
  • Чтобы выполнить трассировку пути к узлу и предотвратить разрешение каждого IP-адреса в имя, введите: tracert -d ya.ru.

Видео - Работа с утилитой TRACERT

Перевод мой.

Если вы работаете сетевым администратором, системным администратором или в какой-либо эксплуатационной группе, вы, возможно, слышали об инструменте с названием TRACEROUTE. Это очень удобный инструнт, доступный по умолчанию во многих операционных системах.

Сетевые и системные администраторы используют этот инструмент в ежедневной работе. Это, в сущности, удобное средство диагностики сети. Существуют три основных задачи инструмента traceroute. Эти задачи, выполняемые traceroute’ом, дают понимание ошибки вашей сети.

  1. Полный путь, который проходит пакет.
  2. Имена и идентификацию маршрутизаторов и устройств на пути
  3. Сетевую задержку или, точнее сказать, время, нужное для того, чтобы получить и отправить данные всем устройствам на пути

Это инструмент, который используется, чтобы проверить путь, который проходят ваши данные, чтобы достичь цели, без действительной отправки данных

Как я уже писал, всегда хорошо понимать, как работает какой-то инструмент. Потому что это не тот инструмент, который поможет вам понять и устранить проблему. Но это инструмент, который всегда даст вам представление о проблеме. Как использовать команду всегда можно найти в онлайне или даже в руководстве и информационных страницах по Linux .

В этой статье я объясню работу Traceroute и типы инструментов Traceroute и их различия. Мы также рассмотрим разные параметры, доступные для команды traceroute в Linux

Сначала основное

Каждый пакет, который вы отправляете в интернет, имеет поле, названное TTL. TTL означает время жизни (time to live). Хотя оно и называется временем жизни, в действительности это не время в секундах, а совсем другая история.

TTL не изменяется ни количеством секунд, ни количеством хопов. Это максимальное количество хопов, которое пакет может пройти по сети до того, как будет уничтожен.

Хопы - это ни что иное как компьютеры, маршрутизаторы или иные устройства, которые входят между источником и пунктом назначения

Что бы произошло, если бы вообще не было TTL? Если бы не было TTL, IP-пакет перетекал бы бесконечно от одного маршрутизатора к другому и дальше, и дальше, бесконечно ища назначение. Значение TTL устанавливается отправителем внутри IP-пакета (человек, использующий систему или отправляющий пакет, не замечает этих вещей, происходящих “за кулисами”, но это автоматически обрабатывается операционной системой)

Если назначение не найдено после прохождения слишком большого количества промежуточных маршрутизаторов (хопов), и значение TTL становится равным нулю (что означает, что нет дальнейшего прохождения) получающий маршрутизатор уничтожает пакет и информирует первоначального отправителя.

Первоначального отправителя информируют, что TTL истекло, и он не может передать пакет дальше.

Давайте скажем, что мне нужно достичь адреса 10.1.136.23, и мой TTL - 30 хопов, что значит, что я могу проследовать максимум 30 хопов, чтобы достичь цели, перед тем как пакет будет уничтожен.

Но как маршрутизаторы по пути определяют, что достигнут лимит TTL? Каждый маршрутизатор по пути между источником и назначением продолжает уменьшать значение TTL перед отправкой следующему маршрутизатору. Что означает, что если у меня TTL по умолчанию равен 30, мой первый маршрутизатор уменьшит его до 29 и отправит следующему маршрутизатору по пути.

Получающий маршрутизатор делает его равным 28 и отправляет следующему и т.д. Если маршрутизатор получает пакет с TTL, равным единице (это означает, что уже нет дальнейших перемещений или пересылки), пакет уничтожается. Но маршрутизатор, который уничтожает пакет, информирует первоначального отправителя о том, что TTL value has exceeded! (время жизни пакета истекло)

Информация, отправленная маршрутизатором, получившим пакет с TTL равным единице, называется "ICMP TTL exceeded messages ". Разумеется, в интернете, когда вы отправляете что-либо получателю, получатель узнает адрес отправителя.

Следовательно, когда сообщение ICMP TTL exceeded отправляется маршрутизатором, первоначальный отправитель узнаёт адрес маршрутизатора.

Traceroute использует сообщения TTL exceeded чтобы обнаружить маршрутизаторы, которые встречаются на пути к цели (поскольку эти сообщения, отправляемые маршрутизатором, содержат его адрес). <>/p>

Но как traceroute использует сообщение “TTL exceeded” чтобы узнать, какие маршрутизаторы/хопы между ними?

Вы должно быть думаете, /pчто собщения “TTL exceeded” отправляются только маршрутизатором, который получает пакет с TTL 1. Это верно, каждый маршрутизатор между вами и получателем не станет высылать сообщения TTL exceeded. Тогда как вы найдете адреса всех маршрутизаторов/хопов между вами и назначением? Так ведь основная цель traceroute - идентифицировать хопы между вами и назначением.

Но вы можете использовать поведение сообщений TTL exceeded маршрутизаторов/хопов по пути, целенаправленно отправляя пакеты с TTL, равным 1

См. примерную схему всего процесса на схеме, где отправитель использует traceroute к одному из серверов в удалённом месте


Давайте посмотрим на то, что просходит за кулисами. Когда я запускаю команду traceroute -n 8.8.8.8, что делает мой компьютер? - отправляет UDP-пакет. (Да, UDP. Не волнуйтесь, мы обсудим это подробно). UDP-пакет содержит следующее:

  • Мой адрес отправителя
  • Адрес назначения (8.8.8.8)
  • И номер порта назначения, который неверен. Это разумеет, что traceroute отправляет пакет в UDP-порт, в диапазоне от 33434 до 33534, который обычно не используется.

Давайте посмотрим, как это работает

Шаг 1. Мой адрес отправителя создает пакет с адресом назначения 8.8.8.8 и портом назачения между 33434 и 33534. И главное, что он делает - это делает значение TTL равным 1

Шаг 2. Конечно, мой пакет достигает шлюзового сервера. Получая мой пакет, шлюз уменьшает TTL на единицу (все маршрутизаторы/хопы между уменьшают TTL на 1). Когда TTL уменьшается до 1 (1-1=0), значение TTL становится нулевым. Поэтому мой шлюзовый сервер шлёт мне обратно сообщение TTL time exceeded. Прошу запомнить, что когда мой шлюзовый сервер отправляет TTL exceeded мне, он отправляет мне первые 28 байтов того пакета, что я высылал.

Шаг 3 : Получив это сообщение “TTL Time exceeded”, моя программа traceroute сможет узнать адрес и другие сведения о первом хопе, который является моим шлюзовым сервером.

Шаг 4 : Теперь программа трассировки снова отправит тот же UDP пакет с назначением 8.8.8.8 и случайным UDP портом назначения от 33434 до 33534. Но на этот раз я сделаю первоначальный TTL =2. В результате, мой шлюз или маршрутизатор снизит его на 1, а затем передаст этот пакет, следующему хопу/маршрутизатору (пакет, отправленный моим шлюзом к следующему узлу будет иметь значение TTL 1).

Шаг 5 : При получении UDP пакета следующий переход к моему шлюзовому серверу снова уменьшит его до 1, что означает, что теперь TTL вновь стал равен 0. Следовательно, он пошлет мне оттуда сообщение ICMP Time exceeded с адресом источника а также первые 28 байт заголовка пакета, который я отправил.

Шаг 6 . При получении TTL Time exceeded, моя программа traceroute узнаёт IP-адрес маршрутизатора/хопа и показывает мне его на экране.

Шаг 7 . Теперь моя программа traceroute вновь создаст такой же UDP-пакет со случайным UDP-портом и адресом назначения 8.8.8.8. Но в этот раз значение TTL равно трём, таким образом TTL автоматически становится нулевым, когда достигает третьего хопа/маршрутизатора (прошу вспомнить, что мой шлюз и следующий за ним хоп уменьшают его на единицу). Так что он ответит мне сообщением TTL Time exceeded и моя программа taceroute узнает об IP-адресе маршрутизатора/хопа

Шаг 8 : Получив этот ответ, программа traceroute ещё раз создаст UDP-пакет, на этот раз со значением TTL=4. Если я получу TTL Time exceeded и для него также, то моя программа traceroutе будет посылать UDP пакет с TTL=5 и так далее.

Но как моя программа Traceroute узнает, что конечный пункт 8.8.8.8 достигнут? Программа трассировки узнает об этом так: когда первоначальный приёмник пакета 8.8.8.8 (помните, что у всех UDP-пакетов был адрес получателя 8.8.8.8) получает запрос, он пошлёт мне сообщение, которое будет совершенно отличным от всех сообщений "TTL Time exceeded ".

Когда изначальный получатель (8.8.8.8) получает мой UDP-пакет, он отправляет мне сообщение "ICMP Destination/PORT Unreachable ". Это должно произойти, потому что мы всегда отправляем случайный UDP-порт между 33434 до 33534. Поэтому моя программа Traceroute будет знать, что мы достигли конечного пункта назначения и прекратит посылать какие-либо дополнительные пакеты.

Сейчас всё, что описано словами, называется теорией. Нам нужно подтвердить это, запустив Tcpdump во время Traceroute. Давайте посмотрим на вывод tcpdump. Прошу обратить внимание на то, то я не показываю вам полный вывод tcpdump, поскольку он слишком длинный.


Запустите traceroute в одном терминале вашей Linux машины. И в другом терминале запустите tcpdump, чтобы увидеть, что происходит.

Вывод выше показывает только UDP-пакеты, отправленные с моей машины. Я покажу ответные сообщения отдельно, чтобы было яснее

Обратите внимание на TTL в каждой строке. Она начинается с TTL, равного единице, затем 2, и затем 3 до TTL равного 6. Вам может показаться странным, почему мой сервер отправляет 3 UDP-сообщения с TTL=1, а затем 2, а затем 3?

Причина этого заключается в вычислении среднего время прохождения. Программа traceroute отправляет три UDP-пакета для каждого хопа, чтобы измерить точное среднее время прохождения пакета. Среднее время прохождения - ни что иное как время в миллисекундах, которое потребовалось для отправки, а затем получения ответа. Я намеренно не упомянул об этом в самом начале, чтобы избежать путаницы.

Таким образом, нижняя строка моей программы traceroute отправляет три UDP-пакета каждому хопу, чтобы просто вычислить приблизительное время прохождения. Поэтому вывод traceroute показывает эти три значения. Давайте рассмотрим поближе вывод traceroute. Он показывает три значения в милисекундах для каждого хопа, чтобы получить четкое представление о времени прохождения.

Теперь давайте посмотрим, ответ мы получили от всех хопов через TCPDUMP. Обратите внимание, что ответные сообщения, которые привожу ниже, являются частью того же ТСРDUMP, который я запустил ранее, но показываю их вам отдельно, чтобы было яснее.

Еще одна интересная вещь, чтобы отметить, что каждый раз, когда моя программа посылает различные случайные номера портов UDP. Это для того, чтобы определить, какому из пакетов принадлежит ответ. Как говорилось ранее, ответное сообщение, которое отправляют хопы и адресат, содержит заголовок исходного пакета, который мы отправили, поэтому программа traceroute может точно рассчитать точное время прохождения (для каждого из трёх UDP пакетов, отправленных каждому хопу), так как он может легко определить ответ и сопоставить. Случайные числа портов являются своего рода идентификаторами для определения ответа.

Ответные сообщения выглядят как показано ниже.


Прошу обратить внимание, что сообщения ICMP time exceeded показаны выше (я не показал все ответные сообщения)

Теперь позвольте мне показать последнее послание, которое отличается от ICMP time exceeded. Это сообщение destination port unreachable (порт назначения недостижим), как говорилось ранее. И программа traceroute узнает, что наша цель достигнута.

Обратите внимание, что есть три ответа от 8.8.8.8 моей программе traceroute. Как говорилось ранее, traceroute отправляет три одинаковых UDP-пакета с различными портами, чтобы просто вычислить точное время прохождения. Конечный пункт назначения ничем не отличается.

Разные типы программ Traceroute

Существуют различные типы программ traceroute. Каждая из них работает немного по-своему. Но их общая концепция одна и та же. Все они использует значение TTL.

Почему разные реализации? Это потому, что вы можете использовать ту, которая применима к вашей среде. Если предположить, что файрволл блокирует трафик UDP, то вы можете использовать другую трассировку для этой цели. Различные типы приведены ниже.

Та, что мы использовали ранее - UDP трассировка. Это протокол по умолчанию, используемый программой traceroute в Linux. Тем не менее вы можете попросить нашу утилиту traceroute в Linux использовать протокол ICMP вместо UDP с помощью следующей команды.

[email protected]:~# traceroute -I -n 8.8.8.8

ICMP для traceroute работает точно так же, как UDP traceroute. Программа traceroute будет отправлять ICMP Echo-запросы и хопы между ними будут отвечать ICMP-сообщениями "ICMP Time exceeded " (время истекло). Но конечный пункт назначения будет отправлять ICMP echo-ответ. Команда tracert, доступная в операционной системе Windows, по умолчанию использует ICMP метод трассировки маршрута.

И последний является самым интересным. Его называют TCPtraceroute. Он используется, потому что почти все файрволлы и промежуточные маршрутизаторы позволяют передавать TCP трафик. И если пакет на порт 80, который является веб-трафиком, то большинство маршрутизаторов пропускают этот пакет. TCPTRACEROUTE по умолчанию отправляет TCP SYN запросы на порт 80.

Все маршрутизаторы между источником и пунктом назначения будут посылать сообщение "TTL time exceeded " (время TTL истекло) , а адресат будет посылать либо пакет RST, если порт 80 закрыт, либо пакет SYN / ACK. (Но tcptraceroute не создает соединение TCP. При получении SYN / ACK пакета, программа трассировки пошлет пакет RST, чтобы закрыть соединение). Следовательно, программе трассировки становится известно, что цель достигнута. Обратите внимание на тот факт, что опция -n, которую я использовал в ранее показанной команде traceroute, не будет осуществлять разрешение имен DNS. В противном случае трассировка будет посылать запросы DNS для всех хопов, которые она встретит по пути.

Теперь главный вопрос в том, какую из трассировок я должен использовать: ICMP, UDP или TCP?

Всё зависит от окружения. Если предположить, что промежуточные маршрутизаторы блокируют конкретный протокол, вы должны попробовать использовать другой.