headermask image



Рассмотрим работу утилиты ping

Ping – стандартная Internet-программа, которую большинство из нас использует ежедневно. Но вас интересовало, как она работает? Не знаю, как вы, а я начинаю беспокоиться, если не знаю, как на самом деле что-то работает. Назначение этой статьи – решить все затянувшиеся вопросы и поднять ваше понимание на новый уровень. Даже если вы не программист, не пугайтесь! Поверьте, я не собираюсь вам рассказывать, как написать собственную версию ping.

Думаю, вы знаете, по существу, как работает утилита TCP/IP ping. Она посылает ICMP (Internet Control Message Protocol) эхо-запрос на указанный интерфейс в сети и в ответ ожидает получения ICMP эхо-отклика. Таким образом, программа может проверить способность к подключению, измерить время отклика и вывести отчет на наличие проблем.

ICMP – это программный компонент межсетевого взаимодействия TCP/IP; по существу, это компаньон IP (Internet Protocol) на этом уровне. Фактически, ICMP полагается на IP-протокол для перемещения по сети. Если вы наблюдаете данный вид сетевого трафика, скажем, в сети Ethernet, то ваш анализатор протокола зафиксирует блок данных Ethernet, переносящий дейтаграмму IP с сообщением ICMP внутри.

Вникните в проблему: программа ping выполняется на уровне приложений. Так как же она заставляет ICMP проделывать такие фокусы? Может вы вспомните, если раньше изучали TCP/IP, что уровень хост-хост заключен между этими объектами? Обходится ли он? Если да, то как именно? Кто ответственен за форматирование этих сообщений (эхо-запроса и эхо-отклика)?

Когда на эхо–запрос возникают ответы ICMP, отличные от обычного эхо-отклика, как они попадают в программу ping? Последний вопрос может показаться очевидным, но это не так. ICMP-сообщения не содержат адресной информации, позволяющей стеку протокола TCP/IP разглядеть программу, которая получает сообщение. TCP и UDP для этой цели используют номера портов. Так как это работает?

Общая информация

Стек протокола TCP/IP образуется четырехуровневой моделью (см. Рис. 1). Самый нижний уровень, обычно называемый сетевым интерфейсом или уровнем сетевого доступа, аналогичен уровням 1 и 2 модели OSI, физическому и канальному. Он включает носитель данных, соединения, передачу сигналов, физическую адресацию и управление общим доступом к носителю данных. Для большинства из нас это означает Ethernet и кабельную систему.

14120704.png

Уровень, стоящий над уровнем сетевого доступа, уровень межсетевого взаимодействия, больше всего похож на уровень 3 модели OSI, сетевой уровень. Здесь присутствуют логическая адресация и маршрутизация: то, что способствует коммуникации через границы сетей. Вот здесь и используются IP-протокол и его механизмы, как и ICMP.

ICMP – необходимый компонент любой реализации TCP/IP. Для поставки информации более высокоуровневым протоколам (TCP или UDP), чтобы сделать их надежней, он не используется. Скорее, возможности диагностики сети и обратной связи для тех, кто ответственен за администрирование и работу, предостаявляет ICMP. Посмотрите RFC 792, если вас это действительно заинтересовало.

Над уровнем сетевого доступа находится уровень хост-хост, копирующий уровень 4 модели OSI, транспортный. Мне кажется, он также частично включает в себя часть функций уровня 5, сеансового. Вот где мы можем найти возможности для обмена данными из конца в конец, дополнительную проверку на ошибки и средства для отличения одной программы от другой (используя номера портов). TCP и UDP находятся на этом уровне.

На вершине стека находится прикладной уровень, и здесь мы можем найти реализацию протоколов высокого уровня (таких как SMTP, HTTP и FTP). Здесь также выполняются приложения. Так, что когда вы «пингуете», программа ping должна быть воспринята для функционирования на этом уровне.

Небольшая загадка

Kак мы можем обойти уровень хост-хост, имея ICMP, работающий на межсетевом уровне взаимодействия и программу ping на прикладном? Ответ лежит в понимании того, что мы знаем о raw-сокетах. “Ну а что такое сокет?”,-спросят новички. Теоретически, сокет – конечная точка соединения, которая обычно состоит из IP-адреса и номера порта, идентифицирующих определенные хост и программу. Но программист немного по-другому смотрит на сокет. Для него «сокет» – системная функция, распределяющая ресурсы, благодаря которым программа может взаимодействовать с лежащим под ней стеком протокола TCP/IP. Адресная информация ассоциируется с ним только после того, как сделан вызов сокета (для тех, кто хочет знать, это роль «связывающей» функции»). Так что, заметьте, возможно назначить сокет и незаметно ассоциировать адресную информацию с ним.

