#c_sharp #net #клиент_сервер
Как создаются клиенты, которые могут опросить сеть и найти нужные экземпляры служб? Например, MS Managment Studio может опросить сеть и найти все экземпляры MS SQL. При этом никакие IP заранее неизвестны. С помощью чего\какого алгоритма это достигается?
Ответы
Ответ 1
Самый простой вариант - UDP broadcast. Предусловия: на искомых сервисах запущен UdpListener на известном и фиксированном порту. сервисы располагаются внутри локальной сети или настроена маршрутизация, позволяющая работать с сервисом, не покидая пределы адресного пространства локальной сети. Алгоритм: клиент отправляет по UDP широковещательный запрос (broadcast) на порт, который должны слушать сервисы, если они есть в сети и находятся в рабочем состоянии. сервис, услышав такой запрос, получает из запроса контактные данные клиента, встречным запросом, передает свои контактные данные и продолжает слушать, вдруг еще клиент появится. Недостатки: Работает только в локальных сетях, т.к. в глобальных сетях, а часто и в сетях уровня предприятия (объединяющих более мелкие локальные сети), широковещательные запросы запрещены на маршрутизаторах, с целью уменьшить количество мусорного трафика и разгрузить сетевое оборудование, которому, обычно, и так есть чем заняться. Если сервис не слушает UDP Дальнейшие способы, с оговорками, могут применяться и в глобальных сетях. Сервис имеет известный порт по-умолчанию В этом случае можно выполнить опрос известного диапазона адресов по данному порту, иными словами, просто попробовать подключиться. Недостатки: медленно, очень медленно, если большая часть диапазона адресов не занята какими-либо сетевыми устройствами, умеющими сказать, что порт закрыт и сервиса тут нет. Но можно немного облегчить себе жизнь выполняя множество запросов асинхронно, т.к. все запросы по своей сути ожидание ответа от хоста, если он там есть или обрыва по таймауту, если на адресе никого нет. Про сервис не известно ничего, кроме возможных(!) параметров подключения Случай практически безнадежный, но, в некоторых случаях, решаемый. Аналогично предыдущему варианту, придется пробежаться, например ping-ом, по всему целевому диапазону адресов, чтобы определить живые хосты. После этого на живых хостах нужно пробежаться по диапазону возможных портов (в худшем случае по всем) и попытаться подключиться. Такой вариант можно применять только в самом крайнем случае, т.к. он требует массу времени, забивает сеть, на него неадекватно реагируют файерволы (и админы) и т.д. Кроме того, хост может попросту игнорировать попытки подключения к запрещенным портам , имитируя свое отсутствие, что также отрицательно скажется на времени опроса. В общем случае применение не рекомендуется.
Комментариев нет:
Отправить комментарий