Архитектура «клиент–сервер» – фундаментальный способ организации вычислений и обмена данными в сетях. Клиент формирует запрос к удалённому ресурсу или услуге, сервер принимает запрос, обрабатывает его по согласованному протоколу и возвращает ответ. Для школьного курса информатики и подготовки к ЕГЭ эта тема важна по трём причинам:
она связывает теорию сетей (модели OSI/TCP-IP, протоколы, порты) с практикой программирования;
развивает навыки декомпозиции и формализации интерфейсов (API);
тренирует системное мышление, необходимое при решении задач на обработку данных, строки, алгоритмы и логические рассуждения.
Клиент – инициатор запроса; сервер
– поставщик сервиса.
Протокол – формальное описание форматов сообщений и порядка обмена.
Сеанс – логическая последовательность обменов между парой клиент–сервер.
Сокет – программный интерфейс межсетевого обмена, определяемый парой (IP-адрес, порт).
API – программный контракт прикладного уровня (URI/эндпоинты, методы, форматы данных, коды ошибок).
Статус ответа – формализованная индикация результата (например, коды HTTP).
Классическая схема запроса/ответа:
клиент устанавливает соединение (или отправляет датаграмму),
сериализует запрос по протоколу,
сервер десериализует, валидирует, обрабатывает,
формирует ответ и пересылает его.
Модель OSI (концептуально) и TCP/IP (практически):
Канальный+физический уровни обеспечивают передачу кадров в пределах сегмента сети.
Сетевой уровень (IP) маршрутизирует пакеты.
Транспортный уровень (TCP/UDP) доставляет данные процессам:
TCP – надёжная потоковая передача с установлением соединения, контролем ошибок и порядка;
UDP – без установления соединения, минимальные накладные расходы, без гарантий доставки/порядка.
Прикладной уровень – собственно протокол сервиса (HTTP, DNS, SMTP, собственные бинарные протоколы).
Порты: числа 0–65535; «хост:порт» определяет точку входа сервиса. Типовые: 80 (HTTP), 443 (HTTPS).
DNS: преобразует доменные имена в IP-адреса – ключевой инфраструктурный сервис.
Дизайн прикладного протокола допускает два подхода:
Использование стандартного протокола (например, HTTP/1.1, HTTP/2) – проще отлаживать, легко тестировать (curl, браузер).
Создание собственного протокола (чаще поверх TCP) – максимум контроля и эффективности, но выше риск ошибок.
Форматы данных:
Текстовые: JSON (универсален), CSV (табличные данные), XML (богатая семантика).
Бинарные: компактнее и быстрее (protobuf, msgpack), но сложнее диагностировать.
Кодировки: UTF-8 – де-факто стандарт для человекочитаемого текста.
Ключевые требования к протоколу:
детерминированность, чёткие правила сериализации/десериализации, устойчивость к ошибкам, документированная версия, обратная совместимость.

