Модель клиент-сервер представляет собой распределенную структуру приложений , которая разделяет задачи или рабочие нагрузки между поставщиками ресурсов или услуг, называемыми серверами , и запрашивающими услуги, называемыми клиентами . [1] Часто клиенты и серверы взаимодействуют через компьютерную сеть на отдельном оборудовании, но и клиент, и сервер могут находиться на одном устройстве. Хост сервера запускает одну или несколько серверных программ, которые делятся своими ресурсами с клиентами. Клиент обычно не делится никакими своими ресурсами, но запрашивает контент или услуги с сервера. Таким образом, клиенты инициируют сеансы связи с серверами, которые ожидают входящих запросов. Примерами компьютерных приложений, которые используют модель клиент-сервер, являются электронная почта , сетевая печать и Всемирная паутина .
Компонент сервера предоставляет функцию или услугу одному или нескольким клиентам, которые инициируют запросы на такие услуги. Серверы классифицируются по услугам, которые они предоставляют. Например, веб-сервер обслуживает веб-страницы , а файловый сервер обслуживает компьютерные файлы . Общий ресурс может быть любым программным обеспечением и электронными компонентами серверного компьютера, от программ и данных до процессоров и устройств хранения данных . Общий доступ к ресурсам сервера представляет собой услугу .
Является ли компьютер клиентом, сервером или обоими, определяется природой приложения, которому требуются функции обслуживания. Например, один компьютер может одновременно запускать программное обеспечение веб-сервера и файлового сервера для обслуживания различных данных клиентов, выполняющих различные виды запросов. Клиентское программное обеспечение также может взаимодействовать с серверным программным обеспечением в пределах одного компьютера. [2] Связь между серверами, например, для синхронизации данных, иногда называется межсерверной или межсерверной связью.
В общем, услуга — это абстракция компьютерных ресурсов, и клиенту не нужно беспокоиться о том, как сервер выполняет запрос и доставляет ответ. Клиенту нужно только понять ответ на основе соответствующего протокола приложения , т. е. содержание и форматирование данных для запрошенной услуги.
Клиенты и серверы обмениваются сообщениями по схеме «запрос-ответ» . Клиент отправляет запрос, а сервер возвращает ответ. Такой обмен сообщениями является примером межпроцессного взаимодействия . Для взаимодействия компьютеры должны иметь общий язык и следовать правилам, чтобы и клиент, и сервер знали, чего ожидать. Язык и правила взаимодействия определены в протоколе взаимодействия . Все протоколы работают на прикладном уровне . Протокол прикладного уровня определяет основные шаблоны диалога. Чтобы формализовать обмен данными еще больше, сервер может реализовать интерфейс прикладного программирования (API). [3] API — это уровень абстракции для доступа к службе. Ограничивая взаимодействие определенным форматом контента , он облегчает синтаксический анализ . Абстрагируя доступ, он облегчает кроссплатформенный обмен данными. [4]
Сервер может получать запросы от многих различных клиентов за короткий период времени. Компьютер может выполнять только ограниченное количество задач в любой момент времени и полагается на систему планирования для приоритизации входящих запросов от клиентов для их удовлетворения. Чтобы предотвратить злоупотребление и максимизировать доступность , программное обеспечение сервера может ограничивать доступность для клиентов. Атаки типа «отказ в обслуживании» предназначены для использования обязанности сервера обрабатывать запросы, перегружая его чрезмерными частотами запросов. Шифрование должно применяться, если конфиденциальная информация должна передаваться между клиентом и сервером.
Когда клиент банка получает доступ к услугам онлайн-банкинга с помощью веб-браузера (клиент), клиент инициирует запрос на веб-сервер банка. Учетные данные клиента могут храниться в базе данных , а веб-сервер обращается к серверу базы данных как клиент. Сервер приложений интерпретирует возвращенные данные, применяя бизнес-логику банка , и предоставляет вывод веб-серверу. Наконец, веб-сервер возвращает результат клиентскому веб-браузеру для отображения.
На каждом этапе этой последовательности обмена сообщениями клиент-сервер компьютер обрабатывает запрос и возвращает данные. Это шаблон обмена сообщениями запрос-ответ. Когда все запросы выполнены, последовательность завершается, и веб-браузер представляет данные клиенту.
В этом примере показан шаблон проектирования , применимый к модели клиент-сервер: разделение ответственности .
Серверная сторона относится к программам и операциям, которые выполняются на сервере . Это отличается от клиентских программ и операций, которые выполняются на клиенте . [5] (См. ниже)
«Серверное программное обеспечение» относится к компьютерному приложению , такому как веб-сервер , которое работает на удаленном серверном оборудовании , доступном с локального компьютера пользователя , смартфона или другого устройства. Операции могут выполняться на стороне сервера, поскольку они требуют доступа к информации или функциональности, которые недоступны на стороне клиента , или поскольку выполнение таких операций на стороне клиента будет медленным, ненадежным или небезопасным .
Клиентские и серверные программы могут быть общедоступными, такими как бесплатные или коммерческие веб-серверы и веб-браузеры , взаимодействующие друг с другом с использованием стандартизированных протоколов . Или программисты могут написать свой собственный сервер, клиент и протокол связи , которые могут использоваться только друг с другом.
Операции на стороне сервера включают как те, которые выполняются в ответ на запросы клиентов, так и не ориентированные на клиента операции, такие как задачи по обслуживанию. [6] [7]
В контексте компьютерной безопасности уязвимости или атаки на стороне сервера относятся к тем, которые происходят на серверной компьютерной системе, а не на стороне клиента или между ними . Например, злоумышленник может использовать уязвимость SQL-инъекции в веб-приложении , чтобы злонамеренно изменить или получить несанкционированный доступ к данным в базе данных сервера . В качестве альтернативы злоумышленник может взломать серверную систему, используя уязвимости в базовой операционной системе , а затем получить доступ к базе данных и другим файлам таким же образом, как и авторизованные администраторы сервера. [8] [9] [10]
В случае проектов распределенных вычислений , таких как SETI@home и Great Internet Mersenne Prime Search , хотя основная часть операций происходит на стороне клиента, серверы отвечают за координацию клиентов, отправку им данных для анализа, получение и хранение результатов, предоставление функциональности отчетности администраторам проекта и т. д. В случае интернет-зависимого пользовательского приложения, такого как Google Earth , хотя запросы и отображение картографических данных происходят на стороне клиента, сервер отвечает за постоянное хранение картографических данных, преобразование пользовательских запросов в картографические данные, которые будут возвращены клиенту, и т. д.
В контексте Всемирной паутины наиболее часто встречающиеся серверные компьютерные языки включают в себя: [5]
Однако веб-приложения и сервисы могут быть реализованы практически на любом языке, при условии, что они могут возвращать данные в веб-браузеры, основанные на стандартах (возможно, через промежуточные программы) в форматах, которые они могут использовать.
Клиентская сторона относится к операциям, выполняемым клиентом в компьютерной сети .
Обычно клиент — это компьютерное приложение , например веб-браузер , которое работает на локальном компьютере пользователя , смартфоне или другом устройстве и подключается к серверу по мере необходимости. Операции могут выполняться на стороне клиента, поскольку для них требуется доступ к информации или функциональным возможностям, доступным на клиенте, но не на сервере, поскольку пользователю необходимо наблюдать за операциями или предоставлять входные данные, или поскольку серверу не хватает вычислительной мощности для своевременного выполнения операций для всех обслуживаемых им клиентов. Кроме того, если операции могут выполняться клиентом без отправки данных по сети, они могут занимать меньше времени, использовать меньшую полосу пропускания и подвергаться меньшему риску безопасности .
Когда сервер обслуживает данные общепринятым способом, например, в соответствии со стандартными протоколами , такими как HTTP или FTP , пользователи могут выбирать из ряда клиентских программ (например, большинство современных веб-браузеров могут запрашивать и получать данные, используя как HTTP, так и FTP). В случае более специализированных приложений программисты могут написать свой собственный сервер, клиент и протокол связи , которые могут использоваться только друг с другом.
Программы, которые работают на локальном компьютере пользователя, не отправляя и не получая данные по сети, не считаются клиентами, и поэтому операции таких программ нельзя назвать операциями на стороне клиента.
В контексте компьютерной безопасности уязвимости или атаки на стороне клиента относятся к тем, которые происходят на клиентской/пользовательской компьютерной системе, а не на стороне сервера или между ними . Например, если сервер содержал зашифрованный файл или сообщение, которые можно было расшифровать только с помощью ключа, размещенного на компьютерной системе пользователя, атака на стороне клиента обычно была бы единственной возможностью для злоумышленника получить доступ к расшифрованному содержимому. Например, злоумышленник может установить вредоносное ПО на клиентской системе, что позволит злоумышленнику просматривать экран пользователя, записывать нажатия клавиш пользователем и красть копии ключей шифрования пользователя и т. д. В качестве альтернативы злоумышленник может использовать уязвимости межсайтового скриптинга для выполнения вредоносного кода на клиентской системе без необходимости установки какого-либо постоянно резидентного вредоносного ПО. [8] [9] [10]
Распределенные вычислительные проекты, такие как SETI@home и Great Internet Mersenne Prime Search, а также интернет-зависимые приложения, такие как Google Earth , в первую очередь полагаются на клиентские операции. Они инициируют соединение с сервером (либо в ответ на запрос пользователя, как в Google Earth, либо автоматически, как в SETI@home), и запрашивают некоторые данные. Сервер выбирает набор данных ( серверная операция) и отправляет его обратно клиенту. Затем клиент анализирует данные (клиентская операция) и, когда анализ завершен, отображает их пользователю (как в Google Earth) и/или передает результаты вычислений обратно на сервер (как в SETI@home).
В контексте Всемирной паутины наиболее часто встречающиеся компьютерные языки, которые оцениваются или выполняются на стороне клиента, включают: [5]
Ранней формой архитектуры клиент-сервер является удаленный ввод заданий , появившийся, по крайней мере, в OS/360 (анонсирован в 1964 году), где запрос заключался в запуске задания , а ответ был выходом.
При разработке модели клиент-сервер в 1960-х и 1970-х годах ученые-компьютерщики, создававшие ARPANET (в Стэнфордском исследовательском институте ), использовали термины сервер-хост (или обслуживающий хост ) и пользовательский хост (или использующий хост ), и они появляются в ранних документах RFC 5 [11] и RFC 4. [12] Такое использование было продолжено в Xerox PARC в середине 1970-х годов.
Одним из контекстов, в котором исследователи использовали эти термины, была разработка языка программирования компьютерных сетей под названием Decode-Encode Language (DEL). [11] Целью этого языка было принимать команды от одного компьютера (пользователь-хост), который возвращал бы пользователю отчеты о состоянии, поскольку он кодировал команды в сетевые пакеты. Другой компьютер с поддержкой DEL, сервер-хост, получал пакеты, декодировал их и возвращал форматированные данные на пользователь-хост. Программа DEL на пользователь-хост получала результаты для представления пользователю. Это транзакция клиент-сервер. Разработка DEL только началась в 1969 году, когда Министерство обороны США создало ARPANET (предшественник Интернета ).
Клиент-хост и сервер-хост имеют несколько иные значения, чем клиент и сервер . Хост — это любой компьютер, подключенный к сети. В то время как слова сервер и клиент могут относиться как к компьютеру, так и к компьютерной программе, сервер-хост и клиент-хост всегда относятся к компьютерам. Хост — это универсальный, многофункциональный компьютер; клиенты и серверы — это просто программы, которые работают на хосте. В модели клиент-сервер сервер, скорее всего, будет посвящен задаче обслуживания.
Раннее использование слова клиент встречается в статье 1978 года "Separating Data from Function in a Distributed File System" ученых-компьютерщиков Xerox PARC Говарда Стерджиса, Джеймса Митчелла и Джея Израиля. Авторы тщательно определяют термин для читателей и объясняют, что они используют его для различения пользователя и сетевого узла пользователя (клиента). [13] К 1992 году слово сервер вошло в общий язык. [14] [15]
Модель клиент-сервер не диктует, что серверы-хосты должны иметь больше ресурсов, чем клиенты-хосты. Скорее, она позволяет любому компьютеру общего назначения расширять свои возможности, используя общие ресурсы других хостов. Централизованные вычисления , однако, специально выделяют большое количество ресурсов небольшому количеству компьютеров. Чем больше вычислений выгружается с клиентских хостов на центральные компьютеры, тем проще могут быть клиентские хосты. [16] Она в значительной степени полагается на сетевые ресурсы (серверы и инфраструктуру) для вычислений и хранения. Бездисковый узел загружает даже свою операционную систему из сети, а компьютерный терминал вообще не имеет операционной системы; это только интерфейс ввода/вывода для сервера. Напротив, расширенный клиент , такой как персональный компьютер , имеет много ресурсов и не полагается на сервер для выполнения основных функций.
По мере того, как микрокомпьютеры снижались в цене и увеличивали свою мощность с 1980-х до конца 1990-х годов, многие организации перевели вычисления с централизованных серверов, таких как мэйнфреймы и мини-компьютеры , на полнофункциональные клиенты. [17] Это обеспечивало большее, более индивидуализированное господство над компьютерными ресурсами, но усложняло управление информационными технологиями . [16] [18] [19] В 2000-х годах веб-приложения достаточно созрели, чтобы конкурировать с прикладным программным обеспечением, разработанным для определенной микроархитектуры . Это созревание, более доступное массовое хранилище и появление сервисно-ориентированной архитектуры были среди факторов, которые привели к возникновению тенденции облачных вычислений в 2010-х годах. [20] [ не удалось проверить ]
Помимо клиент-серверной модели, приложения распределенных вычислений часто используют архитектуру одноранговых приложений (P2P).
В модели клиент-сервер сервер часто проектируется для работы в качестве централизованной системы, которая обслуживает множество клиентов. Вычислительная мощность, память и требования к хранению сервера должны быть масштабированы соответствующим образом в соответствии с ожидаемой рабочей нагрузкой. Системы балансировки нагрузки и отказоустойчивости часто используются для масштабирования сервера за пределы одной физической машины. [21] [22]
Балансировка нагрузки определяется как методичное и эффективное распределение сетевого или прикладного трафика по нескольким серверам в ферме серверов. Каждый балансировщик нагрузки располагается между клиентскими устройствами и внутренними серверами, получая и затем распределяя входящие запросы на любой доступный сервер, способный их выполнить.
В одноранговой сети два или более компьютеров ( пиров ) объединяют свои ресурсы и взаимодействуют в децентрализованной системе . Пиры являются равноправными или равномощными узлами в неиерархической сети. В отличие от клиентов в клиент-серверной или клиент-очередной-клиентской сети, пиры взаимодействуют друг с другом напрямую. [ требуется ссылка ] В одноранговой сети алгоритм в протоколе одноранговой связи балансирует нагрузку , и даже пиры со скромными ресурсами могут помочь разделить нагрузку. [ требуется ссылка ] Если узел становится недоступным, его общие ресурсы остаются доступными до тех пор, пока их предлагают другие пиры. В идеале пиру не нужно достигать высокой доступности , поскольку другие, избыточные пиры компенсируют любой простой ресурсов ; по мере изменения доступности и грузоподъемности пиров протокол перенаправляет запросы.
Оба типа систем клиент-сервер и ведущий-ведомый рассматриваются как подкатегории распределенных одноранговых систем. [23]
Распределенные одноранговые системы [...] Это общий стиль, популярными стилями которого являются стили клиент-сервер и главный-подчиненный.