- Remove From My Forums
-
Общие обсуждения
-
собственное
C:(……….как пример)>tracert ya.ruТрассировка маршрута к ya.ru [213.180.204.8]
с максимальным числом прыжков 30:1 Общий сбой.
Трассировка завершена.
Вот еще
C……..)>tracert mail.ru
Трассировка маршрута к mail.ru [217.69.128.42]
с максимальным числом прыжков 30:1 Общий сбой.
Трассировка заверш ена.
ни че вообще не работает даже пинг
C:(…)>ping ya.ru
Обмен пакетами с ya.ru [213.180.204.8] с 32 байтами данных:
Общий сбой.
Общий сбой.
Общий сбой.
Общий сбой.Статистика Ping для 213.180.204.8:
Пакетов: отправлено = 4, получено = 0, потеряно = 4
(100% потерь)OS Win 7 где 7600 с последними обновлениями
фаерволы выключал, антивирусы тоже-
Изменен тип
9 декабря 2009 г. 10:59
-
Изменен тип
Vinokurov Yuriy
9 декабря 2009 г. 11:26
-
Изменен тип
Traceroute — это утилита, которая позволяет проследить маршрут следования данных до удалённого адресата в сетях TCP/IP. В Linux используется команда Traceroute, а в Windows — Tracert. При помощи этих команд можно увидеть путь пакета данных от вашего компьютера до целевого сервера или сайта.
Как работают Tracert и Traceroute
Когда вы пытаетесь открыть сайт, браузер отправляет сообщение (запрос) серверу, на котором этот сайт находится. Сообщение на своём пути проходит через маршрутизаторы. Они решают, куда дальше передать сообщение, чтобы гарантированно его доставить адресату. В трассировке маршрутизаторы ещё называют хопами (хоп — прыжок) или узлами. Количество узлов, через которые на своём пути пройдёт запрос, можно узнать при помощи утилит Tracert и Traceroute. Узлы, которые не являются целевыми для запроса, называют транзитными.
Утилита Traceroute формирует UDP-датаграмму (сообщение, которое нужно доставить целевому серверу), упаковывает её в IP-пакет и передаёт первому транзитному узлу. В заголовке такого IP-пакета есть поле TTL (Time To Live) — время жизни пакета. Оно определяет количество хопов, через которые пакет может пройти. На каждом узле TTL уменьшается на единицу. Если на пути к удалённому адресату время жизни пакета станет равно 0, маршрутизатор отбросит пакет и отправит источнику ICMP-сообщение об ошибке «Time Exceeded» (время истекло).
Этот принцип лежит в основе работы утилит Tracert и Traceroute, однако между ними есть отличия. Рассмотрим каждую утилиту отдельно.
Tracert отправляет на хост назначения ICPM-запрос «Echo Request» с TTL=1. Первый маршрутизатор, который получит запрос, проверяет, кому он предназначен. Если маршрутизатор не является целевым хостом, он уменьшает TTL на 1, отбрасывает пакет и отправляет ICMP-сообщение источнику, так как время жизни теперь равно 0. В этом сообщении маршрутизатор указывает информацию о себе и причину дропа пакета. Получив сообщение, Tracert запоминает этот маршрутизатор как первый хоп (прыжок) и отправляет следующий пакет, но уже с TTL=2. Первый хоп успешно обрабатывает новый пакет, уменьшает время его жизни на 1 и передаёт дальше. Следующий маршрутизатор тоже выполняет проверку хоста назначения и, если пакет предназначен не ему, уменьшает TTL, отбрасывает пакет и отправляет ICMP-сообщение источнику. Tracert запоминает второй хоп, снова увеличивает TTL на 1 и отправляет следующий пакет. Эти действия будут повторяться до тех пор, пока пакет не достигнет целевого хоста. Когда запрос попадёт к целевому хосту, этот хост в ответ направит ICMP «Echo Reply». Источник воспримет это как завершение трассировки.
Утилита Traceroute вместо ICMP-запроса отправляет 3 UDP-пакета на определенный порт целевого хоста и ожидает ответа о недоступности этого порта. Первый пакет отправляется с TTL=1, второй с TTL=2 и так далее, пока запрос не попадёт адресату. Отличие от Tracert в том, как Traceroute понимает, что трассировка завершена. Так как вместо ICMP-запроса он отправляет UDP-запрос, в каждом запросе есть порт отправителя (Sourсe) и порт получателя (Destination). По умолчанию запрос отправляется на закрытый порт 34434. Когда запрос попадёт на хост назначения, этот хост отправит ответ о недоступности порта «Destination port unreachable» (порт назначения недоступен). Это значит, что адресат получил запрос. Traceroute воспримет этот ответ как завершение трассировки.
Если Tracert работает по протоколу ICMP, то какой протокол используется командой Traceroute? По умолчанию используется протокол UDP, но traceroute может отправить и ICMP-запрос «Echo Request», как Tracert. Такой способ пригодится, если хоп не отвечает на UDP-пакет.
Как использовать Traceroute и Tracert
Если у вас кириллический домен
Кириллические домены необходимо вводить в формате Punycode. Для перевода домена в Punycode воспользуйтесь сервисом.
Выполним команду Traceroute в Linux на примере Ubuntu 20.04:
-
1.
Откройте терминал при помощи комбинации клавиш CTRL + Shift + T или введите в поиске слово «Терминал».
-
2.
Введите команду
traceroute domain.name
. Вместоdomain.name
укажите домен:
Если нужно выполнить трассировку до IP-адреса, введите
traceroute ip
. Вместоip
укажите нужный адрес:
Вывод команды будет содержать:
- порядковый номер маршрутизатора (узла),
- имя узла,
- IP-адрес узла,
- круговую задержку (время, потраченное на отправку запроса и получение ответа).
Команда Traceroute в Windows 10 отсутствует, поэтому следует воспользоваться Tracert:
-
1.
Нажмите комбинацию клавиш Win + R.
-
2.
Введите cmd и нажмите Enter.
-
3.
Введите
tracert domain.name
. Вместоdomain.name
укажите домен или IP-адрес, до которого хотите выполнить трассировку:
Вывод команды tracert будет выглядеть следующим образом:
- порядковый номер маршрутизатора (узла),
- круговая задержка (время, потраченное на отправку запроса и получение ответа),
- имя узла,
- IP-адрес узла.
-
1.
Найдите в Spotlight утилиту Network Utility (Сетевая утилита) и запустите её.
-
2.
Выберите вкладку Traceroute и введите имя домена или IP-адрес. Затем нажмите кнопку Trace:
Вывод содержит:
- порядковый номер узла,
- имя узла,
- IP-адрес узла,
- круговую задержку (время, потраченное на отправку запроса и получение ответа).
Если нужно отправить вывод команды в службу поддержки, сделайте скриншот или скопируйте текст.
Как установить Traceroute на Linux
В Unix-подобных системах программа может быть не установлена. Ниже мы покажем, как установить Traceroute на некоторых операционных системах.
Как установить Traceroute в Debian/Ubuntu
-
1.
Запустите терминал и введите команду
sudo apt-get update
для обновления данных о репозиториях. -
2.
Введите команду
sudo apt-get install traceroute
.
Как установить Traceroute в Centos 7,8
-
1.
Запустите терминал и введите команду
sudo yum update
для обновления данных о репозиториях. -
2.
Введите команду
sudo yum install traceroute
.
Как выполнить Traceroute по порту
По умолчанию первый UDP-пакет отправляется на порт 34434 и на каждом узле увеличивается на 1: 34434 на первом, 34435 на втором и так далее. При помощи ключа -p
порт можно указать вручную. Команда будет выглядеть следующим образом:
traceroute -p [номер порта] domain.name
В Windows трассировку с указанием порта стандартными средствами выполнить нельзя, так как Traceroute в cmd отсутствует, а Tracert не умеет работать с портами.
Как использовать Traceroute по ICMP
И UDP и ICMP-протоколы используются командой Traceroute. UDP используется по умолчанию. Чтобы воспользоваться ICMP, добавьте в команду ключ -I
:
traceroute -I domain.name
Для чего это нужно? Оборудование может быть настроено на то, чтобы не отвечать на подобные запросы. Если вы увидите в выводе символы * * *
, это может значить, что маршрутизатор отклонил пакет и не отправил ответ. Звёздочки в выводе не означают, что у узла проблемы. Соединения может фильтровать Firewall, который стоит перед узлом. Это делается специально, чтобы снизить нагрузку. Пример такого вывода команды:
В этом случае попробуйте воспользоваться ключом -I
:
Ключ -I
требует root-привилегий. Если команда не выполняется, добавьте в начало sudo
:
sudo traceroute -I domain.name
Трассировка используется для диагностики проблем сети. Её может запросить ваш хостинг- или интернет-провайдер. В этом случае предоставьте скриншот или текст вывода команды.
Если сайт работает, а трассировка до него не доходит, значит запросы фильтруются на пути к цели. Отсутствие трассировки не означает наличие проблемы.
Microsoft Windows 2000 версия этой статьи 162326см.
Аннотация
В данной статье описывается TRACERT (Trace Route), служебная программа командной строки, который можно использовать для трассировки путь, который принимает пакет Internet Protocol (IP) до места назначения. В данной статье рассматриваются следующие вопросы:
-
Использование служебной программы TRACERT
-
Использование команды TRACERT для устранения неполадок
-
Сведения о параметрах команды TRACERT
Дополнительная информация
Использование служебной программы TRACERT
Диагностические программы TRACERT определяет маршрут к месту назначения, посылая эхо-сообщений протокола ICMP (Internet Control) пакетов в место назначения. В этих пакетов TRACERT использует разные значения IP Time To Live (TTL). Поскольку каждый маршрутизатор на пути обязан уменьшить значение поля TTL пакета, по крайней мере на 1 перед дальнейшей пересылкой пакета, значение TTL по сути является эффективным счетчиком переходов. Когда срок ЖИЗНИ пакетов достигает нуля (0), маршрутизатор посылает ICMP «Time Exceeded» сообщений на исходном компьютере. TRACERT отправляет первого эхо-пакета с TTL равным 1 и увеличивает значение TTL на 1 для каждого последующего отправляемого пока назначение не ответит или пока не будет достигнуто максимальное значение поля TTL. Сообщений ICMP «Time Exceeded», который промежуточные маршрутизаторы отправить назад отображается маршрут. Однако обратите внимание, что некоторые маршрутизаторы просто отбрасывать пакеты с истекшим сроком TTLs, и эти пакеты не видны для команды TRACERT. Команда TRACERT выводит упорядоченный список промежуточных маршрутизаторов, которые возвращают ICMP «Time Exceeded» сообщения. Параметр -d с помощью команды tracert программа TRACERT не требуется выполнять поиск в DNS для каждого IP-адреса, так, что команда TRACERT отображает IP-адрес ближних интерфейсов маршрутизаторов. В следующем примере команда tracert и ее результаты пакет проходит через два маршрутизатора (157.54.48.1 и 11.1.0.67), чтобы достигнуть узла 11.1.0.1. В этом примере основной шлюз — 157.54.48.1 и IP-адрес маршрутизатора в 11.1.0.0 сети находится в 11.1.0.67.The команды:
C:>tracert 11.1.0.1В результате выполнения команды: Tracing route to 11.1.0.1 over a maximum of 30 hops ————————————————— 1 2 ms 3 ms 2 ms 157.54.48.1 2 75 ms 83 ms 88 ms 11.1.0.67 3 73 ms 79 ms 93 ms 11.1.0.1 Trace complete.
Использование команды TRACERT для устранения неполадок
TRACERT можно использовать, чтобы узнать в каком месте сети останавливаются пакеты. В следующем примере основной шлюз обнаружил, что существует не правильный путь для размещения на 22.110.0.1. Вероятно, либо маршрутизатор имеет проблемы конфигурации или 22.110.0.0 сети не существует, отражая неправильный IP-адрес. Команда:
C: > tracert 22.110.0.1В результате выполнения команды: Tracing route to 22.110.0.1 over a maximum of 30 hops —————————————————— 1 157.54.48.1 reports: Destination net unreachable. Trace complete. TRACERT полезна для устранения неполадок в больших сетях, где несколько путей может привести к той же точке или где задействовано множество промежуточных компонентов (мосты или маршрутизаторы).
Сведения о параметрах команды TRACERT
Существует несколько параметров командной строки, которые можно использовать с помощью команды TRACERT, несмотря на то, что параметры не являются обычно требуются для стандартных неполадок. В следующем примере синтаксис команды показывает все возможные варианты:
Tracert -d -h максЧисло -j списокУзлов — w Таймаут target_hostЧто делают параметры: -d Specifies to not resolve addresses to host names -h maximum_hops Specifies the maximum number of hops to search for the target -j host-list Specifies loose source route along the host-list -w timeout Waits the number of milliseconds specified by timeout for each reply target_host Specifies the name or IP address of the target host
Нужна дополнительная помощь?
Привет, посетитель сайта ZametkiNaPolyah.ru! Продолжим разбираться с полезными командами и утилитами командной строки Windows, на этот раз давайте разберемся с сетевой утилитой tracert, мы поговорим зачем нужна команда tracert и как ею пользоваться для диагностики компьютерной сети и устранению неполадок. Как мы увидим, утилиту tracert используют сетевые инженеры и системные администраторы для определения маршрута прохождения IP-пакета по сети, вы убедитесь, что этой утилитой довольно легко пользоваться, но не все умеют правильно оценивать результаты работы этой команды, о некоторых сложностях, которые могут возникнуть при интерпретации трассировка маршрута мы поговорим в самом конце этой публикации.
Если вам интересна тема компьютерных сетей, то в блоге уже практически закончена первая часть курса по основам компьютерных сетей, можете ознакомиться с ее содержимым. И вот здесь можно получить немного информации о самом курсе основанном на Cisco ICND1.
Назначение команды tracert или как определить маршрут прохождения пакета до узла
Содержание статьи:
- Назначение команды tracert или как определить маршрут прохождения пакета до узла
- Параметры команды tracert в Windows
- Примеры использования утилиты tracert для устранения проблем в сети
- Несколько советов о том, как читать и интерпретировать выводы результатов работы команды tracert
- Выводы
Tracert – это небольшая системная утилита вашей операционной системы, которая позволяет сделать трассировку маршрута до заданного узла в локальной сети или сети Интернет. В операционных системах Windows tracert – это стандартная утилита, которая устанавливается вместе с операционной системой, то есть вам не нужно ничего устанавливать, чтобы воспользоваться командной tracert. Исполняемый файл tracert.exe в Windows 10 находится по следующему пути: C:WindowsSystem32.
Команда tracert – это один из самых часто используемых инструментов для траблшутинга и сетевой диагностики, эта утилита дает нам возможность определить маршрут, по которому проходит пакет до заданного узла. Tracert может работать как с доменными имена или именами хостов, так и с IP-адресами (как с IPv4, так и с IPv6). Кроме того что tracert показывает маршрут от вашего компьютера до удаленного узла в сети, она еще и отображает время прохождения пакетов как до конечного узла, так и до транзитных или промежуточных узлов (время является одной из самых важных единиц измерения в компьютерных сетях). Давайте лучше посмотрим, как работает утилита tracert на простом примере без дополнительных параметров.
Трассировка маршрута при помощи команды Tracert до IP-адреса Яндекс
В данном случаем мы видим путь прохождения IP-пакета от моего ПК до сервера Яндекс, чтобы указать утилите tracert удаленный узел, мы воспользовались IP-адресом. Но эта команда может работать и с доменными именами, давайте посмотрим, сделав трассировку маршрута до сервера Google.
Трассировка маршрута при помощи утилиты tracert до сервера Google по доменному имени
Стоит сказать пару слов о выводе, который мы получили. Каждая строка вывода команды tracert пронумерована, каждая такая строка называется шагом, хопом или прыжком. По умолчанию tracert в Windows отправляет три запроса на каждый хоп и получает от этого хопа ответы, если ответ не получен, то в первых трех столбцах мы видим символ «*», если ответ получен, то в первых трех столбцах указывается время прохождения пакета, а в четвертом столбце Windows дает нам подсказку о причинах, по которым удаленный узел нам не ответил или его адрес, если узел ответил.
Хопы, которые мы видим в трассировке – это маршрутизаторы, серверы или L3 коммутаторы, на интерфейсах которых прописан IP-адрес (то есть устройства, которые определяют путь, по которому пойдет IP-пакет, другими словами – это устройства сетевого уровня моделей OSI 7 и TCP/IP), это важное уточнение для интернет-пользователей, всё дело в том, что витая пара или другой тип кабеля (про минусы использования коаксиального кабеля в Ethernet сетях можете почитать здесь), который приходит к вам в квартиру, подключен в L2 коммутатор, который никак не влияет на маршрут прохождения пакета, на нем нет IP-адресов (вернее есть один адрес, который использует тех. поддержка провайдера для управления этим коммутатором) и он не принимает решений по маршрутизации пакетов, таких коммутаторов между хопами может быть несколько десятков и мы их никак не увидим, так как для утилиты tracert они представляют собой что-то вроде кабеля, собственно как и для других утилит сетевой диагностики.
Для диагностики сетевых ресурсов утилита tracert использует специальный протокол, который называется ICMP (Internet Control Message Protocol — протокол межсетевых управляющих сообщений), есть еще команда traceroute (эта утилита обычно входит в стандартные дистрибутивы Linux, например, эта утилита присутствует в Linux Mint), которая по умолчанию использует протокол UDP, для ее использвания вам точно также потребуется эмулятор терминала. ICMP-сообщение, которое посылает наш компьютер, запаковывается в IP-пакет (здесь вы можете прочитать более подробно про инкапсуляцию данных в компьютерных сетях), у которого есть специальное значение TTL (time to live или время жизни), для понимания работы tracert это важно, поскольку эта команда при каждой отправке пакета увеличивает TTL на единицу, а первый отправленный пакет в сеть имеет значение, равное единице, при этом по умолчанию tracert отправляет три пакета с одним и тем же TTL, то есть в ответ мы должны получить три пакета от удаленного узла (самые основы взаимодействия двух узлов в компьютерной сети описаны здесь, для реализации схемы использовалась Cisco Packet Tracer).
Вернемся к примеру с трассировкой Яндекса, чтобы это лучше понять. Когда мы написали tracert 77.88.55.88, tracert сформировала IP-пакет, в котором в качестве узла назначения указала IP-адрес Яндекса и отправила его в сеть, а в качестве TTL этот пакет получил значение равное единице, далее tracert, не изменяя TTL отправила еще два пакета и получила три ответа от узла 192.168.0.1. После значение TTL было увеличено на единицу (значение стало равным двойке) и в сеть было отправлено еще три пакета (IP-адрес в этих пакетах не изменялся), следующий хоп отказался отвечать на ICMP-запросы и мы увидели три звездочки, после этого TTL был снова увеличен и мы увидели третий хоп, таким образом tracert будет увеличивать TTL до тех пор, пока не доберется до сервера Яндекс. С Гуглом ситуация аналогичная, только там мы использовали доменное имя, поэтому tracert пришлось выполнять дополнительные операции по выяснению IP-адреса, на котором этот домен висит.
При использовании утилиты tracert не стоит паниковать в тех ситуациях, когда вы видите звездочки вместо времени ответа удаленного узла, дело в том, что ICMP-протокол иногда используется для сетевых атак (например, DDoS) и некоторые сетевые инженеры и системные администраторы предпочитают настраивать свои устройства таким образом, чтобы они не отвечали на ICMP-запросы. Иногда бывает так, что конечный узел не отвечает на ICMP-запросы, но на самом деле он корректно работает и выполняет свои функции, для проверки доступности таких узлов вам не поможет команда Ping, так как она тоже использует ICMP, но может помочь команда traceroute или онлайн сервисы по проверки доступно сайтов и серверов в Интернете.
В качестве примера давайте сделаем трассировку до сайта microsoft.com, сервера этой компании не отвечают на ICMP-запросы. Трассировка показана на рисунке ниже.
Трассировка до сервера Microsoft, который не отвечает на ICMP-запросы
На момент проверки этого ресурса он был доступен, но результаты работы tracert нас немного обманывают, по ним видно, что мы якобы не можем добраться до сервера Майкрософт, поэтому для корректной диагностики удаленных ресурсов нужно иметь целый арсенал сетевых утилит, ну или как минимум браузер и умение гуглить. Еще по трассировки видно, что tracert в Windows по умолчанию использует максимальное значение TTL равное 30, протокол IPv4 позволяет задавать максимальное значение TTL 255, но на самом деле это очень много, чтобы остановить выполнение команды tracert воспользуйтесь сочетание клавиш ctrl+c.
Параметры команды tracert в Windows
Любая команда в командной строке Windows имеет небольшой справочник (команда help — справочник командной строки Windows), в котором указаны допустимые параметры, в том числе и команда tracert, чтобы увидеть эти параметры, в командной строке нужно написать: tracert /? или tracert /h.
PS C:WINDOWSsystem32> tracert /? Использование: tracert [—d] [—h максЧисло] [—j списокУзлов] [—w таймаут] [—R] [—S адресИсточника] [—4] [—6] конечноеИмя Параметры: —d Без разрешения в имена узлов. —h максЧисло Максимальное число прыжков при поиске узла. —j списокУзлов Свободный выбор маршрута по списку узлов (только IPv4). —w таймаут Таймаут каждого ответа в миллисекундах. —R Трассировка пути (только IPv6). —S адресИсточника Используемый адрес источника (только IPv6). —4 Принудительное использование IPv4. —6 Принудительное использование IPv6. |
Справка Windows дает подробные пояснения к параметрам команды, думаю, добавлять ничего не нужно, всё станет еще более очевидно, когда мы посмотрим примеры использования утилиты tracert с параметрами.
Примеры использования утилиты tracert для устранения проблем в сети
Как я уже говорил, утилита tracert может принимать несколько параметров, один из них мы уже рассмотрели – адрес удаленного узла в сети, этот параметр обязательный, давайте разберемся с другими параметрами этой утилиты и посмотрим, как их комбинировать и что можно в результате получить. Для начала посмотрим на параметр –d, на мой взгляд он самый непонятный, что означает это – без разрешения в имена узлов. Всё будет ясно, когда мы посмотрим на вывод команды tracert с параметром –d.
Как работает утилита tracert с параметром -d в Windows
Всё очевидно: «без разрешения в имена узлов» означает, что в выводе будут отсутствовать имена хостов, через которые проходит IP-пакет, это бывает удобно, некоторые провайдеры и дата-центры любят задавать длинные имена и вывод становится неудобно читать.
Мы уже делали трассировку до сервера Майкрософт, давайте теперь повторим ее, но ограничим количество хопов до 10 и не будем выводить имена хостов, для этого нужно будет скомбинировать параметры –d и –h. Для команды tracert в Windows последовательность параметров в данном случае не имеет значение.
Как ограничить количество хопов для tracert в Windows или параметр –h
Результата работы параметра –j, который дает возможность свободного выбора маршрута, я, к сожалению, вам не покажу, чтобы узнать больше о том, что дает параметр –j для команды tracert почитайте про опцию LSRR (Loose Source and Record Route), в противоположность есть опция строгой маршрутизации от источника (Strict Source and Record Route – SSRR). Команда tracert с параметром –j работает примерно так: tracert -j 10.10.10.1 20.20.20.20 30.31.44.1 google.com. После параметра –j идет список транзитных узлов, которых должно быть не больше 9 (меньше можно), а в конце адрес узла в сети, до которого вы хотите получить трассировку.
Еще одни полезным параметром утилиты tracert является параметр –w, он позволяет задать команде tracert максимальное время ожидания ICMP-ответа от удаленного узла, значение этому параметру задается в миллисекундах, по умолчанию в Windows это значение равно 4000 мс, это означает, что команда будет ждать ответа от удаленного узла не больше 4 секунд. Пример использование tracert с параметром –w: tracert –w 1000 8.8.8.8. В данном случае мы сказали команде, что не стоит ждать ответ дольше одной секунды.
К сожалению, у меня нет возможности продемонстрировать работу команды tracert с параметрами для протокола IPv6, сюда входят такие параметры как: -R для трассировки пути, -S для указания IPv6 адреса источника. Параметры -6 и -4 будут полезны, если в своей сети вы используете два протокола: IPv6 и IPv4. Но чтобы уж совсем не оставаться без примеров, обратите внимание на листинг ниже.
C:Usersexample>tracert —6 ipv6.google.com Tracing route to ipv6.l.google.com [2a00:1450:8003::93] over a maximum of 30 hops: 1 1 ms 1 ms <1 ms ipv6.myhome.example.org [2001:db8:100::1] 2 18 ms 18 ms 17 ms gw—392.dus—01.de.provider.net [2001:db8:200:187::1] 3 22 ms 17 ms 16 ms provider.gateway.example.com [2001:db8:200::1] 4 27 ms 26 ms 30 ms 2001:7f8:8::3b41:0:1 5 34 ms 30 ms 31 ms 2001:4860::1:0:60d 6 33 ms 33 ms 35 ms 2001:4860::1:0:fdd 7 42 ms 41 ms 39 ms 2001:4860::1:0:12 8 40 ms 40 ms 40 ms 2001:4860::2:0:66f 9 41 ms 50 ms 50 ms 2001:4860:0:1::2d 10 45 ms 40 ms 40 ms 2a00:1450:8003::93 |
Здесь используется параметр -6 при трассировке узла ipv6.google.com. В общем-то с примерами использования утилиты tracert можно завершить, как видите, здесь нет ничего сложного. Гораздо сложнее интерпретировать и анализировать выводы этой команды.
Несколько советов о том, как читать и интерпретировать выводы результатов работы команды tracert
Во-первых, отмечу, что пользоваться командой tracert очень легко, на самом деле очень легко пользоваться любыми сетевыми утилитами, легко писать команды на сетевых устройствах, но понимать, как это всё работает, задача гораздо более сложная. Понимать выводы команды tracert тоже непросто, иногда даже невозможно их правильно интерпретировать.
Вы наверняка думает, что tracecrt позволяет вам правильно оценить задержку прохождения пакетов по сети, ведь так? Всё вроде бы очевидно, три раза отправили, три раза получили, взяли среднее арифметическое и получили среднее время, так? Нет, не так. У пакетов есть время распространения по сети, а у сетевых устройств есть такие факторы как сериализация и буферизация, они довольно сложные.
Когда вы используете tracert или traceroute не забывайте, что маршрутизатор, который будет отвечать на ваши запросы, обрабатывает эти запросы несколько иначе, чем полезный сетевой трафик, который проходит через него транзитом. Мы с вами делали трассировки до узлов Яндекса, Гугла и Майкрософта, мы получали определенные задержки на хопах, но при трассировке мы видим только маршрут «туда», обратный маршрут с вероятностью 90% будет отличаться, но у вас нет возможности сделать трассировку до себя с указанных серверов. То есть получается, что мы видим маршрут «туда», но получаем усредненное время, которое получается путем сложения времени, которое будет затрачено на то, чтобы добраться туда с временем, которое будет затрачено на то, чтобы добраться обратно другим маршрутом (еще раз повторю, что маршрут «обратно» не обязательно должен совпадать и очень часто не совпадет с маршрутом «обратно»), несовпадение маршрутов главным образом связано с коммерческой и юридической сферой взаимодействия провайдеров и других крупных игроков интернета.
Провайдеры используют протоколы динамической маршрутизации, у которых есть функция балансировки трафика, часто до одного и того же сервера можно добраться по нескольким маршрутам. Иногда, когда вы делаете трассировку, ваш первый пакет «туда» идет одним маршрутом, а ваш второй пакет «туда» пойдет другим маршрутом.
Команда tracert только на первый взгляд кажется простой, на самом деле это не так, я сейчас даже не говорю про простых пользователей, многие админы умеют пользоваться tracert на уровне обезьяны и не хотят это исправлять, иначе не объяснишь их восприятие звездочек в выводе («это потери, ужас, мрак, хостер, провайдер, дата-центр, за что я плачу тебе 100 рублей?» обычно именно такие ребята поднимают поросячий визг из-за своей некомпетентности в вопросе, потому что те кто может платить больше, позволяют себе нанимать более компетентных людей, хотя это и не всегда так), например, вот так:
1 * <1 мс <1 мс 192.168.0.1 |
Если вы посчитали первый ответ потерей, то вам нужно изучать принцип работы tracert, а также помнить, что сетевое оборудование можно настраивать, в том числе и на работу с ICMP, а может это не потери, а роутер настроен таким образом, чтобы игнорировать часть запросов?
Tracert прекрасно справляется со своей задачей – она отображает путь, по которому проходит IP-пакет, а также время ответа транзитных роутеров/маршрутизаторов, но при помощи данной утилиты невозможно точно оценить потери и нельзя с уверенностью сказать – на каком участке сети потери происходят, чтобы оценить потери в компьютерной сети (здесь можно почитать про основные характеристики компьютерной сети), лучше воспользоваться стандартной утилитой Windows, которая называется pathping, либо более удобной программой WinMTR или mtr в операционных системах семейства Linux.
Выводы
Итак, мы разобрались с использованием команды tracert в Windows и ее параметрами, посмотрели примеры трассировок, которые нам выводила утилита tracert, но главное нужно сделать вывод о том, что утилита tracert не такая простая, как кажется на первый взгляд, и чтобы ее правильно использовать, нужно иметь представление о том, как вообще работают компьютерные сети.
К сожалению, об этом многие забывают, если вас это не убедило, то представьте, что вы пришли к доктору на обследование, который в совершенстве умеет пользоваться своими докторскими инструментами: он знает, что стетоскоп нужно вставлять в уши, прикладывать другой его конец к груди и спине пациента, говорит дышите, не дышите, но этот доктор совершенно не знает ничего о том, как работает человеческое тело, он не понимает, что он слышит в своём стетоскопе и в конце концов поставит неверный диагноз. Аналогичная ситуация и с командой tracert, которой проще пользоваться, чем стетоскопом.
Yeah I am not sure where manilaboy is coming from on this one. The $
prompt in that post doesn’t suggest Linux root
, so traceroute -M icmp
wouldn’t fly to begin with (without taking special sudoers steps, which are not mentioned, anyway). On 17744 and 18219 with traceroute
2.1.0 (ubuntu 1:2.1.0-2) the same fails on missing surface. This was run with wsl.exe
running elevated.
An strace
for the pedantry provided below, but «still not working» posts here are not especially constructive. You’ll know when it is working because the status of this tracker will change when it does. In the meantime use tracert.exe
with interop.
ken@DESKTOP-4UTIQSF:/mnt/c/Windows/System32$ sudo strace -ff traceroute -4 -M icmp google.com
execve("/usr/sbin/traceroute", ["traceroute", "-4", "-M", "icmp", "google.com"], 0x7ffff1af38b8 /* 15 vars */) = 0
brk(NULL) = 0x7fffcb519000
[... blah blah]
socket(AF_INET, SOCK_DGRAM, IPPROTO_ICMP) = -1 EACCES (Permission denied)
socket(AF_INET, SOCK_RAW, IPPROTO_ICMP) = 3
close(-1) = -1 EBADF (Bad file descriptor)
bind(3, {sa_family=AF_INET, sin_port=htons(0), sin_addr=inet_addr("0.0.0.0")}, 28) = 0
setsockopt(3, SOL_IP, IP_MTU_DISCOVER, [0], 4) = 0
setsockopt(3, SOL_SOCKET, SO_TIMESTAMP, [1], 4) = 0
setsockopt(3, SOL_IP, IP_RECVTTL, [1], 4) = 0
fcntl(3, F_SETFL, O_RDONLY|O_NONBLOCK) = 0
connect(3, {sa_family=AF_INET, sin_port=htons(0), sin_addr=inet_addr("216.58.217.46")}, 28) = -1 EOPNOTSUPP (Operation not supported)
Yeah I am not sure where manilaboy is coming from on this one. The $
prompt in that post doesn’t suggest Linux root
, so traceroute -M icmp
wouldn’t fly to begin with (without taking special sudoers steps, which are not mentioned, anyway). On 17744 and 18219 with traceroute
2.1.0 (ubuntu 1:2.1.0-2) the same fails on missing surface. This was run with wsl.exe
running elevated.
An strace
for the pedantry provided below, but «still not working» posts here are not especially constructive. You’ll know when it is working because the status of this tracker will change when it does. In the meantime use tracert.exe
with interop.
ken@DESKTOP-4UTIQSF:/mnt/c/Windows/System32$ sudo strace -ff traceroute -4 -M icmp google.com
execve("/usr/sbin/traceroute", ["traceroute", "-4", "-M", "icmp", "google.com"], 0x7ffff1af38b8 /* 15 vars */) = 0
brk(NULL) = 0x7fffcb519000
[... blah blah]
socket(AF_INET, SOCK_DGRAM, IPPROTO_ICMP) = -1 EACCES (Permission denied)
socket(AF_INET, SOCK_RAW, IPPROTO_ICMP) = 3
close(-1) = -1 EBADF (Bad file descriptor)
bind(3, {sa_family=AF_INET, sin_port=htons(0), sin_addr=inet_addr("0.0.0.0")}, 28) = 0
setsockopt(3, SOL_IP, IP_MTU_DISCOVER, [0], 4) = 0
setsockopt(3, SOL_SOCKET, SO_TIMESTAMP, [1], 4) = 0
setsockopt(3, SOL_IP, IP_RECVTTL, [1], 4) = 0
fcntl(3, F_SETFL, O_RDONLY|O_NONBLOCK) = 0
connect(3, {sa_family=AF_INET, sin_port=htons(0), sin_addr=inet_addr("216.58.217.46")}, 28) = -1 EOPNOTSUPP (Operation not supported)
Автор | Сообщение | ||
---|---|---|---|
|
|||
Member Статус: Не в сети |
Почемуто вдруг перестали работать некоторые команды командной строки типа ping, tracert. Пишется: Чем это может быть вызвано? |
Реклама | |
Партнер |
BEST |
|
Member Статус: Не в сети |
Файл ping.exe в system32 есть? |
pretorian |
|
Member Статус: Не в сети |
да, есть. Куда ему деваться… |
ырг |
|
Advanced member Статус: Не в сети |
pretorian Виста? |
Gestalt |
|
Member Статус: Не в сети |
У меня то же самое, помогите плз. |
pretorian |
|
Member Статус: Не в сети |
ну да, Vista x64. Не на ХР ж сидеть) |
ырг |
|
Advanced member Статус: Не в сети |
pretorian эти программные компоненты нужно установить, это же касается и telnet. Хотя установить — не совсем то слово… включить — будет правильнее. Попозже отпишусь, где это делается. |
nskivan |
|
Member Статус: Не в сети |
pretorian писал(а): Почемуто вдруг Что значит вдруг? тоесть вчера работало, а сегодня нет? или не работало впринципе? Если до этого работало, то это: ырг писал(а): эти программные компоненты нужно установить звучит странно. |
ырг |
|
Advanced member Статус: Не в сети |
nskivan писал(а): звучит странно. у тебя Виста стоит? если да — то в Висте много такого, что любой здравомыслящий человек назовёт странным. Например 2 основных айпишника на 1 сетевухе. |
Fudo |
|
Member Статус: Не в сети |
попробуйте строку от админа запустить |
ырг |
|
Advanced member Статус: Не в сети |
pretorian попробуй так: nskivan писал(а): это уже флейм, вам не кажется? нет, не кажется. Если многие сетевые программные компоненты по умолчанию выключены — это уже не флейм и не смешно. nskivan писал(а): Еще раз, вдумайтесть в эту фразу: боевой телепат? |
nskivan |
|
Member Статус: Не в сети |
ырг писал(а): у тебя Виста стоит? если да — то в Висте много такого, что любой здравомыслящий человек назовёт странным. Например 2 основных айпишника на 1 сетевухе это уже флейм, вам не кажется? pretorian писал(а): Почемуто вдруг перестали работать |
nskivan |
|
Member Статус: Не в сети |
ырг писал(а): боевой телепат? видимо до вас не доходит смысл сказанного |
pretorian |
|
Member Статус: Не в сети |
ырг писал(а): панель управления — программы и компоненты — включение или отключение компонентов Виндоус. Телнет там вынесен отдельной строкой, У Телнета галочка снята. поставить её? nskivan писал(а): если работало и ВДРУГ перестало, проверте на вирусы систему. Вероятно утилиты просто заменены вирусом, как это часто бывает. Та нету вирусов.. почти уверен) Аваст стоит на страже) да и флешки всегда проверяю перед запуском. Fudo писал(а): попробуйте строку от админа запустить Да так вроде и делаю |
DevDM |
|
Member Статус: Не в сети |
Прописать встроке вместо «ping xxxxxx» — «ping.exe xxxxxx» пробовали? Также это касается и tracert. Бывает такой глюк у винды. Чем вызван не знаю. |
pretorian |
|
Member Статус: Не в сети |
тоже самое.. |
DevDM |
|
Member Статус: Не в сети |
Тогда наверно сами файлы повреждены. Пробовать востановить. |
ырг |
|
Advanced member Статус: Не в сети |
pretorian писал(а): У Телнета галочка снята. поставить её? Ещё снята «Простые службы TCP/IP» включи обе. |
Артём |
|
Member Статус: Не в сети |
А может у соучаснега в переменной окружения %PATH% что-то «похозяйничало»? |
DevDM |
|
Member Статус: Не в сети |
ckotick писал(а): А может у соучаснега в переменной окружения %PATH% что-то «похозяйничало»? Это просто проверить — в командной строке прописать полный путь к ping.exe (C:WINDOWSSystem32ping.exe хххххх) и если запустится нормально, то копать дальше. |
—
Кто сейчас на конференции |
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 3 |
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения |
Лаборатория
Новости
На чтение 8 мин. Просмотров 2.4k. Опубликовано 03.09.2019
Некоторые пользователи сообщают, что nslookup работает, но на компьютере не работает ping. Если вы не знакомы, это две команды, которые могут использовать опытные пользователи, и сегодня мы собираемся показать вам, как решить эту проблему.
Неспособность использовать функцию ping может быть проблемой, и, говоря об этой проблеме, вот некоторые похожие проблемы, о которых сообщили пользователи:
- Nslookup разрешает IP, а ping – нет . Иногда эта проблема может быть вызвана антивирусом или брандмауэром, поэтому, возможно, вам следует изменить настройки и проверить, решает ли это проблему.
- Nslookup работает, traceroute не работает . Если вы столкнулись с этой проблемой, возможно, проблема связана с определенными сервисами. Просто перезапустите их, и проблема должна быть решена.
- Nslookup не может разрешить работу ping . Эта проблема может возникать по многим причинам, и если вы столкнулись с ней, обязательно попробуйте некоторые из наших решений.
Содержание
- Nslookup работает, но ping не работает, как это исправить?
- Решение 1. Проверьте свой антивирус
- Решение 2. Используйте командную строку
- Решение 3. Перезапустите службу DNS-клиента.
- Решение 4. Добавьте точку после домена
- Решение 5. Перезапустите службу DNS Cache.
- Решение 6 – Изменить настройки IPv4
- Решение 7 – Переключиться на Google DNS
- Решение 8 – Проверьте ваш файл hosts
- Решение 9 – Отключить IPv6
- Решение 10. Обновите драйверы
Nslookup работает, но ping не работает, как это исправить?
- Проверьте свой антивирус
- Используйте командную строку
- Перезапустите службу DNS-клиента .
- Добавьте точку после домена
- Перезапустите службу кэша DNS .
- Изменить настройки IPv4
- Переключитесь на Google DNS
- Проверьте файл хостов
- Отключить IPv6
- Обновите драйверы
Решение 1. Проверьте свой антивирус
По словам пользователей, если nslookup работает, но ping не работает, проблема может быть связана с вашим антивирусом. Несколько пользователей сообщили о проблемах с Kaspersky и его функцией брандмауэра, и для решения этой проблемы рекомендуется отключить брандмауэр в Kaspersky и проверить, решает ли это проблему.
Помните, что другие антивирусные инструменты и функции также могут вызывать эту проблему, поэтому даже если вы не используете Kaspersky, вам следует проверить настройки антивируса и отключить некоторые функции. Если проблема все еще существует, возможно, вы можете исправить ее, полностью отключив антивирус.
В некоторых случаях единственным способом решения этой проблемы может быть удаление антивируса. Даже если вы решите удалить свой антивирус, вы должны знать, что ваша система будет защищена Защитником Windows, поэтому вам не придется слишком беспокоиться о своей безопасности.
После того, как вы удалите антивирус, проверьте, сохраняется ли проблема. Если проблема не появляется после удаления вашего антивируса, возможно, вам следует подумать о переходе на другое антивирусное решение. На рынке есть много отличных антивирусных инструментов, и если вам нужен надежный антивирус, который не будет мешать вашей системе, мы рекомендуем вам попробовать Bitdefender .
- Читать сейчас: Bitdefender Internet Security 2019: лучший антивирус для платформы Windows
Решение 2. Используйте командную строку
Иногда эта проблема может возникнуть из-за временного сбоя в вашей системе. Если nslookup работает, но ping не работает, вы можете решить проблему, просто выполнив пару команд. Для этого просто выполните следующие действия:
-
Нажмите Windows Key + X , чтобы открыть меню Win + X. Теперь выберите Командная строка (Администратор) или PowerShell (Администратор) из списка.
-
Когда откроется Командная строка , выполните следующие команды:
- netsh каталог сброса winsock
- netsh int ip reset reset.log
- ipconfig/flushdns
- ipconfig/registerdns
- маршрут/f
После выполнения этих команд проверьте, решена ли проблема.
- ЧИТАЙТЕ ТАКЖЕ: ИСПРАВЛЕНИЕ: невозможно подключиться к Интернету в Windows 10
Решение 3. Перезапустите службу DNS-клиента.
Если nslookup работает, но ping не работает, возможно, проблема в одной из ваших служб. Некоторые пользователи утверждают, что проблема была в службе DNS-клиента, и для ее устранения необходимо перезапустить эту службу. Это на самом деле довольно просто сделать, и вы можете сделать это, выполнив следующие действия:
-
Нажмите Windows Key + R , чтобы открыть диалоговое окно Выполнить . Теперь введите services.msc и нажмите Enter или нажмите ОК .
-
Найдите DNS-клиент , щелкните его правой кнопкой мыши и выберите Стоп . Подождите пару секунд, снова щелкните правой кнопкой мыши DNS-клиент и выберите в меню Пуск .
Если вы не можете остановить службу, проблема в зависимых службах. Служба DNS-клиента зависит от определенных служб, и пока эти службы не будут остановлены, вы не сможете остановить службу DNS-клиента. Чтобы узнать, от каких сервисов зависит DNS-клиент, сделайте следующее:
- В окне Службы найдите DNS-клиент и дважды щелкните его, чтобы открыть его свойства.
-
Перейдите на вкладку Зависимости , и вы сможете увидеть службы, от которых зависит DNS-клиент .
- Остановите эти службы, и тогда вы сможете также остановить DNS-клиент .
- После перезапуска службы DNS-клиент обязательно перезапустите службы, от которых зависит DNS-клиент .
Это может быть немного сложным решением, особенно если вам нужно отключить различные службы, но если вы будете тщательно следовать инструкциям, вы сможете управлять ими.
Решение 4. Добавьте точку после домена
Это необычный обходной путь, но он работает в зависимости от пользователей. Если nslookup работает, но ping не работает, возможно, вы можете решить проблему, просто добавив точку после домена.
Например, если вы ранее использовали команду ping windowsreport , попробуйте использовать команду ping windowsreport. и проверьте, работает ли она. Это простой маленький обходной путь, но многие пользователи сообщили, что он работает для них, поэтому не стесняйтесь попробовать.
Решение 5. Перезапустите службу DNS Cache.
Как мы уже упоминали, иногда такие проблемы могут возникать из-за определенных услуг. Если nslookup работает, но ping не работает, проблема, скорее всего, связана со службой DNS Cache, и для ее устранения вам просто нужно перезапустить ее. Чтобы сделать это быстро, просто выполните следующие действия:
- Запустите Командную строку от имени администратора.
-
При запуске Командная строка выполните следующие команды:
- net stop dnscache
- net start dnscache
После выполнения этих двух команд служба DNS-кэша будет перезапущена, и проблема должна быть решена.
- ЧИТАЙТЕ ТАКЖЕ: полное исправление: не подключено, нет доступных подключений, сообщение в Windows 10, 8.1, 7
Решение 6 – Изменить настройки IPv4
Если nslookup работает, но ping не работает на вашем ПК, проблема может быть связана с настройками вашего IP. Чтобы решить эту проблему, рекомендуется внести пару изменений в настройки IPv4. Вы можете сделать это, выполнив следующие действия:
-
Нажмите значок сети на панели задач и выберите свою сеть в меню.
- Нажмите Изменить параметры адаптера на правой панели.
- Появится список всех сетевых подключений. Нажмите правой кнопкой мыши свое сетевое подключение и выберите в меню Свойства .
-
Выберите Протокол Интернета версии 4 (TCP/IPv4) из списка и нажмите кнопку Свойства .
- Теперь нажмите кнопку Дополнительно .
-
Перейдите на вкладку DNS и выберите Добавить эти суффиксы DNS (по порядку) . Теперь нажмите кнопку Добавить .
-
Когда появится новое окно, введите . в качестве доменного суффикса и нажмите Добавить . Сохранить изменения.
После этого проблема должна быть решена, и все снова начнет работать.
Решение 7 – Переключиться на Google DNS
Если проблема все еще существует, проблема может быть в вашем DNS. По словам пользователей, если nslookup работает, но ping не работает, проблема может быть связана с DNS, но вы можете решить эту проблему, переключившись на DNS Google. Для этого просто выполните следующие действия:
- Повторите шаги 1 – 4 из предыдущего решения.
-
Выберите Использовать следующие адреса DNS-серверов . Введите 8.8.8.8 в качестве Предпочитаемый и 8.8.4.4 в качестве Альтернативного DNS-сервера . Нажмите ОК , чтобы сохранить изменения.
После этого убедитесь, что проблема все еще существует. Имейте в виду, что переключение на Google DNS может немного замедлить ваше интернет-соединение, так что имейте это в виду.
Решение 8 – Проверьте ваш файл hosts
Если проблема все еще существует, проблема может быть в вашем файле hosts. Если nslookup работает, но ping не работает, возможно, что файл hosts был отредактирован вредоносным ПО или другим приложением, что может привести к возникновению этой и подобных проблем.
Чтобы решить эту проблему, рекомендуется проверить файл hosts и убедиться, что все в порядке. По сути, если вы видите веб-сайт, который вы пытаетесь пропинговать в списке, это означает, что файлы хостов были изменены.
Просто удалите записи, указывающие на веб-сайт, который вы пытаетесь пропинговать, и все готово. Если вы не знаете, как это сделать, вы всегда можете сбросить файл hosts, и это должно решить проблему.
Решение 9 – Отключить IPv6
Если вы не знакомы, есть два типа IP-адресов: IPv4 и IPv6. Последний является более новым стандартом, но если вы не используете IPv6 специально, возможно, вы можете отключить эту функцию.
Как оказалось, несколько пользователей сообщили, что nslookup работает, но ping не работает из-за IPv6, поэтому давайте отключим его и проверим, помогает ли это. Чтобы отключить IPv6, сделайте следующее:
- Выполните шаги 1-3 из Решения 6 .
-
Найдите в списке Интернет-протокол версии 6 (TCP/IPv6) и снимите флажок. Теперь нажмите Применить и ОК , чтобы сохранить изменения.
После отключения IPv6 проверьте, сохраняется ли проблема.
Решение 10. Обновите драйверы
Если nslookup работает, но на вашем компьютере не выполняется ping, возможно, проблема связана с вашими драйверами. Иногда ваши драйверы могут быть устаревшими, и это может привести к этой и многим другим проблемам. Однако вы можете решить эту проблему, просто загрузив последние версии драйверов и установив их.
Для этого вам просто нужно посетить веб-сайт вашего сетевого адаптера и загрузить последние версии драйверов для вашей модели. После того, как вы загрузите и установите последние версии драйверов, проблема должна быть решена.
Если этот метод кажется вам немного сложным, возможно, вам следует рассмотреть возможность использования сторонних инструментов, таких как TweakBit Driver Updater , и обновлять драйверы одним щелчком мыши.
Невозможность пропинговать определенное устройство или IP-адрес может быть проблемой, но мы надеемся, что вы решили эту проблему, используя одно из наших решений.
Сделал свою реализацию traceroute. Ни один маршрутизатор не отвечает на эхо-запрос. Обычный tracert, встроенный в Windows, работает нормально. ping, часть кода которого я взял для tracert, также работает нормально. Убирал setsockopt() — все равно нет ответа, везде превышено время ожидания. Алгоритм использовал следующий: для каждого TTL по очереди посылается 3 ICMP-пакета типа echo request, для каждого ожидается ответ с маршрутизатора. Работа программы оканчивается, когда TTL превышает максимальное число прыжков или когда получено ICMP-сообщение типа echo reply. Просканировал все это при помощи Wireshark — echo request’ы посылаются, ответы time exceeded приходят, но программа считает, что их нет вообще, select() не дожидается (хотя должен бы), ICMP-ответы попросту не принимаются. Что нужно сделать, чтобы все заработало?
Код main()
#include "winsock_error.h"
#include "io_ext.h"
#include <cstdio>
#define SOCK_NUM 3
#pragma comment(lib, "ws2_32.lib")
#pragma warning(disable : 4996)
int main()
{
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_GREEN | FOREGROUND_INTENSITY);
WSADATA filler;
if (WSAStartup(WSA_VERSION, &filler))
{
output_error("Couldn't initialize WSA");
return EXIT_FAILURE;
}
char host_name[MAXGETHOSTSTRUCT];
enter_message("Please enter a host name: ", host_name);
std::cout << std::endl;
LPHOSTENT remote_host_info = gethostbyname(host_name);
if (remote_host_info == NULL)
{
output_error("Couldn't get a host info");
finalize();
return EXIT_FAILURE;
}
if (remote_host_info->h_addrtype == AF_INET6)
{
output_error("Sorry, but R-Scan can't perform scanning of ipv6-hosts");
finalize();
return EXIT_SUCCESS;
}
//ALIASES SHOWING
if (remote_host_info->h_aliases[0])
{
std::cout << "Server name aliases: " << std::endl;
for (int i = 0; remote_host_info->h_aliases[i]; i++)
std::cout << remote_host_info->h_aliases[i] << std::endl;
std::cout << std::endl;
}
else
std::cout << "Host has no aliases" << std::endl << std::endl;
in_addr tmp;
//ADDRESSES SHOWING
if (remote_host_info->h_addr_list[1])
{
std::cout << "Server addresses: " << std::endl;
for (int i = 0; remote_host_info->h_addr_list[i]; i++)
{
tmp.s_addr = *(LPWORD)remote_host_info->h_addr_list[i];
std::cout << inet_ntoa(tmp) << std::endl;
}
std::cout << std::endl;
}
else
{
std::cout << "Server address: ";
tmp.s_addr = *(u_long*)remote_host_info->h_addr;
std::cout << inet_ntoa(tmp) << std::endl << std::endl;
}
WORD temp;
BYTE max_hops_num;
//MAX HOPS NUM INPUT
while (true)
{
std::cout << "Please enter max number of hops: ";
(std::cin >> temp).get();
if (!std::cin || temp > TTL_MAX_VAL || temp == 0)
{
clear_istream(std::cin);
std::cerr << "You entered wrong value; try again" << std::endl << std::endl;
}
else
break;
}
__asm //firstly value is assigned to 16 bit temporary variable, then left octet of temporary variable is assigned to max_hops_num variable
{
mov ax, temp
mov max_hops_num, al
}
fd_set read;
SOCKET sock = ICMP_SOCKET;
sockaddr_in server_data;
ECHO_REQUEST echo_req;
ECHO_REPLY echo_rep;
timeval wait_time = { 2, 0 };
//CONNECTION DATA FILLING
server_data.sin_family = AF_INET;
server_data.sin_port = 0;
tmp.s_addr = *(LPWORD)&remote_host_info->h_addr;
inet_pton(AF_INET, (PCSTR)inet_ntoa(tmp), &server_data.sin_addr);
//ICMP HDR AND ECHO_REQUEST STRUCT FILLING
echo_req.icmp_hdr.type = ICMP_ECHO_REQ;
echo_req.icmp_hdr.code = 0;
echo_req.icmp_hdr.id = 1;
echo_req.icmp_hdr.seq = 0;
echo_req.icmp_hdr.checksum = 0;
echo_req.dw_time = GetTickCount();
memset(echo_req.data, ECHO_FILLER, PACK_FRAME_SIZE);
echo_req.icmp_hdr.checksum = checksum((LPWORD)&echo_req, sizeof(echo_req));
//TRACERT LOOP
for (BYTE TTL = 1; TTL <= max_hops_num; TTL++)
{
tmp.s_addr = 0;
printf("%3dt", TTL);
//set TTL
if (setsockopt(sock, IPPROTO_IP, IP_TTL, (PCSTR)&TTL, sizeof(TTL)) == SOCKET_ERROR)
{
error_to_close_socket("Couldn't set IP header TTL", sock);
finalize();
return EXIT_FAILURE;
}
//send 3 ICMP echo requests
RANGE(0, SOCK_NUM)
{
echo_req.dw_time = GetTickCount();
echo_req.icmp_hdr.checksum = checksum((LPWORD)&echo_req, sizeof(echo_req));
if (sendto(sock, (LPSTR)&echo_req, sizeof(echo_req), 0, (LPSOCKADDR)&server_data, sizeof(server_data)) == SOCKET_ERROR)
{
error_to_close_socket("Couldn't perform a ping", sock);
finalize();
return EXIT_FAILURE;
}
FD_ZERO(&read);
FD_SET(sock, &read);
int ret = select(0, &read, NULL, NULL, &wait_time);
if (ret == SOCKET_ERROR)
{
error_to_close_socket("Couldn't perform data awaiting", sock);
finalize();
return EXIT_FAILURE;
}
else if (ret == 0)
{
std::cout << " * t";
}
else
{
if (recvfrom(sock, (LPSTR)&echo_rep, sizeof(ECHO_REPLY), 0, NULL, NULL) == SOCKET_ERROR)
{
error_to_close_socket("Couldn't receive ICMP", sock);
finalize();
return EXIT_FAILURE;
}
printf("%4d mst", GetTickCount() - echo_rep.echo_request.dw_time);
tmp = echo_rep.ip_hdr.src_addr;
}
}
if (tmp.s_addr == 0)
{
std::cout << "Waiting time exceeded" << std::endl;
continue;
}
remote_host_info = gethostbyaddr((PCSTR)&echo_rep.ip_hdr.src_addr, AF_INET_ADDR_LEN, AF_INET);
if (remote_host_info == NULL)
std::cout << inet_ntoa(echo_rep.ip_hdr.src_addr) << std::endl;
else
printf("%s [%s]", remote_host_info->h_name, inet_ntoa(echo_rep.ip_hdr.src_addr));
if (echo_rep.echo_request.icmp_hdr.type == 0 && echo_rep.echo_request.icmp_hdr.code == 0)
break;
}
}
Заголовочный файл
#pragma once
#ifndef WINSOCK_ERROR
#define WINSOCK_ERROR
#include <WinSock2.h>
#include <Windows.h>
#include <iostream>
#include <cstdlib>
#include <vector>
#include <cstring>
#include <ctime>
#include <WS2tcpip.h>
#define ECHO_PORT 32768
#define WSA_VERSION 0x0202
#define LOCALHOST "127.0.0.1"
#define BUFF_SIZE 8192
#define BACKLOG 4
#define WAIT_TIME 1
#define INPUT_BUFF 16
#define PACK_FRAME_SIZE 64
#define REPLY_DATA_SIZE 0x100
#define TTL_MAX_VAL 0xFF
#define ICMP_ECHO_REQ 8
#define ECHO_FILLER 87
#define EVERLAST_HOPS_PARAM 0
#define AF_INET_ADDR_LEN 4
#define TCP_SOCKET socket(AF_INET,SOCK_STREAM,IPPROTO_TCP)
#define UDP_SOCKET socket(AF_INET,SOCK_DGRAM,IPPROTO_UDP)
#define ICMP_SOCKET socket(AF_INET,SOCK_RAW,IPPROTO_ICMP)
namespace con_mode
{
enum mode
{
write, //socket condition for sending data
read, //socket condition for receiving data
input, //socket condition for entering data by user
timeout //socket condition for inactivity
};
}
typedef struct ICMP_hdr //ICMP header representation
{
BYTE type;
BYTE code;
WORD checksum;
WORD id;
WORD seq;
} ICMP_HDR;
typedef struct echo_request //packet that will be sent through the network
{
ICMP_HDR icmp_hdr;
DWORD dw_time;
char data[PACK_FRAME_SIZE];
} ECHO_REQUEST;
typedef struct ip_hdr
{
BYTE ver_ihl; //4 bit for version, 4 bit for internet header length (in DWORDs)
BYTE dscp_ecn; //DiffServ: 6 bit for dscp (packet priority or ToS) and 2 bit ECN (congestion flag); if congestion exists, transmission rate reduces
WORD tot_len; //length of header + data, 16 bit field
WORD id; //for packet fragments identifying (if a packet was fragmented)
WORD flag_off; //flags of fragmentation and fragment offset; 1st bit - reserved; 2nd bit - if set, packet won't be fragmented if it need and will be dropped;
//3rd bit - set for all fragmented packets; fragment offset - 13 bit field, defines a fragment offset relative to the beginnig of original IP datagram; measured in 64 bit blocks
BYTE TTL; //time-to-live, 8 bit field; measured determined bu the number of gateways and hosts packet can traverse
BYTE protocol; //8 bit field; protocol list: https://en.wikipedia.org/wiki/List_of_IP_protocol_numbers
WORD checksum; //16 bit field; if it hasn't been computed yet, it must be equal to 0
in_addr src_addr; //32 bit sender IP address
in_addr dst_addr; //32 bit receiver IP address
} IP_HDR;
typedef struct echo_reply //ICMP echo response from server
{
IP_HDR ip_hdr;
ECHO_REQUEST echo_request;
char c_filler[REPLY_DATA_SIZE];
} ECHO_REPLY;
inline USHORT checksum(USHORT *buffer, int size)
{
unsigned long cksum = 0;
while (size > 1)
{
cksum += *buffer++;
size -= sizeof(USHORT);
}
if (size)
{
cksum += *(UCHAR*)buffer;
}
cksum = (cksum >> 16) + (cksum & 0xffff);
cksum += (cksum >> 16);
return (USHORT)(~cksum);
}
inline void output_error(const char* message)
{
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_RED | FOREGROUND_INTENSITY);
std::cerr << message << std::endl;
std::cerr << "Error code: " << WSAGetLastError() << std::endl;
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_GREEN | FOREGROUND_INTENSITY);
}
inline void finalize()
{
WSACleanup();
system("pause");
}
inline void close_socket(SOCKET sock)
{
if (closesocket(sock) == SOCKET_ERROR)
{
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_RED | FOREGROUND_INTENSITY);
std::cerr << "Couldn't close socket: error " << WSAGetLastError() << std::endl;
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_GREEN | FOREGROUND_INTENSITY);
}
}
inline void error_to_close_socket(const char* message, SOCKET sock)
{
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_RED | FOREGROUND_INTENSITY);
output_error(message);
close_socket(sock);
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_GREEN | FOREGROUND_INTENSITY);
}
#endif
Скриншот сниффера: