HTTP Flashcards
Что такое HTTP?
HTTP – протокол прикладного уровня. Он предназначен для общения между двумя программами (клиентом и сервером), находящимися на разных компьютерах. Но, сам по себе, HTTP не может соединять два удаленных компьютера. Для этого используются другие протоколы, среди которых TCP. Именно TCP позволяет соединить программы на удаленных компьютерах, создав канал для общения друг с другом. Для этого нужно знать два параметра: ip-адрес компьютера, к которому нужно подключиться, и порт, на котором “висит” нужная программа
Дефолтные порты HTTP/HTTPS
HTTP: 80
HTTPS: 443
Что из себя представляет сам запрос?
HEAD / HTTP/1.0
User-Agent: google chrome
Запрос состоит из нескольких частей. Первая часть — стартовая строка (request line). Вторая — заголовки.
Что из себя представляет стартовая строка?
В стартовой строке мы указываем специальное слово, еще говорят “глагол”. В данном случае мы будем использовать глагол HEAD. Он очень простой, и просит сервер отдать только заголовки, без содержимого. Более распространенным является GET. Именно с помощью GET мы запрашиваем содержимое сайта.
После глагола указывается путь к ресурсу request URI. Если мы указываем /, это обозначает просто корень сайта.
Что из себя представляет заголовок?
Заголовки позволяют передавать дополнительную информацию, например браузеры предоставляют информацию о себе, чтобы было понятно откуда идет запрос. Кроме этого они указывают какие форматы сжатия поддерживают, в каком формате готовы принимать ответ и так далее. Количество стандартных заголовков достаточно большое, помимо них можно добавлять любые свои.
Давайте рассмотрим, как выглядят заголовки. Мы указываем имя и через двоеточие какое-то значение: REFERER: value. Заголовки часто указывают заглавными буквами, но регистр здесь не важен. Порядок заголовков также не специфицирован. В каком бы порядке мы ни передали заголовки, тело ответа будет разбираться только все вместе.
Браузерами используется много заголовков, например, user-agent. Этот заголовок используется для аналитики, а также, когда необходимо адаптировать страницы сайта под разные экраны или браузеры.
Правила протокола
Важно помнить, поскольку это протокол, и у него есть определенные правила, то нарушать их нельзя. HTTP — текстовый протокол. Все правила основаны на простых соглашениях. Например, несколько заголовков отделяются друг от друга переводом строки (и никак иначе!). Мы не можем записать их в одну строку, через запятую или как-то еще. Все очень строго.
каким образом сервер поймет, что вы закончили передавать данные?
Это должен быть какой-то маркер, определитель. В HTTP это делается с помощью двух переводов строки. После этого сервер считает что все данные были отправлены и больше данных не будет. То есть фактически два перевода строки (перевод после последнего заголовка и пустая строка) приводят к отправке данных
Что из себя представляет ответ?
HTTP/1.0 200 OK Date: Sat, 18 Jan 2020 09:24:50 GMT Expires: -1
status line: Версия протокола, код ответа, сообщение.
Заголовки
Закрытие соединения хостом.
В конце мы видим одну интересную деталь: Connection closed by foreign host. Запрос соединения был закрыт внешним хостом. Так работает практически все в интернете. Обычно серверы настроены на 30-секундный интервал и закрывают соединение, если в течение этого интервала ничего не приходит.
Что (обычно) означает сообщение “Connection closed by foreign host”, отправленное веб-сервером?
превышен интервал ожидания, соединение закрыто
HTTP-запрос невозможен без
стартовой строки
Как при HTTP-запросе обозначается конец запроса?
два перевода строки
Как выполнить запрос?
telnet localhost 8080
GET /about HTTP/1.0
Протокол HTTP 1.1 расширяет возможности предыдущей версии и добавляет виртуальные хосты
Предыдущая версия требует наличия только request line. В ней мы описываем, какой путь на сайте мы хотим посмотреть. Но упоминания сайта как такового здесь нет. При этом мы подключаемся по telnet к конкретному IP адресу. Отсюда можно сделать вывод, что понятие домена (доменного имени) при использовании HTTP 1.0 неважно. Действительно, эта версия была создана в те времена, когда считалось, что один IP адрес соответствует одному сайту. Естественно, это не могло продолжаться долго, потому что рост интернета был стремительным. И HTTP 1.1 ввел такое понятие как виртуальные хосты. С точки зрения реализации в протоколе HTTP появилась одна небольшая деталь. Кроме request line стал обязательным еще и заголовок, который называется host. Он определяет, какой именно домен должен быть возвращен с этого IP адреса.
HEAD / HTTP/1.1
host: hexlet.io
HTTP 1.1 вводит еще одно понятие по умолчанию, которое называется keep-alive
keep-alive означает, что соединение TCP, по которому ходит HTTP, не закрывается. Причем по умолчанию так должны себя вести все веб-сервера. Основная цель введения этой фичи в том, чтобы сократить использование ресурсов, уменьшить нагрузку на процессор, открывать меньше TCP-соединений (установка каждого TCP-соединения занимает время), уменьшить время ожидания (latency). Когда мы открываем сайт, то обычно с одного домена грузится несколько ресурсов. keep-alive позволяет открывать и использовать одно соединение, которое не будет закрыто до тех пор, пока это не будет указано явно, либо не произойдет таймаут. Таймаут зависит от того, какой браузер и какой веб-сервер используется.
Закрытие соединения HTTP1.1
Мы также можем указать, что хотим закрыть соединение. Для этого после установки соединения и передачи стандартных заголовков нужно передать еще один заголовок. Он называется connection: close. Тогда keep-alive будет отключен, и после получения ответа мы увидим сообщение, что хост закрыл соединение: Connection closed by foreign host.
Чем по сути является HTTP?
Искусственным общим языком для передачи данных
Что из перечисленного является особенностью HTTP версии 1.1?
Возможность повторно использовать TCP-соединение вместо создания нового соединения при каждом запросе
Код 301 это
Код ответа
Тело HTTP-запроса
Строка запроса
Заголовки
Пустая строка
Тело запроса
Как передается тело ответа
Во время отправки ответа сервер формирует специальный заголовок, который называется Content-Length. Перед тем как отправить тело ответа, происходит вычисление его длины и записывается количество байт.
После того, как передан такой заголовок, другая сторона будет ожидать ровно столько байт, сколько в нем указано.
Дополнительный заголовок кроме Content-Length
не все серверы правильно работают при наличии только заголовка Content-Length. Им не хватает еще одного. Тип содержимого запроса или ответа, которое содержит body, должен быть как-то идентифицирован.
Когда сервер не может определить тип контента, он должен использовать заголовок Content-Type: application/octet-stream. Это означает, что в теле запроса передается просто поток байт.
Можно ли посылать body в любых формах запросов?
С точки зрения стандарта HTTP тело может присутствовать в любом запросе и никак не связано с глаголом. Посылать body можно в HEAD, POST, PUT и других запросах. Если мы посылаем body с GET, сервер никак не будет на это реагировать, более того, он и не должен, так как с практической точки зрения это не имеет смысла.
Что должен содержать ответ при выполнении запроса с использованием глагола HEAD?
заголовки
Какое значение содержится в поле “Content-Length” в ответе (response)?
количество байт, занимаемое телом ответа
Content-Length может присутствовать
и в запросе, и в ответе
Пример пост запроса с бади
POST /upload HTTP/1.1 Host: hexlet.local Content-Type: text/plain Content-length: 15 my request body
Что такое форма?
Формы — это элементы HTML, которые применяются для сбора информации от посетителей веб-сайта
Content-Type для форм по умолчанию
Content-Type: application/x-www-form-urlencoded
Пример отправленной формы
Это простой формат — ключ равно значение и амперсанд между ними.
login=smith&password=12345678
Пример запроса с данными формы
telnet localhost 8080 POST /login HTTP/1.1 Host: hexlettesthost.com Content-Type: application/x-www-form-urlencoded Content-Length: 29 login=smith&password=12345678 # отправляем данные
Как определяется длина Content-Length?
Количество символов