Ясный контракт API. Для каждого эндпоинта: название, метод (GET/POST и т. п.), входные параметры (тип/обязательность/условия), формат ответа, коды ошибок, примеры.
Статичность интерфейса и версионирование. Изменения – через v1, v2 и т. п., с периодом совместимости.
Статусность.
Stateless (рекомендуется по умолчанию): сервер не хранит состояние сеанса между запросами; масштабируется проще.
Stateful: состояние (сессии, очереди) хранится на сервере; требует «липких» соединений или распределённых хранилищ.
Надёжность: таймауты, ретраи, backoff. Клиент обязан иметь таймауты на соединение/чтение, повторять безопасные операции с экспоненциальной задержкой.
Идемпотентность. Повтор запроса не должен менять результат (для GET, часто для PUT/DELETE). Для небезопасных операций – идемпотентные ключи.
Валидность и защита. Валидация входа, ограничение размеров сообщений, ограничения частоты запросов (rate limiting), шифрование (TLS), аутентификация/авторизация (токены).
Наблюдаемость. Логирование коррелируемыми идентификаторами запросов (trace-id), метрики (latency, throughput, error-rate), структурированные логи.
Производительность. Буферизация, пайплайнинг, кэширование, сжатие, выбор эффективного формата данных.
Масштабируемость. Горизонтальная (несколько серверов за балансировщиком) и вертикальная (ресурсы одного узла).
Тестируемость. Контрактные тесты API, модульные тесты логики, интеграционные тесты цепочки клиент↔сервер.
Ниже – учебные наброски, иллюстрирующие структуру. Они демонстрируют принципы; для боевого использования требуются доработки (TLS, таймауты, обработка ошибок, многопоточность/асинхронность).
Сервер (HTTP через стандартный модуль):
from http.server import BaseHTTPRequestHandler, HTTPServer
import json
class Handler(BaseHTTPRequestHandler):
def do_GET(self):
if self.path.startswith("/sum?"):
# очень упрощённый парсер
try:
qs = dict(pair.split("=") for pair in self.path.split("?",1)[1].split("&"))
a, b = int(qs.get("a","0")), int(qs.get("b","0"))
body = json.dumps({"result": a + b}).encode("utf-8")
self.send_response(200)
self.send_header("Content-Type", "application/json; charset=utf-8")
self.send_header("Content-Length", str(len(body)))
self.end_headers()
self.wfile.write(body)
except Exception:
self.send_error(400, "Bad Request")
else:
self.send_error(404, "Not Found")
if __name__ == "__main__":
HTTPServer(("0.0.0.0", 8080), Handler).serve_forever()
Клиент (запрос и обработка ответа):
import json, urllib.request
with urllib.request.urlopen("http:// 127.0.0.1:8080/sum?a=7&b=5", timeout=3) as resp:
data = json.loads(resp.read().decode("utf-8"))
print(data["result"]) # 12
Замечания по правилам (даже для учебного кода):
– добавить таймауты; – валидировать вход (диапазоны, типы); – стандартизовать ответы об ошибках (единый JSON с кодом и описанием); – логировать trace-id в заголовке.
Модель обработки на сервере:
Последовательная – просто, но блокирует на длительных операциях.
Многопоточная – обслуживает клиентов параллельно, требует синхронизации.
Асинхронная (event loop) – эффективна при больших числах подключений и IO-нагрузке.
Показатели качества:
Отсутствие чётких контрактов API. Лечится спецификацией (таблица эндпоинтов/параметров, примеры).
Смешение слоёв. Логику домена нельзя «зашивать» в код парсинга запросов.
Игнорирование ошибок сети. Обязательны таймауты, повторные попытки (с ограничением), защита от дублирования.
Отсутствие валидации. Любой внешний ввод считается недоверенным.
Жёсткая связанность клиента и сервера. Решение – версионирование, обратная совместимость, тесты контрактов.
Компьютерные сети: порты, IP, TCP/UDP, DNS, уровни моделей.
Алгоритмизация: формализация протоколов – тренировка в строгих правилах и проверках граничных случаев.
Строки и форматы: парсинг запросов/ответов, кодировки, сериализация/десериализация.
Логика и модели: причинно-следственные связи (задержка ↔ очереди ↔ пропускная способность).
Даже если практический код на экзамене не требуется, понимание архитектуры повышает качество рассуждений и обоснований.
Упражнение 1. «Слои и протоколы».
Дан перечень действий: (а) преобразование доменного имени в IP; (б) разбиение потока данных на сегменты с нумерацией; (в) маршрутизация пакетов; (г) сериализация объекта в JSON; (д) управление ошибками приложения.
Задание: соотнесите каждое действие с уровнем OSI/TCP-IP и объясните выбор в 2–3 предложениях для каждого пункта.
Критерий: корректные соответствия и аргументация.
Упражнение 2. «Контракт API».
Опишите текстовую спецификацию эндпоинта /calc/sum (метод GET): параметры a:int, b:int, успешный ответ, коды ошибок 400/429/500, требования к идемпотентности, примеры запросов/ответов.
Критерий: наличие метода, схемы параметров, формата тела, кодов статуса, примеров и ограничений.
Упражнение 3. «Идемпотентность и ретраи».
Клиент отправил запрос на списание баллов, сеть оборвалась, клиент выполнил повтор.
Задание: предложите механизм предотвращения двойного списания (идемпотентный ключ, окно дедупликации, поведение сервера).
Критерий: корректный протокол обработки повторов и аргументация идемпотентности.
Упражнение 4. «Разбор запроса».
Дана строка запроса:
GET /search?q=%D0%B5%D0%B3%D1%8D&page=2 HTTP/1.1
Host: example.org
Accept: application/json
Задание: расшифруйте параметр q, перечислите ключевые элементы запроса (метод, путь, строка запроса, версия, заголовок Host, параметр page), укажите кодировку и формат предпочтительного ответа.
Критерий: корректная декодированная строка («егэ» в UTF-8), правильная структура и вывод по Accept.
Упражнение 5. «Мини-проект (эскиз)».
Набросайте структуру учебной пары модулей на Python: server.py (обработка /sum) и client.py (вызов сервиса).
Задание: опишите, где реализуете: валидацию, таймауты, логирование, формирование кода ошибки, а также какие тестовые случаи проверите (пустой параметр, нечисловой ввод, большие числа, повтор запроса).
Критерий: наличие всех пунктов, разумные решения по обработке ошибок и тестированию.
Архитектура «клиент–сервер» формирует у учащегося системное понимание сетей, протоколов и программных интерфейсов. Строгое следование правилам – ясный контракт API, статeless-подход по умолчанию, валидность входа, таймауты/ретраи, идемпотентность, наблюдаемость – обеспечивает надёжность и масштабируемость систем. Отражая ключевые темы ЕГЭ (модели сетей, форматы данных, алгоритмизация), эта дисциплина тренирует точность формулировок, работу с граничными случаями и аргументированное объяснение выбранных решений – навыки, которые напрямую повышают результат на экзамене и создают основу для дальнейшего профессионального роста.