Каждый пользователь интернета хотя бы раз видел в браузере лаконичную надпись «404 Not Found». Эта комбинация цифр давно превратилась в своеобразный культурный символ эпохи — её помещают на футболки, используют в названиях заведений и упоминают в разговорной речи. Однако мало кто задумывается о том, что за этими тремя цифрами стоит целая система, рождённая в недрах ядерной физики, прошедшая через эпоху телефонных модемов и актуальная по сей день.
Разберёмся, откуда взялись коды состояния HTTP, что они означают и почему их число практически не растёт, несмотря на стремительное развитие технологий.
Всё началось в ЦЕРНе
История, которая привела нас к привычному виду страниц браузера, берёт начало в 1989 году. Именно тогда в Европейском центре ядерных исследований (ЦЕРН) британский учёный Тим Бернерс-Ли выдвинул предложение создать всемирную компьютерную сеть. Замысел был прост и элегантен: документы, расположенные на разных компьютерах, должны быть связаны между собой с помощью ссылок — то есть представлять собой гипертекстовые документы. Так родилась Всемирная паутина — World Wide Web.

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

Для того чтобы устройства могли обмениваться информацией по единым правилам, был разработан HTTP — протокол передачи гипертекста (HyperText Transfer Protocol). Углубляться в техническую архитектуру этого протокола в рамках данной статьи мы не станем — это тема для отдельного обстоятельного разговора. Однако одну принципиальную вещь понять необходимо.
Клиент и сервер: как устроен диалог
В основе работы HTTP лежит простая модель взаимодействия: есть клиент и есть сервер. Клиент — как правило, браузер пользователя — отправляет серверу запрос с просьбой предоставить ту или иную информацию. Сервер, в свою очередь, обрабатывает запрос и возвращает ответ. В обычной ситуации этим ответом оказывается веб-страница, которую вы видите на экране.

Запрос клиента — это текстовое сообщение, состоящее из трёх частей.
Первая часть — стартовая строка. В ней указывается тип запроса. Наиболее широко используемый тип называется GET: он применяется, когда браузер запрашивает данные у сервера. Если вы хотите открыть какую-либо страницу, именно GET-запрос отправляется в первую очередь.
Вторая часть — заголовок сообщения. В нём содержится адрес сайта, к которому направлен запрос, а также дополнительные сведения: версия браузера, языковые настройки и ряд других параметров.
Третья часть — тело сообщения. Оно не является обязательным. В теле запроса, например, могут передаваться данные, которые пользователь загружает на сервер — скажем, при заполнении формы или отправке файла.

Получив запрос, сервер его обрабатывает и формирует ответ. Ответ несколько сложнее по структуре, и первое, что в нём содержится, — это строка вида: HTTP/1.1 200 OK. Здесь HTTP/1.1 — версия используемого протокола (существуют также версии 2 и 3, о которых речь пойдёт ниже). А вот число 200 и слово OK — это и есть то самое, что нас интересует больше всего.
Что такое код состояния HTTP и зачем он понадобился
Число 200 — это код состояния HTTP. Всего три цифры, которые несут в себе исчерпывающую информацию о том, что произошло в результате запроса: выполнен ли он успешно, возникла ли ошибка, и если да — на чьей стороне.

Чтобы понять, почему эта система была столь важна, необходимо вспомнить, каким был интернет на заре своего существования. Протокол HTTP разрабатывался в начале 1990-х годов, когда средняя скорость соединения составляла около 14,5 килобит в секунду — более чем в тысячу раз меньше нынешних показателей. Для сравнения: средний размер современной веб-страницы составляет около 3 мегабайт. При скорости 14,5 Кб/с загрузка такой страницы заняла бы около получаса.
Однако дело было не только в скорости. В 1990-е годы подключиться к интернету можно было исключительно по телефонному проводу. Это означало, что интернет-соединение страдало теми же проблемами, что и обычная телефонная связь: помехи, обрывы, нестабильность. Соединение могло прерваться в любую секунду.

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

Коды 1xx — информационные ответы
Кодов, начинающихся на единицу, существует всего четыре. Они носят информационный характер и сигнализируют о том, что запрос принят и его обработка продолжается. Пользователь эти коды не видит: они предназначены исключительно для браузера.
Коды 2xx — успешное выполнение
Коды этой группы означают, что запрос был обработан успешно. Главный из них — уже упомянутый 200 OK: запрос выполнен, данные переданы клиенту. Именно этот код сопровождает подавляющее большинство страниц, которые вы открываете в браузере каждый день, — просто вы его не замечаете, потому что всё работает как должно.
Коды 3xx — перенаправление
Коды этой категории сообщают о необходимости перенаправить запрос. Один из наиболее известных примеров — 301 Moved Permanently: запрашиваемый ресурс перемещён по новому адресу, который передаётся вместе с этим кодом. В обиходе подобное перенаправление называют редиректом. Браузер получает новый адрес и автоматически переходит по нему — пользователь, как правило, этого даже не замечает.
Коды групп 1xx, 2xx и 3xx в подавляющем большинстве случаев остаются невидимыми для конечного пользователя: они предназначены для браузера, а не для человека за экраном.
Коды 4xx — ошибки на стороне клиента
Вот мы и добрались до той категории, с которой большинство пользователей знакомо не понаслышке. Коды 4xx означают, что в запросе, сформированном клиентом, содержится нечто, что сервер расценивает как некорректное или невыполнимое.

