HTML Diff
0 added 0 removed
Original 2026-01-01
Modified 2026-02-26
1 <p><strong>HTTP</strong>- текстовый протокол, с помощью которого взаимодействуют клиент, например, браузер и сервер. Работает это так. Пользователь шлет определенный запрос на сервер, запрашивая или передавая нужные данные, а сервер, в зависимости от запроса, выполняет нужную логику и возвращает результат, обычно это HTML-страница либо редирект.</p>
1 <p><strong>HTTP</strong>- текстовый протокол, с помощью которого взаимодействуют клиент, например, браузер и сервер. Работает это так. Пользователь шлет определенный запрос на сервер, запрашивая или передавая нужные данные, а сервер, в зависимости от запроса, выполняет нужную логику и возвращает результат, обычно это HTML-страница либо редирект.</p>
2 <p>Для того чтобы посмотреть, как работает HTTP, мы будем использовать сервис<a>HTTP Server</a>, созданный специально для экспериментов. Он включает в себя ненастоящие данные, с которыми можно попрактиковаться. Для запросов используется специальная утилита, которая называется<em>telnet</em>(<a>пример HTTP-запроса, выполненного с помощью утилиты telnet</a>).</p>
2 <p>Для того чтобы посмотреть, как работает HTTP, мы будем использовать сервис<a>HTTP Server</a>, созданный специально для экспериментов. Он включает в себя ненастоящие данные, с которыми можно попрактиковаться. Для запросов используется специальная утилита, которая называется<em>telnet</em>(<a>пример HTTP-запроса, выполненного с помощью утилиты telnet</a>).</p>
3 <h2>Что такое telnet?</h2>
3 <h2>Что такое telnet?</h2>
4 <p><strong>Telnet</strong>- это консольная программа, с помощью которой можно вручную установить соединение с удалённым сервером по сети и напрямую обмениваться данными. С её помощью легко "залезть под капот" и посмотреть, как устроены сетевые протоколы.</p>
4 <p><strong>Telnet</strong>- это консольная программа, с помощью которой можно вручную установить соединение с удалённым сервером по сети и напрямую обмениваться данными. С её помощью легко "залезть под капот" и посмотреть, как устроены сетевые протоколы.</p>
5 <p>Telnet устанавливает TCP-соединение с указанным IP-адресом и портом, после чего всё, что вы вводите, отправляется серверу напрямую. Это позволяет своими руками набрать HTTP-запрос и увидеть "сырой" ответ сервера, без всяких удобств, которые делают браузеры.</p>
5 <p>Telnet устанавливает TCP-соединение с указанным IP-адресом и портом, после чего всё, что вы вводите, отправляется серверу напрямую. Это позволяет своими руками набрать HTTP-запрос и увидеть "сырой" ответ сервера, без всяких удобств, которые делают браузеры.</p>
6 <p>Например, так можно подключиться к нашему учебному серверу, эту команду нужно набрать в терминале:</p>
6 <p>Например, так можно подключиться к нашему учебному серверу, эту команду нужно набрать в терминале:</p>
7 <p>После выполнения этой команды telnet устанавливает TCP-соединение с сервером на порту 80 и переходит в режим ожидания ввода HTTP-запроса. Все, что вы вводите после подключения, отправляется серверу напрямую, что позволяет вручную формировать запросы и наблюдать ответы в "сыром" виде.</p>
7 <p>После выполнения этой команды telnet устанавливает TCP-соединение с сервером на порту 80 и переходит в режим ожидания ввода HTTP-запроса. Все, что вы вводите после подключения, отправляется серверу напрямую, что позволяет вручную формировать запросы и наблюдать ответы в "сыром" виде.</p>
8 <h3>HTTP и нижележащие протоколы</h3>
8 <h3>HTTP и нижележащие протоколы</h3>
9 <p>HTTP - это протокол прикладного уровня, предназначенный для общения между клиентом и сервером на разных компьютерах. Однако сам по себе HTTP не может соединять удаленные компьютеры; для этого используются другие протоколы, такие как TCP. TCP создает канал для общения между программами на удаленных компьютерах, для чего необходимы IP-адрес целевого компьютера и порт, на котором работает нужная программа.</p>
9 <p>HTTP - это протокол прикладного уровня, предназначенный для общения между клиентом и сервером на разных компьютерах. Однако сам по себе HTTP не может соединять удаленные компьютеры; для этого используются другие протоколы, такие как TCP. TCP создает канал для общения между программами на удаленных компьютерах, для чего необходимы IP-адрес целевого компьютера и порт, на котором работает нужная программа.</p>
10 <p>Команда telnet выше делает именно это, она выполняет соединение по TCP и только после этого входит в режим взаимодействия по HTTP. При условии, что указан правильный ip-адрес и порт для соединения. И на этом моменте возникает два вопроса:</p>
10 <p>Команда telnet выше делает именно это, она выполняет соединение по TCP и только после этого входит в режим взаимодействия по HTTP. При условии, что указан правильный ip-адрес и порт для соединения. И на этом моменте возникает два вопроса:</p>
11 <ol><li>Мы передали адрес сайта, откуда берется ip-адрес? Любой адрес сайта это просто имя, за которым скрывается ip-адрес. Имя задано для удобства, так его проще запомнить. Однако все сетевые программы, среди которых браузеры и telnet, выполняют преобразование имени сайта в его ip-адрес. Делается это с помощью системы DNS, еще одного столпа интернета.</li>
11 <ol><li>Мы передали адрес сайта, откуда берется ip-адрес? Любой адрес сайта это просто имя, за которым скрывается ip-адрес. Имя задано для удобства, так его проще запомнить. Однако все сетевые программы, среди которых браузеры и telnet, выполняют преобразование имени сайта в его ip-адрес. Делается это с помощью системы DNS, еще одного столпа интернета.</li>
12 </ol><ol><li>Почему порт имеет номер 80? Это общепринятое соглашение. Сайты, доступные по HTTP, доступны на порту 80, а по HTTPS - на порту 443. Именно поэтому в браузерах порты не указываются, браузер подставляет их автоматически.</li>
12 </ol><ol><li>Почему порт имеет номер 80? Это общепринятое соглашение. Сайты, доступные по HTTP, доступны на порту 80, а по HTTPS - на порту 443. Именно поэтому в браузерах порты не указываются, браузер подставляет их автоматически.</li>
13 </ol><p>Если соединение произошло успешно, то telnet выводит на экран такие строчки:</p>
13 </ol><p>Если соединение произошло успешно, то telnet выводит на экран такие строчки:</p>
14 <p>После подключения веб-сервер входит в режим ожидания HTTP-запроса. Осталось его послать.</p>
14 <p>После подключения веб-сервер входит в режим ожидания HTTP-запроса. Осталось его послать.</p>
15 <h2>Что из себя представляет сам запрос?</h2>
15 <h2>Что из себя представляет сам запрос?</h2>
16 <p>Запрос состоит из нескольких частей. Первая часть -<em>стартовая строка</em>(<em>request line</em>). Вторая - заголовки.</p>
16 <p>Запрос состоит из нескольких частей. Первая часть -<em>стартовая строка</em>(<em>request line</em>). Вторая - заголовки.</p>
17 <p>В<em>стартовой строке</em>мы указываем специальное слово, еще говорят "глагол". В HTTP описаны разные глаголы, но мы сейчас не будем вдаваться в подробности. Просто скажем, что они определяют, как реагировать на этот запрос. И в данном случае мы будем использовать глагол HEAD. Он очень простой, и просит сервер отдать только заголовки, без содержимого. Более распространенным является GET. Именно с помощью GET мы запрашиваем содержимое сайта.</p>
17 <p>В<em>стартовой строке</em>мы указываем специальное слово, еще говорят "глагол". В HTTP описаны разные глаголы, но мы сейчас не будем вдаваться в подробности. Просто скажем, что они определяют, как реагировать на этот запрос. И в данном случае мы будем использовать глагол HEAD. Он очень простой, и просит сервер отдать только заголовки, без содержимого. Более распространенным является GET. Именно с помощью GET мы запрашиваем содержимое сайта.</p>
18 <p>После глагола указывается путь к ресурсу<em>request URI</em>. Если мы указываем /, это обозначает просто корень сайта. Ресурс может быть любым, например, /users - может быть ресурсом пользователей, а /courses - ресурсом курсов. Имя ресурса зависит не только от того, к какому ресурсу мы хотим получить доступ, но и от сервера. Разные серверы предоставляют доступ к разным ресурсам.</p>
18 <p>После глагола указывается путь к ресурсу<em>request URI</em>. Если мы указываем /, это обозначает просто корень сайта. Ресурс может быть любым, например, /users - может быть ресурсом пользователей, а /courses - ресурсом курсов. Имя ресурса зависит не только от того, к какому ресурсу мы хотим получить доступ, но и от сервера. Разные серверы предоставляют доступ к разным ресурсам.</p>
19 <p>Дальше все, что нужно сделать, это указать название протокола и его версию. В этом курсе рассматриваются версии HTTP 1.0 и 1.1, это основа протокола и знакомство с ним стоит начинать именно с них. Между версиями есть принципиальные отличия, которые нужно хорошо знать и понимать. Версия 1.0 продолжает использоваться в различных целях утилитами командной строки.</p>
19 <p>Дальше все, что нужно сделать, это указать название протокола и его версию. В этом курсе рассматриваются версии HTTP 1.0 и 1.1, это основа протокола и знакомство с ним стоит начинать именно с них. Между версиями есть принципиальные отличия, которые нужно хорошо знать и понимать. Версия 1.0 продолжает использоваться в различных целях утилитами командной строки.</p>
20 <p>В принципе этого достаточно, и для 1.0 больше ничего делать не нужно:</p>
20 <p>В принципе этого достаточно, и для 1.0 больше ничего делать не нужно:</p>
21 <p>Дальше идут заголовки. Что это? Заголовки позволяют передавать дополнительную информацию, например браузеры предоставляют информацию о себе, чтобы было понятно откуда идет запрос. Кроме этого они указывают какие форматы сжатия поддерживают, в каком формате готовы принимать ответ и так далее. Количество стандартных заголовков достаточно большое, помимо них можно добавлять любые свои.</p>
21 <p>Дальше идут заголовки. Что это? Заголовки позволяют передавать дополнительную информацию, например браузеры предоставляют информацию о себе, чтобы было понятно откуда идет запрос. Кроме этого они указывают какие форматы сжатия поддерживают, в каком формате готовы принимать ответ и так далее. Количество стандартных заголовков достаточно большое, помимо них можно добавлять любые свои.</p>
22 <p>Давайте рассмотрим, как выглядят заголовки. Мы указываем имя и через двоеточие какое-то значение:<em>REFERER: value</em>. Заголовки часто указывают заглавными буквами, но регистр здесь не важен. Порядок заголовков также не специфицирован. В каком бы порядке мы ни передали заголовки, тело ответа будет разбираться только все вместе.</p>
22 <p>Давайте рассмотрим, как выглядят заголовки. Мы указываем имя и через двоеточие какое-то значение:<em>REFERER: value</em>. Заголовки часто указывают заглавными буквами, но регистр здесь не важен. Порядок заголовков также не специфицирован. В каком бы порядке мы ни передали заголовки, тело ответа будет разбираться только все вместе.</p>
23 <p>Браузерами используется много заголовков, например,<em>user-agent</em>. Этот заголовок используется для аналитики, а также, когда необходимо адаптировать страницы сайта под разные экраны или браузеры. Но и без него все должно работать:</p>
23 <p>Браузерами используется много заголовков, например,<em>user-agent</em>. Этот заголовок используется для аналитики, а также, когда необходимо адаптировать страницы сайта под разные экраны или браузеры. Но и без него все должно работать:</p>
24 <p>Важно помнить, поскольку это протокол, и у него есть определенные правила, то нарушать их нельзя. HTTP - текстовый протокол. Все правила основаны на простых соглашениях. Например, несколько заголовков отделяются друг от друга переводом строки (и никак иначе!). Мы не можем записать их в одну строку, через запятую или как-то еще. Все очень строго. А каким образом сервер поймет, что вы закончили передавать данные? Это должен быть какой-то маркер, определитель. В HTTP это делается с помощью двух переводов строки. После этого сервер считает что все данные были отправлены и больше данных не будет. То есть фактически два перевода строки (перевод после последнего заголовка и пустая строка) приводят к отправке данных.</p>
24 <p>Важно помнить, поскольку это протокол, и у него есть определенные правила, то нарушать их нельзя. HTTP - текстовый протокол. Все правила основаны на простых соглашениях. Например, несколько заголовков отделяются друг от друга переводом строки (и никак иначе!). Мы не можем записать их в одну строку, через запятую или как-то еще. Все очень строго. А каким образом сервер поймет, что вы закончили передавать данные? Это должен быть какой-то маркер, определитель. В HTTP это делается с помощью двух переводов строки. После этого сервер считает что все данные были отправлены и больше данных не будет. То есть фактически два перевода строки (перевод после последнего заголовка и пустая строка) приводят к отправке данных.</p>
25 <h2>Что из себя представляет ответ?</h2>
25 <h2>Что из себя представляет ответ?</h2>
26 <p>Давайте сделаем запрос и посмотрим, что нам вернется в ответ. Сделаем HEAD запрос и посмотрим, что будет возвращено:</p>
26 <p>Давайте сделаем запрос и посмотрим, что нам вернется в ответ. Сделаем HEAD запрос и посмотрим, что будет возвращено:</p>
27 <p>В ответ на запрос приходит response, который состоит из status line, например, HTTP/1.1 200 OK. Эта строка указывает на используемый протокол (в данном случае HTTP/1.1, о котором мы поговорим в следующем уроке) и статус ответа 200 OK. В HTTP определено множество статусов, таких как 400 и 500, которые информируют о различных ситуациях, например, о том, что информация не найдена или произошла ошибка на сервере. Каждый статус имеет мнемоническое название, передаваемое в последней части строки. Статус 200 OK означает, что запрос выполнен успешно -<em>success</em>!</p>
27 <p>В ответ на запрос приходит response, который состоит из status line, например, HTTP/1.1 200 OK. Эта строка указывает на используемый протокол (в данном случае HTTP/1.1, о котором мы поговорим в следующем уроке) и статус ответа 200 OK. В HTTP определено множество статусов, таких как 400 и 500, которые информируют о различных ситуациях, например, о том, что информация не найдена или произошла ошибка на сервере. Каждый статус имеет мнемоническое название, передаваемое в последней части строки. Статус 200 OK означает, что запрос выполнен успешно -<em>success</em>!</p>
28 <p>Далее выводится большое количество различных заголовков. В них нет ничего сложного, и их не нужно все учить (есть какие-то общие, и они достаточно понятны). Все заголовки состоят из ключа, двоеточия и значения. Можно заметить, что есть вещи, связанные с кодировкой, кешированием. Некоторые заголовки специфичны для текущего сервера. Например, X-XSS-Protection: 0, где X указывает на кастомный заголовок. Но никакой веб-сервер, никакой веб-браузер не будут ломаться при посылке таких дополнительных заголовков.</p>
28 <p>Далее выводится большое количество различных заголовков. В них нет ничего сложного, и их не нужно все учить (есть какие-то общие, и они достаточно понятны). Все заголовки состоят из ключа, двоеточия и значения. Можно заметить, что есть вещи, связанные с кодировкой, кешированием. Некоторые заголовки специфичны для текущего сервера. Например, X-XSS-Protection: 0, где X указывает на кастомный заголовок. Но никакой веб-сервер, никакой веб-браузер не будут ломаться при посылке таких дополнительных заголовков.</p>
29 <p>Именно в HTTP 1.0 в конце после получения данных происходит закрытие соединения.</p>
29 <p>Именно в HTTP 1.0 в конце после получения данных происходит закрытие соединения.</p>
30 <p>В конце мы видим одну интересную деталь:<em>Connection closed by foreign host.</em>Запрос соединения был закрыт внешним хостом. Так работает практически все в интернете. Обычно серверы настроены на 30-секундный интервал и закрывают соединение, если в течение этого интервала ничего не приходит.</p>
30 <p>В конце мы видим одну интересную деталь:<em>Connection closed by foreign host.</em>Запрос соединения был закрыт внешним хостом. Так работает практически все в интернете. Обычно серверы настроены на 30-секундный интервал и закрывают соединение, если в течение этого интервала ничего не приходит.</p>
31 <p>Поэтому с telnet новичкам работать чуть тяжелее. Они медленно набирают запрос, и за это время соединение закрывается, что довольно неприятно. Поэтому лучше делать записи в отдельном файле и после этого вставлять их в telnet.</p>
31 <p>Поэтому с telnet новичкам работать чуть тяжелее. Они медленно набирают запрос, и за это время соединение закрывается, что довольно неприятно. Поэтому лучше делать записи в отдельном файле и после этого вставлять их в telnet.</p>