Лекции.Орг


Поиск:




Получение первоначальной информации с помощью специальной программы

Специальную программу необходимо использовать, если необходимо провести сбор информации у большого количества IP-адресов, когда нет возможности провести этот сбор вручную.

Получение информации с помощью специальной программы:

1. По порядку братьIP-адреса из диапазона;

2. Для каждого из IP-адресов определить доступность и servername, с которым ассоциируется данныйIP-адрес;

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

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

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

Обратный вызов или callback в программировании — передача исполняемого кода в качестве одного из параметров другого кода. Обратный вызов позволяет в функции исполнять код, который задаётся в аргументах при её вызове. Этот код может быть определён в других контекстах программного кода и быть недоступным для прямого вызова из этой функции.

Многопоточность — свойство платформы (например, операционной системы, виртуальной машины и т. д.) или приложения, состоящее в том, что процесс, порождённый в операционной системе, может состоять из нескольких потоков, выполняющихся «параллельно», то есть без предписанного порядка во времени. При выполнении некоторых задач такое разделение может достичь более эффективного использования ресурсов вычислительной машины.

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

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

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

Взаимоисключения — это объект синхронизации, который устанавливается в особое сигнальное состояние, когда не занят каким-либо потоком. Только один поток владеет этим объектом в любой момент времени, отсюда и название таких объектов (от английского mutuallyexclusiveaccess — взаимно исключающий доступ) — одновременный доступ к общему ресурсу исключается. После всех необходимых действий мьютекс освобождается, предоставляя другим потокам доступ к общему ресурсу. Объект может поддерживать рекурсивный захват второй раз тем же потоком, увеличивая счетчик, не блокируя поток, и требуя потом многократного освобождения. Такова, например, критическая секция в Win32. Тем не менее, есть и такие реализации, которые не поддерживают такое и приводят к взаимной блокировке потока при попытке рекурсивного захвата. Это FAST_MUTEX в ядре Windows.

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

События. Объект, хранящий в себе 1 бит информации «просигнализирован или нет», над которым определены операции «просигнализировать», «сбросить в непросигнализированное состояние» и «ожидать». Ожидание на просигнализированном событии есть отсутствие операции с немедленным продолжением исполнения потока. Ожидание на непросигнализированном событии приводит к приостановке исполнения потока до тех пор, пока другой поток (или же вторая фаза обработчика прерывания в ядре ОС) не просигнализирует событие. Возможно ожидание нескольких событий в режимах «любого» или «всех». Возможно также создание события, автоматически сбрасываемого в непросигнализированное состояние после пробуждения первого же — и единственного — ожидающего потока (такой объект используется как основа для реализации объекта «критическая секция»). Активно используются в MS Windows, как в режиме пользователя, так и в режиме ядра. Аналогичный объект имеется и в ядре Linux под названием kwait_queue.

Критические секции обеспечивают синхронизацию подобно мьютексам, за исключением того, что объекты, представляющие критические секции, доступны в пределах одного процесса. События, мьютексы и семафоры также можно использовать в однопроцессном приложении, однако реализации критических секций в некоторых ОС (например, Windows NT) обеспечивают более быстрый и более эффективный[1][2] механизм взаимно-исключающей синхронизации — операции «получить» и «освободить» на критической секции оптимизированы для случая единственного потока (отсутствия конкуренции) с целью избежать любых ведущих в ядро ОС системных вызовов. Подобно мьютексам объект, представляющий критическую секцию, может использоваться только одним потоком в данный момент времени, что делает их крайне полезными при разграничении доступа к общим ресурсам.

К достоинствам многопоточности в программировании можно отнести следующее:

Упрощение программы в некоторых случаях за счёт использования общего адресного пространства.

Меньшие относительно процесса временны́е затраты на создание потока.

Повышение производительности процесса за счёт распараллеливания процессорных вычислений и операций ввода-вывода.

Технологии, которые  позволяют работать с сетью:

Технология.NET

