Лекция №14
Разработка программы Ping
Ріng часто используют, чтобы определить, есть ли конкретный узел действующим и доступным по сети. Создав эхо-запрос ІСМР и направив его на интересующий узел, можно определить, доступный ли этот узел. Конечно, присутствие узла не гарантирует пользователю сокета возможность соединиться с процессом на этом узле (поскольку, например, процесс быть не налажен для соединения). Но это означает, что сетевой уровень узла реагирует на сетевые события. Ріng выполняет следующие шаги.
1. Создает сокет типа SOCK_RAW под протокол ІРРRОTОІСМР.
2. Создает и инициализирует заголовок ІСМР.
3. Вызовет sendto ли WSASENDTO, чтобы отправить запрос ІСМР на выбранный узел.
4. Вызовет recvfrom ли WSARECVFROM для приема любых Ісмр-откликов.
Когда отправляется эхо-запрос ІСМР, выбранный компьютер перерывает его и создает сообщения эха-ответа. Если по некоторой причине узел не доступный, что отвечает Ісмр-сообщениям об ошибке (например, "узел адресату не доступный") будет возвращен маршрутизатором где-нибудь на пути к месту назначения. Если физически сетевое соединение с узлом имеется, но выбранный узел временно не доступнен или не реагирует на сетевые события то возникает необходимость учета некоторого временного интервала, на протяжении которого может состояться реакция узла.
Для того, чтобы исправить недостатки стандартных реализаций Ping с измерением времени (недостаточная точность) можно использовать внутренний счетчик тактов, который есть во всех процессорах Pentium Pro и более поздних. Эта операция выполняется функцией RDTSC, которая возвращает 4битное значение счетчика. Зная тактовую частоту процессоруа можно легко определить время, которое прошло между двумя вызовами RDTSC с точностью до времени процессорного такта. Тактовую частоту процессора можно определить с помощью обычного системного таймера ОС, выполнив опрос счетчика до и после некоторого отрезка времени большего за 2 мс.
Разработка программы TraceRoute
Это еще один удобный сетевой инструмент, который разрешает определять Ір-адреса маршрутизаторов, которые пройдены запросом на пути к определенному узлу. Ріng также разрешает определить Ір-адреса маршрутизаторов, используя параметр записи маршрута в расширенном заголовке ІР, однако его возможности ограничены всего девятью транзитами - максимальным пространством, предназначенным для адреса в расширенном заголовке. Транзит происходит всякий раз, когда Ір-дейтаграмма проходит маршрутизатор для перехода в другую физическую сеть. Для маршрутов с более чем девятью такими переходами используется Traceroute.
В основе Traceroute лежит идея отправления UDP-пакета адресату и постепенному изменению его времени жизнь (tіme-to-lіve, TTL). Сначала TTL-пакета равняется 1, и когда пакет достигает первого маршрутизатора, его ТTL сбрасывается, и маршрутизатор генерирует Ісмр-пакет со сведениями превышения лимита времени. Тогда начальное значение TTL увеличивают на 1, так что на этот раз UDP-пакет достигает следующего маршрутизатора тот тоже отсылает ІCMP-пакет по превышению лимита времени. Совокупность этих Ісмр-сообщений дает список Ір-адресов, пройденных на пути к конечному узлу. Когда TTL увеличится настолько, что UDP-пакет достигнет конечного узла, возвращается ІCMP-сообщение о недосягаемости порта, поскольку на получателе ни один процесс не ждет ваши сообщения.
Traceroute полезна тем, что дает подробнейшую информацию о маршруте к конкретному узлу - это часто необходимо при многоадресной передаче или проблемах с маршрутизацией.
Существует два способа выполнить программу Traceroute. Во-первых, можно использовать UDP-пакеты и отправлять дейтаграммы, постепенно изменяя TTL. Каждый раз после окончания TTL будет возвращаться Ісмр-сообщение. Этот метод требует наличия обычного сокета протокола UDP для отправления сообщения, а также сокета типа SOCK_RAW под протокол IPPROTO_ICMP для чтения возвращенных сообщений. TTL для UDP-сокета можно контролировать через параметр IP_HDRINCL чтобы вручную задать TTL в заголовке IP, но это довольно трудоемкая задача.
Второй метод – просто отсылать ICMP-сообщение адресату с постоянным уменьшением TTL. Результаты также возвращаются ICMP-сообщениями об ошибке по завершению TTL. Такой вариант требует только один сокет. Этот вариант более удобный.
Разработка программы IPStat
Эта утилита выводит информацию о таблице TCP-соединений, таблицу портов UDP, которые прослушиваются, а также статистику протокола ІP для данного компьютера. Функции для получения этой информации работают не только в Wіndоws 98 и Wіndоws 2000, но также в Wіndоws NT 4 с Sеrvісе Pack 4 и следующих версиях.
Получениt таблицы TCP-соединений
Чтобы получить эти данные программно, воспользуйтесь функцией GetTcpTable:
DWORD GetTcpTable(
РМІ.TCPTABLE pTcpTable.
PDWORD рdwSіzе,
BOOL border );
Параметр pTcpTable - указатель на буфер РМІ _TCPTABLE, в которого будет помещенная информация о TCP-соединение. Параметр рdwSіzе - указатель на переменную, что задает размер этого буфера. Если размера буфера недостаточно, функция передаст в этом параметре необходимый размер. Параметр bOrder указывает, нужно ли сортировать информацию.
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.