Pull to refresh

Верхом на… сетевом пакете

Reading time4 min
Views5.9K
Я задумался над вопросом: сколько стран предстоит пройти одному сетевому пакету с момента ввода в браузер habrahabr.ru и до приветливого мигания диода на Том Самом Сервере.

image


Начался путь с беспроводного роутера, в моей прихожей. Потом — укртелекомовский сервак (он скрытым пожелал остаться). Затем, минуя Будапешт, направился пакетик в Штаты. Петлял недолго там, и залетев в Германию и Лондон, осел в России где-то.

О том, как это работает и ссылки на исходники/демо читайте под катом.


Ответом на вопрос стала комбинация из трех вещей: Tracert, сервис ipinfodb.com и Silverlight. Остановимся на них подробнее.

Tracert

Tracert (traceroute) — это утилита, показывающая путь пакета до указанного сервиса. Вот как выглядит результат ее выполнения:
C:\Users\anvaka>tracert -d habrahabr.ru

Tracing route to habrahabr.ru [178.248.233.33]
over a maximum of 30 hops:

1 2 ms 2 ms 2 ms 192.168.1.1
2 * * * Request timed out.
3 140 ms 139 ms 142 ms 10.50.19.2
4 155 ms 157 ms 154 ms 212.162.26.1
5 175 ms 170 ms 167 ms 4.69.141.250
6 186 ms 177 ms 179 ms 4.69.140.6
7 177 ms 171 ms 168 ms 4.68.23.75
8 83 ms 83 ms 81 ms 212.162.40.142
9 91 ms 92 ms 91 ms 91.194.117.130
10 180 ms 181 ms 182 ms 178.248.233.33


Суть ее работы проста. Программа шлет серию ICMP пакетов (тот же ping) целевому хосту (habrahabr.ru), каждый раз увеличивая TTL (time to live) пакета на единичку. Промежуточный сервер, пропуская пакет через себя, уменьшает этот параметр на единицу. В случае достижения TTL нуля, сервер отвечает отправителю, что время жизни пакета, увы, завершено. Тут-то tracert и записывает, кто прислал печальнорадостное известие.

В примере выше, tracert посылает первую серию из трех пакетов, с TTL равным единице. Мой роутер в прихожей, сразу же отвечает: «время жизни пакета истекло». Запомнили и шлем вторую серию пакетов. Теперь TTL равно двум. Мой роутер разрешает пакетам идти дальше, однако следующий роутер должен завернуть нас обратно. Так продолжается до тех пор, пока мы не достигнем целевого хоста.

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

IPInfoDB

Сам по себе вывод программы tracert служит неплохим подспорьем при диагностике проблем в сети. Однако из него вы не сможете узнать географическое положение промежуточных серверов. Насколько мне известно, не существует единого централизованного хранилища с подобной информацией (кроме, возможно, баз данных ФБР. Но на wikileaks еще не выкладывали). Из бесплатных сервисов, с открытым API, мне очень понравился ipinfodb.com. По RESTу можно передать интересующий IP адрес и, зачастую, получить его геопоозицию. Конечно, для зарезервированных адресов (192.168.x.x, и т.д) ваше местоположение будет где-то в Атлантическом океане — именно там, должно быть, находится центр Земли.

Silverlight

Silverlight — это платформа от Microsoft, за которую тут минусуют которую вот-вот заменит HTML 5. Шутка. Silverlight будет еще долго на рынке и будет ярко (TODO себе: перечитать этот пост через пару лет). Это тема отдельного холивара и, все равно я их обоих люблю :)

На Silverlight'e я подружил tracert и IPInfoDB. Конечно, вы не в праве запускать программы/слать пакеты прямо из браузера. Приложению необходим повышенный уровень доверия, для подобных операций. Поэтому, оно работает только вне браузера.

Чтобы запустить tracert я использую COM Automation. И это, увы, означает, что макопользователи остаются с нерабочим приложением. Через COM создается объект WScript.Shell, и выполняется команда tracert. К сожалению, скриптовик из меня никудышный: я так и не нашел способ не показывать консольное окно, одновременно получая stdout.

По ходу получения нового вывода от tracert'a, приложение асинхронно шлет запросы к IPInfoDB с просьбой предоставить геоданные. Как только данные получены — добавляется новый маркер на Bing Maps:

image

С точки зрения кода (ссылка ниже), основной процесс взаимодействия выглядит так:
image

Ссылки

  • Исходный код программы можно скачать здесь. Можете использовать его для любых целей. Для компиляции вам понадобится Bing Maps Silverlight Control. Буду признателен, если дадите знать, что думаете.
  • Демо версия сайта доступна здесь. После выполнения трассировки — наведите мышкой на индикатор места пакета, чтобы получить имя положения. Проверял работоспособность под Windows 7 (Eng), и Windows Vista (Rus). Как упоминалось выше, программа требует установки на рабочий стол.


Вместо заключения

Стоит отметить, что программа не является абсолютно надежным показателем маршрута пакета. Сам маршрут может меняться несколько раз во время взаимодействия клиента/сервера. База данных IPInfoDВ не гарантирует достоверность своих данных. Ну и сама программа сыровата: писал ради забавы, а не production кода.

Ну, хорошо, показал страны/города по маршруту, ну мне-то что от этого? — Знаете, когда работаешь над визуализацией данных, часто не подозреваешь, к какому вопросу придешь. Т.е. визуализация не учит правильному ответу. Скорее, она помогает найти правильные вопросы, о которых раньше не задумывался. Я не знаю, какие вопросы появятся у вас, и какие ответы вы найдете. Но искренне надеюсь, что вам понравилось время, проведенное здесь.

ЗЫЖ Кстати, когда вы будете оценивать статью, подумайте не только о том, как пойдут пакеты по Сети, но и о том, как они повлияют на настроение автора :)
Tags:
Hubs:
Total votes 107: ↑81 and ↓26+55
Comments31

Articles