# Теоретические вопросы к лабораторной работе №1 Ответы на контрольные вопросы. Примеры по возможности взяты из собственной работы (`index.html`, `script.js`) — так проще отвечать на защите. --- ## 1. Протокол HTTP **HTTP** (HyperText Transfer Protocol) — прикладной текстовый протокол клиент-серверного взаимодействия, работающий поверх TCP (порт 80) или TLS/TCP (HTTPS, порт 443). Работает по схеме «запрос — ответ»: клиент всегда инициирует обмен, сервер отвечает. Ключевое свойство — **отсутствие состояния** (stateless). Сервер не обязан помнить предыдущие запросы клиента; каждый запрос самодостаточен. Состояние надстраивается сверху: cookies, сессии, токены, а на клиенте — `localStorage` (как в этой работе). Версии: HTTP/1.1 (текстовый, keep-alive соединения), HTTP/2 (бинарные кадры, мультиплексирование нескольких запросов в одном соединении, сжатие заголовков HPACK), HTTP/3 (поверх QUIC/UDP). ### Структура запроса ``` МЕТОД URI ВЕРСИЯ ← строка запроса (start line) Заголовок: значение ← заголовки, по одному на строку Заголовок: значение ← ПУСТАЯ строка — обязательный разделитель тело запроса ← необязательно (есть у POST/PUT/PATCH) ``` Пример: ```http POST /check-point HTTP/1.1 Host: se.ifmo.ru Content-Type: application/x-www-form-urlencoded Content-Length: 24 User-Agent: Mozilla/5.0 xval=1&yval=2.5&rval=3 ``` ### Структура ответа ``` ВЕРСИЯ КОД ПОЯСНЕНИЕ ← строка статуса Заголовок: значение ← пустая строка тело ответа ``` Пример: ```http HTTP/1.1 200 OK Content-Type: text/html; charset=UTF-8 Content-Length: 1024 ... ``` ### Методы запросов | Метод | Назначение | Безопасный | Идемпотентный | Тело | |---|---|---|---|---| | `GET` | Получить ресурс | да | да | нет | | `POST` | Отправить данные, создать ресурс | нет | **нет** | да | | `PUT` | Полностью заменить ресурс | нет | да | да | | `PATCH` | Частично изменить ресурс | нет | нет | да | | `DELETE` | Удалить ресурс | нет | да | необяз. | | `HEAD` | Как GET, но только заголовки | да | да | нет | | `OPTIONS` | Узнать поддерживаемые методы (CORS preflight) | да | да | нет | | `TRACE` | Диагностика — вернуть запрос как есть | да | да | нет | Два свойства, которые обязательно спросят: - **Безопасный** (safe) — не изменяет состояние сервера, только читает. - **Идемпотентный** — повторный одинаковый запрос даёт тот же результат. `DELETE /point/5` можно послать трижды — точка всё равно одна удалённая. А три `POST` создадут три записи, поэтому POST не идемпотентен — отсюда предупреждение браузера «повторить отправку формы?» при обновлении страницы. ### Коды ответов сервера Пять классов по первой цифре: | Класс | Смысл | |---|---| | **1xx** | Информационные — запрос принят, обработка продолжается | | **2xx** | Успех | | **3xx** | Перенаправление | | **4xx** | Ошибка клиента | | **5xx** | Ошибка сервера | Конкретные коды, которые нужно знать: | Код | Название | Когда | |---|---|---| | 100 | Continue | Сервер готов принять тело | | 101 | Switching Protocols | Переход на WebSocket | | **200** | OK | Успех, тело содержит результат | | 201 | Created | Ресурс создан (ответ на POST/PUT) | | 204 | No Content | Успех, тела нет | | 301 | Moved Permanently | Переехало навсегда, обновите ссылки | | 302 | Found | Временное перенаправление | | **304** | Not Modified | Ресурс не изменился, берите из кэша | | 400 | Bad Request | Синтаксически некорректный запрос | | **401** | Unauthorized | Не аутентифицирован (нужно войти) | | **403** | Forbidden | Аутентифицирован, но нет прав | | **404** | Not Found | Ресурс не найден | | 405 | Method Not Allowed | Метод не поддерживается этим URI | | 409 | Conflict | Конфликт состояния | | 418 | I'm a teapot | Шутка из RFC 2324 | | 422 | Unprocessable Entity | Синтаксис верен, но данные не прошли валидацию | | 429 | Too Many Requests | Превышен лимит частоты | | **500** | Internal Server Error | Необработанное исключение на сервере | | 501 | Not Implemented | Метод не реализован | | 502 | Bad Gateway | Прокси получил некорректный ответ от бэкенда | | 503 | Service Unavailable | Сервер перегружен или на обслуживании | | 504 | Gateway Timeout | Прокси не дождался ответа | Разница 401 и 403 — частый вопрос: 401 «я тебя не знаю, представься», 403 «я тебя знаю, но тебе сюда нельзя». ### Заголовки Заголовки — это метаданные в формате `Имя: значение`. Имена регистронезависимы. Делятся на четыре группы: общие, запроса, ответа и сущности (описывающие тело). **Заголовки запроса:** | Заголовок | Смысл | |---|---| | `Host` | Домен — обязателен в HTTP/1.1, позволяет виртуальный хостинг | | `User-Agent` | Клиент: браузер, ОС, версия | | `Accept` | Какие MIME-типы клиент готов принять | | `Accept-Language` | Предпочитаемые языки (`ru-RU,ru;q=0.9`) | | `Accept-Encoding` | Поддерживаемое сжатие (`gzip, br`) | | `Cookie` | Cookies, ранее установленные сервером | | `Authorization` | Данные аутентификации (`Bearer `) | | `Referer` | Страница, с которой пришёл запрос | | `If-Modified-Since` | Условный запрос — отдай, только если изменилось | | `Content-Type` | Тип тела запроса | | `Content-Length` | Длина тела в байтах | | `Connection` | `keep-alive` / `close` | | `Origin` | Источник запроса, используется в CORS | **Заголовки ответа:** | Заголовок | Смысл | |---|---| | `Content-Type` | MIME-тип и кодировка тела (`text/html; charset=UTF-8`) | | `Content-Length` | Длина тела | | `Content-Encoding` | Применённое сжатие | | `Server` | ПО сервера (`nginx/1.24`) | | `Set-Cookie` | Установить cookie у клиента | | `Location` | Куда перенаправить (с кодами 3xx) | | `Cache-Control` | Правила кэширования (`no-cache`, `max-age=3600`) | | `ETag` | Версия-отпечаток ресурса для условных запросов | | `Last-Modified` | Дата последнего изменения | | `Access-Control-Allow-Origin` | CORS: кому разрешён кросс-доменный доступ | | `Content-Disposition` | `attachment; filename="f.pdf"` — скачать как файл | | `WWW-Authenticate` | Метод аутентификации (вместе с 401) | > В данной работе HTTP-обмена фактически нет: страница статическая, а отправка > формы перехватывается `e.preventDefault()`, и всё считается на клиенте. > Браузер делает лишь GET-запросы за `index.html`, `script.js` и `assets/oscar.png`. --- ## 2. Язык разметки HTML **HTML** (HyperText Markup Language) — язык **разметки**, а не программирования: он описывает структуру и смысл документа, но не содержит алгоритмов. Актуальная версия — HTML5 (living standard WHATWG). ### Особенности - **Декларативность** — описывается *что* это, а не *как это сделать*. - **Теговая структура** — элементы образуют дерево вложенности. - **Устойчивость к ошибкам** — браузер не падает на некорректной разметке, а исправляет её по стандартным правилам восстановления. В отличие от XHTML, который требовал строгой валидности. - **Семантичность** — HTML5 ввёл теги со смыслом (`
`, `
`, `