404 Not Found — самый известный из всех кодов HTTP. Он означает, что сервер не смог найти страницу, которую запросил браузер. Это происходит, например, когда вы вводите неверный адрес или когда страница была удалена, а ссылка на неё осталась. Каждый из нас сталкивался с этим кодом хотя бы раз.
403 Forbidden — код, который иногда отображается вместо 404. Он означает, что доступ к запрашиваемому ресурсу запрещён. Страница существует, сервер о ней знает, — однако у пользователя нет прав для её просмотра.
418 I’m a Teapot — пожалуй, самый курьёзный код во всей системе HTTP. Согласно официальной документации, он означает, что сервер отказывает клиенту в приготовлении кофе по причине того, что сервер является чайником. Этот код был придуман как первоапрельская шутка в 1998 году и изначально не предполагал практического применения. Однако в наши дни он вполне реально используется — например, как нестандартный ответ на запросы, которые заведомо не должны обрабатываться данным сервером.
429 Too Many Requests — с этим кодом также нередко приходится сталкиваться. Он означает, что за короткое время на сервер поступило слишком много запросов. Это один из механизмов защиты от перегрузки и DDoS-атак. Впрочем, данный код может сработать и в совершенно безобидной ситуации — например, при слишком частом обновлении страницы.
451 Unavailable For Legal Reasons — этот код был официально утверждён в 2015 году и означает, что доступ к ресурсу закрыт по юридическим основаниям: например, по требованию государственных органов или правообладателя в связи с нарушением авторских прав. Выбор именно числа 451 был сделан намеренно: это отсылка к роману-антиутопии Рэя Брэдбери «451 градус по Фаренгейту», в котором книги сжигались в целях цензуры.
Коды 5xx — ошибки на стороне сервера
Последняя категория обозначает ситуации, когда проблема возникает не на стороне пользователя, а на стороне самого сервера. Запрос был сформирован корректно, но сервер по тем или иным причинам не может его выполнить.

503 Service Unavailable — один из наиболее распространённых кодов этой группы. Он сигнализирует о том, что сервер временно недоступен: либо проводится техническое обслуживание, либо нагрузка на него оказалась чрезмерной.
504 Gateway Timeout — этот код возникает в ситуации, когда между клиентом и конечным сервером существует промежуточный сервер-шлюз, и этот шлюз не получил своевременного ответа от конечного сервера.
502 Bad Gateway — схожая ситуация: промежуточный сервер получил от конечного сервера ответ, однако этот ответ оказался некорректным, что и препятствует загрузке страницы.
Почему кодов почти не становится больше
Формально кодов состояния HTTP насчитывается более шестидесяти, однако в повседневной практике активно применяется лишь около шестнадцати из них. И здесь возникает закономерный вопрос: почему с развитием технологий список кодов практически не пополняется?
Протокол HTTP развивается весьма активно — несмотря на то что ему уже более тридцати лет. Третья версия протокола, HTTP/3, начала поддерживаться браузерами лишь в последние несколько лет. Казалось бы, новые возможности должны порождать новые ситуации, а следовательно — и новые коды для их описания. Однако этого не происходит, и причина проста.

Со времён создания HTTP Всемирная паутина стала несопоставимо быстрее, надёжнее и богаче возможностями. Необходимость максимально сжато, буквально несколькими байтами, сообщать о статусе соединения — ушла в прошлое. Сегодня загрузить полноценную страницу с подробным описанием проблемы и вариантами её решения не составляет никакого труда. Именно поэтому, например, так и остался незадействованным код 402 Payment Required, который изначально предназначался для описания статуса онлайн-платежей. Зачем городить специальный код, если куда проще и нагляднее просто показать пользователю страницу с информацией о платеже?

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

Система кодов HTTP — это одновременно и памятник инженерной мысли, и живой рабочий инструмент. В ней запечатлена история становления интернета: от нестабильных телефонных соединений 1990-х до гигабитных каналов наших дней. И в следующий раз, когда браузер покажет вам лаконичное «404 Not Found», за этими тремя цифрами вы увидите нечто большее, чем просто сообщение об ошибке.