По мере развития .NET Framework было много нововведений и подходов для запуска асинхронных операций. Первым решением для асинхронных задач стал подход под названием APM (AsynchronousProgrammingModel). Он основан на асинхронных делегатах, которые используют пару методов с именами BeginOperationName и EndOperationName, которые соответственно начинают и завершают асинхронную операцию OperationName. После вызова метода BeginOperationName приложение может продолжить выполнение инструкций в вызывающем потоке, пока асинхронная операция выполняется в другом. Для каждого вызова метода BeginOperationName в приложении также должен присутствовать вызов метода EndOperationName, чтобы получить результаты операции.

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

В версии 2.0 была введена новая модель под названием EAP (Event-basedAsynchronousPattern). Класс, поддерживающий асинхронную модель, основанную на событиях, будет содержать один или несколько методов MethodNameAsync. Он может отражать синхронные версии, которые выполняют то же действие с текущим потоком. Также в этом классе может содержаться событие MethodNameCompleted и метод MethodNameAsyncCancel (или просто CancelAsync) для отмены операции. Данный подход распространен при работе с сервисами. В Silverlight применяется для обращения к серверной части, а Ajax по сути представляет из себя реализацию данного подхода. Стоит опасаться длинных цепочек связанных вызовов событий, когда по завершении одной долгосрочной операции в событии ее завершения вызывается следующая, потом еще следующая и так далее. Это чревато дэдлоками и непредвиденными результатами. Обработка исключений и результаты асинхронной операции доступны только в обработчике события посредством соответствующих свойств параметра: Error и Result.

В .NET Framework 4.0 была введена усовершенствованная модель под названием TAP (Task-basedAsynchronousModel), которая основана на задачах. Данная реализация асинхронной модели базируется на типах Task и TaskSystem.Threading.Tasks, которые используются для предоставления произвольных асинхронных операций. TAP — это рекомендуемый асинхронный шаблон для разработки новых компонентов. Очень важно понимать разницу между потоком (Thread) и задачей (Task), которые сильно отличаются. Thread (поток) представляет собой инкапсуляцию потока выполнения, в то время как Task является работой (или просто асинхронной операцией), которая может быть выполнена параллельно. Для выполнения задачи используется свободный поток из пула потоков. По завершении работы поток будет возвращен обратно в пул, а пользователь класса получит результат задачи. Если вам нужно запустить длительную операцию, и вы не хотите надолго блокировать один из потоков пула, то можете это сделать при помощи параметра TaskCreationOptions.LongRunning. Создавать и запускать задачи можно разными способами, и часто непонятно, какой из них выбрать. Разница, в основном, лишь в удобстве использования и количестве параметров с настройками, которые доступны в том или ином способе.

В последних версиях фреймворка появились новые возможности на основе все тех же задач, которые упрощают написание асинхронного кода и делают его более читабельным и понятным. Для этого введены новые ключевые слова async и await, которыми помечаются асинхронные методы и их вызовы. Асинхронный код становится очень похожим на синхронный: мы просто вызываем нужную операцию и весь код, который следует за ее вызовом, автоматически будет завернут в некий «колбек», который вызовется после завершения асинхронной операции. Также данный подход позволяет обрабатывать исключения в синхронной манере; явно дожидаться завершения операции; определять действия, которые должны быть выполнены, и соответствующие условия. Например, мы можем добавить код, который будет выполнен только в том случае, если в асинхронной операции было сгенерировано исключение.

Основной функционал для использования потоков в приложении сосредоточен в пространстве имен System.Threading. В нем определен класс, представляющий отдельный поток - класс Thread.

Используя класс Thread, мы можем выделить в приложении несколько потоков, которые будут выполняться одновременно.

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

 

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

Существует еще одна форма создания потока: ThreadmyThread = newThread(Count);

Хотя в данном случае явным образом мы не используем делегат ThreadStart, но неявно он создается. Компилятор C# выводит делегат из сигнатуры метода Count и вызывает соответствующий конструктор. В данном случае мы создаем потоки не в пуле потоков.

Для создания потоков в фоне необходимо использовать класс ThreadPool.