Есть три часто встречающихся вида сокетов: stream, datagram, и raw. TCP использует тип stream, а UDP – тип datagram. Raw-сокеты используются любым приложением, если ему необходимо взаимодействовать непосредственно с IP, минуя TCP и UDP. Потребители включают в себя реализации протокола маршрутизации, такие как routed и gated (включающие RIP и OSPF). Здесь же находится и наш друг ping.

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

Что же происходит на самом деле?

Когда начинается выполнение программы ping, она открывает raw-сокет, чувствительный только к ICMP. Это означает две вещи:

  • На выходе: посылка эхо запросов ICMP, нужна программа, чтобы форматировать сообщение ICMP. Система предоставит заголовок IP и заголовок Ethernet (обычно).
  • На входе: программа должна проверить все входящие сообщения ICMP и выбрать нужные. Ожидаемый вход – ICMP эхо-отклики.

Давайте посмотрим на это с другой стороны.

На противоположной стороне эхо-запросы форматируются способом, показанным на рисунке 2. Тип сообщения всегда кодируется цифрой восемь (8). Поле кода всегда содержит ноль. Контрольная сумма используется для нахождения ошибок. В ее подсчет включаются заголовок сообщения ICMP и его данные. Программа ping выполняет эти подсчеты и заполняет пустоты. Затем идет поле идентификации, содержащее ID (PID) процесса, который идентифицирует выполнение программы ping для операционной системы. Для систем Windows, это поле содержит постоянное значение 256. Следующим идет поле последовательного номера, значение которого начинается с 0 и увеличивается на 1 при каждом отосланном эхо-запросе. После этих необходимых полей следуют необязательные тестовые данные. В реализации ping, которую я тестировал (Slackware Linux), это была временная отметка, используемая в расчете полного времени при получении эхо-отклика.

14120704_02.png

Что касается прибывающих ICMP-сообщений, то задача ping немного усложняется. Так как ping использует raw-сокет ICMP, то программе предоставляются копии всех входящих ICMP-сообщений, кроме особых случаев, когда входящие эхо-запросы формируются другими людьми, «пингующими» нас (последние контролируются системой). Это означает, что ping видит не только ожидаемые эхо-отклики, когда они приходят, но также и такие сообщения, как “Получатель недоступен” (Destination Unreachable), “Источник остановлен” (Source Quench), и “Время ожидания превышено” (Time Exceeded). (На рисунке 3 показаны сообщения ICMP всех типов.)

14120704_03.png

Задумайтесь над этим на минуту. Если у вас одновременно выполняются две копии программы ping, то каждая из них будет эхо-отклики другой и другие неприятные сообщения (nastygram)
Каждая копия программы должна идентифицировать сообщения, значимые для нее. Кто думает, что для этого используется поле PID (идентификации), тот абсолютно прав.
А как программа ping справляется с этим в Windows, если у нее нет PID? Вы меня поймали. Звучит как тема для будущей статьи. К этому вопросу мы еще вернемся.

Интересно, что сообщения, входящие в ping, остаются с нетронутым IP-заголовком. Таким образом, программа имеет доступ к таким важным параметрам, как “время жизни” (TTL) и “рассчитанное время возврата” (если такая опция включена).

Заключение

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

Повторим основные моменты:

  • При инициализации программы ping, она открывает raw-сокет ICMP и может напрямую обращаться к IP, минуя TCP и UDP.
  • Ping форматирует ICMP-сообщение типа 8, эхо-запрос и посылает его (используя функцию «sendto») на желаемый адрес назначения. Система предоставляет IP-заголовок и конверт (envelope) канального уровня.
  • При получении ICMP-сообщений, у ping есть возможность проверить каждый пакет и выбрать нужное
  • Обычное поведение – брать ICMP-сообщения типа 0, эхо-отклики, у которых значение поля идентификатора совпадает с PID программы.
  • Ping использует временную метку в области данных эхо-отклика чтобы вычислить полное (туда-обратно) время. Он также сообщает о времени жизни TTL из IP-заголовка отклика.
  • Когда что-то идет не так, ping может сообщать о ICMP-сообщениях других типов, появляющихся на входе. Такие сообщения включают в себя “Получатель недоступен” (Destination Unreachable) и “Время ожидания превышено” (Time Exceeded).

Источник: www.winblog.ru

Комментарии

Your email is never published nor shared. Required fields are marked *

*
*