Класс ThreadPool обеспечивает приложение пулом рабочих потоков, управляемых системой, позволяя пользователю сосредоточиться на выполнении задач приложения, а не на управлении потоками. Если имеются небольшие задачи, которые требуют фоновой обработки, пул управляемых потоков — это самый простой способ воспользоваться преимуществами нескольких потоков. Например, начиная с версии.NET Framework 4 можно создавать объекты Task и Task<TResult>, выполняющие асинхронные задачи в потоках из пула потоков.

Для фоновых задач, взаимодействующих с пользовательским интерфейсом, платформа.NET Framework версии 2.0 также предоставляет класс BackgroundWorker, который работает с помощью событий, возникающих в потоке пользовательского интерфейса.

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

Существует несколько сценариев, в которых правильнее создать и управлять собственным потоком вместо использования потока из пула.

· Необходим основной поток.

· Поток должен иметь определенный приоритет.

· Имеются задачи, которые приводят к блокировке потока на длительное время. Для пула потоков определено максимальное количество потоков, поэтому большое число заблокированных потоков в пуле может препятствовать запуску задач.

· Необходимо поместить потоки в однопотоковое подразделение. Все потоки ThreadPool находятся в многопоточном апартаменте.

· Необходимо иметь постоянное удостоверение, сопоставленное с потоком, или назначить поток задаче.

Пространство имен System.Net предоставляет простой программный интерфейсдля многих протоколов, используемых в современных сетях. Пространствоимен System.Net.Networklnformation обеспечивает доступ к данным о сетевомтрафике, сетевым адресам и уведомлениям об изменении адресов локальногокомпьютера. Это пространство имен также содержит классы, реализующиефункциональность программы Ping: Ping, PingOptions, DNS и т.д., а такжедругие, к примеру, Networklnterface, с помощью которого можно получитьинформацию о конфигурации и статистике сетевого интерфейса. Длявыполнения синхронного пинга используется метод экземпляра класса Ping -Ping.Send. Для выполнения асинхронного пингаиспользуется метод экземпляракласса Ping—Ping.SendAsync. Для синхронного получения DNS именииспользуется метод класса DNS —Dns.GetHostEntry. Для асинхронного запросаDNS имени используется метод класса DNS —Dns.GetHostEntryAsync.

Ruby.

Является интерпретируемым языком программирования, то есть тем, в которомисходный код программы исполняется с помощью специальной программы - интерпретатора. Одной из особенностей Ruby является наличие огромногонабора библиотек (просто откройте RubyGems) для самого широкого наборазадач. Есть библиотеки для работы с сетью, с которыми можно в десяток строкнаписать простой клиент, или сервер, для протокола UDP. Стоит отдельно выделитьфреймворкRubyonRails. Ruby позволяет выполнять как синхронные,так и асинхронные пинги, к примеру, используя соответствующий Gem—net-ping. Предоставлена возможность получения DNS имени синхронностандартными средствами (используя экземпляры и методы классаResolv::DNS). Возможность выполнения асинхроннного запроса DNS имени предоставлена сторонними разработчиками, к примеру в геме EM-Udns.

Для выполнения задачи в отдельном потоке необходимо перед этой задачей указать ключевые слова threads<<Thread.new(). Поток имеет общий доступ ко всем глобальным переменным, переменным экземпляра и локальным переменным, которые имеются на момент запуска потока.Доступ к текущему потоку можно всегда получить, используя Thread.current. Вы можете получить список всех потоков, используя Thread.list, которая возвращает список всех объектов Thread: и работающих, и остановленных. Для определения статуса отдельного потока вы можете использовать Thread#status и Thread#alive?.

Python.

В Python предоставлены широкие возможности по работе с сетью, которыепредоставлены модулями. Модуль socket предлагает простой интерфейс дляиспользования сокетов. На данном языке программирования реализация сокетов значительно проще, чем на многих других. В Python есть и другиесетевые модули: httplib, ftplib, telnetlib, smtplib, реализующие различныесетевые протоколы. Кроме того, в статье значительное внимание будет уделеноинструментарию twisted, который еще в большей степени унифицируетрутинные операции, связанные с особенностями сетевого программирования.При разработке приложений под Windows, для выполнения пинга на Python нужно импортировать «os» (importos) и отправлять пинги, включая адрес в качестве аргумента для os.system. Для выполнения асинхронного пинга лучше использовать свободную библиотеку gevent. Возможность выполнения DNS запросов обоих видов предоставлена в TwistedNames API.Начиная с версии Python 3.2 в Питоне появилась библиотека concurrent.futures. Для второй версии Питона есть бекпорт под именем futures.

Кодданногобекпорта:

fromconcurrent.futures import ThreadPoolExecutor

withThreadPoolExecutor(concurrency) as executor:

for _ in executor.map(upload, queryset):

pass

Здесь concurrency — число рабочих потоков, upload — функция, выполняющую саму задачу, queryset — итератор объектов, которые по одному будут передаваться в задачу.

Многопоточность в pythonвозможно использовать не для каждой задачи из-за глобального лока выполнения операцй, но для распараллеливания http-запросов можно, так как пока один поток ожидает ответа, другой спокойно обрабатывает результат предыдущего или готовит следующий.

Java.

Приложения Java обычно компилируются в специальный байт-код, поэтому онимогут работать на любой виртуальной Java-машине (JVM) вне зависимости откомпьютерной архитектуры. Эта платформонезависимоть могла бы сделатьJava лучшим инструментом в работе с сетью, однако в Java отсутствуютсредства, позволяющие делать работу аналогичную утилитам ping, traceroute ит.д. Полнофункциональный ping обычными средствами получить не удастся, т.к.отсутствует доступ к RAW sockets. Впрочем, для проверки наличия связиполнофункциональныйping и не нужен. С версии JDK 1.5 появились методыInetAddress.isReachable(), которые могут это осуществить. Выполнятьасинхронные запросы позволяет API java.util.concurrent. Для того, чтобывыполнять синхронные DNS запросы можно воспользоваться стандартнымметодом InetAddress.getByName(). Для асинхронных DNS запросов -использовать бесплатную библиотеку TADNS.

Каждый процесс имеет хотя бы один выполняющийся поток. Тот поток, с которого начинается выполнение программы, называется главным. В языке Java, после создания процесса, выполнение главного потока начинается с метода main(). Затем, по мере необходимости, в заданных программистом местах, и при выполнении заданных им же условий, запускаются другие, побочные потоки.

В языке Java поток представляется в виде объекта-потомка класса Thread. Этот класс инкапсулирует стандартные механизмы работы с потоком.

Запустить новый поток можно двумя способами:

Способ 1

Создать объект класса Thread, передав ему в конструкторе нечто, реализующее интерфейс Runnable. Этот интерфейс содержит метод run(), который будет выполняться в новом потоке. Поток закончит выполнение, когда завершится его метод run().

Способ 2

Создать потомка класса Thread и переопределить его метод run():

WinAPI.

Является самым низким уровнем для работы Windows-приложений с сетью. Всевышеописанные методы в конце концов вызывают соответствующие функцииWinAPI. Т.е. всю работу с сетью можно проводить используя только WinAPI,однако несмотря на то, что этот метод может показаться наиболеепредпочтительным, у него есть существенный недостаток – сложностьиспользования. Т.к. взаимодействие идет на низком уровне необходимо точнознать последствия каждого действия, что требует достаточного опытаразработки данных программных средств. Для работы с сетью средствамиWinAPI необходимо экспортировать функции IcmpCreateFile, IcmpSendEcho,IcmpCIoseHandleбиблиотекиlcmp.dll (дляpingиtreaceroute) mGetHostByNameбиблиотекиwinsock.dll (дляnslookup).

Обобщенный алгоритм сканирования сети с помощью технологии.Net

1. Получение списка IP-адресов

2. В цикле асинхронно получаем информацию о доступности IP -адреса

a. Вызываем метод Ping.SendAsync(IP -адрес) для каждого IP -адреса

b. Каждому вызову ставим в соответствие callbackPingComplete

c. После выполнения метода в callback’е выводим полученную информацию

3. В цикле многопоточно получаем доменное имя IP -адреса

a. Создаем объект типа Task

b. Выделяем данному объекту код, в котором получаем доменное имя с помощью метода Dns.GetHostEntry и выводим полученный результат

4.2.3. Анализ сети. Определение следующих параметров: адрес сети, маска, широковещательный адрес

Определение следующих параметров будет осуществляться по диапазону IP – адресов.

1. Определение минимальной маски подсети. В терминологии сетей TCP/IP маской подсети или маской сети называется битовая маска, определяющая, какая часть IP-адреса узла сети относится к адресу сети, а какая — к адресу самого узла в этой сети. Маска состоит из 32 битов, все ее единичные биты находятся левее нулевых. Чтобы получить минимальную маску сети, необходимо слева направо сравнивать биты начального и конечного адресов диапазона до первого несовпадения. Каждой паре совпавших в ходе проверки битов соответствует единичный бит маски в той же позиции, что и совпавшая пара.

  Пример:

  Начальный адрес     11000001 11101001 10010010 11101000

  193.233.146.232

Конечный адрес           11000001 11101001 10010010 11101111

  193.233.146.239

  Маска               11111111 11111111 11111111 11111000

  255.255.255.248

2. Определение адреса сети. Адрес сети получается из адреса любого компьютера данной сети, путем обнуления всех битов, отведенных под номер узла. Таким образом, адрес сети есть результат поразрядной конъюнкции адреса любого компьютера данной сети и маски сети.

  Пример:

IP – адрес                11000001 11101001 10010010 11101011

  193.233.146.235

  Маска               11111111 11111111 11111111 11111000

  255.255.255.248

  Адрес сети     11000001 11101001 10010010 11101000

  193.233.146.232

3. Определение широковещательного адреса.     

Широковещательный адрес сети — условный (не присвоенный никакому устройству в сети) адрес, который используется для передачи широковещательных пакетов в компьютерных сетях. Он получается из адреса любого компьютера данной сети, путем присвоения 1 всем битам, отведенным под номер узла. Таким образом, широковещательный адрес есть результат поразрядной дизъюнкции адреса любого компьютера данной сети и результата применения отрицания к маске сети.

  Пример:

IP – адрес       11000001 11101001 10010010 11101011        

  193.233.146.235

  Маска               11111111 11111111 11111111 11111000

  255.255.255.248

  Широковещательный 11000001 11101001 10010010 11101111

  адрес

  193.233.146.239

Обобщенный алгоритм

1. Определить минимальную маску подсети.

1.1. Представить начальный и конечный адреса диапазона в двоичном виде.

1.2. Произвести поразрядное сравнение начального и конечного адресов. Если значение разрядов совпадают, то соответствующий разряд маски равен 1. Иначе прерываем сравнение и в оставшиеся разряды устанавливаем 0.

2. Определить адрес сети.

2.1. Представить маску подсети и один из адресов диапазона (например начальный) в двоичном виде.

2.2. Произвести поразрядную конъюнкцию маски подсети и одного из адресов диапазона.

3. Определить широковещательный адрес сети.

3.1. Представить маску подсети и адрес сети в двоичном виде.

3.2. Произвести инверсию маски подсети.

3.3. Произвести поразрядную дизъюнкцию инвертированной маски подсети и адреса сети.

Построение карты сети

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

Рисунок 6. Структура сети УГАТУ



<== предыдущая лекция | следующая лекция ==>
Получение первоначальной информации вручную. | 
Поделиться с друзьями:


Дата добавления: 2018-10-17; Мы поможем в написании ваших работ!; просмотров: 264 | Нарушение авторских прав


Поиск на сайте:

Лучшие изречения:

Надо любить жизнь больше, чем смысл жизни. © Федор Достоевский
==> читать все изречения...

822 - | 660 -


© 2015-2024 lektsii.org - Контакты - Последнее добавление

Ген: 0.011 с.