Оригинальная статья: фанмэнъюань
HTTP — это протокол прикладного уровня, основанный на протоколе TCP/IP и являющийся базовым протоколом современного Интернета. Он указывает формат связи между клиентом и сервером и занятый сервисный порт 80 (HTTPS — 443).
Версия
Протокол HTTP испытал в общей сложности4
версии:
HTTP 0.9 -> HTTP 1.0 -> HTTP 1.1 -> HTTP 2
HTTP 0.9
HTTP 0.9 — самая старая версия
- только поддержка
GET
Метод запроса: поскольку другие методы запроса не поддерживаются, клиент не может передать серверу слишком много информации. - Нет концепции заголовка запроса: поэтому номер версии не может быть указан в запросе, а сервер имеет возможность возвращать только строки HTML.
- После ответа сервера немедленно закройте TCP-соединение.
HTTP 1.0
С выпуском HTTP 1.0 эта версия:
- Добавлены POST, DELETE, PUT, HEADER и другие способы запроса
- Добавлена концепция заголовка запроса и заголовка ответа с указанием номера версии протокола HTTP в сообщении и некоторой другой метаинформации (например, код состояния, разрешение, кеш, кодировка контента).
- Расширен формат содержимого передачи, могут передаваться изображения, аудио- и видеоресурсы, двоичные файлы и т. д.
Главное в этой версии — расширить метаинформацию запросов и ответов, клиент и сервер имеют больше доступа ко всей информации текущего запроса, чтобы лучше и быстрее обрабатывать контент, связанный с запросом.
заголовок запроса
заголовки для простого запроса
GET / HTTP/1.0
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_5)
Accept: */*
Вы можете видеть, что после метода запроса указывается местоположение запрошенного ресурса + версия протокола запроса, за которой следуют некоторые конфигурации информации о клиенте.
заголовок ответа
Простой заголовок ответа (v1.0)
HTTP/1.0 200 OK
Content-Type: text/plain
Content-Length: 137582
Expires: Thu, 05 Dec 1997 16:00:00 GMT
Last-Modified: Wed, 5 August 1996 15:55:28 GMT
// 这是一个空行
...数据内容
Первый заголовок ответа сервера — это версия протокола запроса, за которой следует код состояния запроса и описание кода состояния, а содержимое после этого — некоторое описание возвращаемого содержимого.
Content-Type
В HTTP 1.0 может быть передан любой ресурс, и формат передачи тоже разный, когда клиент получает содержимое тела ответа, он основывается на этомContent-Type
анализировать. Таким образом, сервер должен вернуться с этим полем.
некоторые общиеContent-Type
может относиться кДиаграмма.
ЭтиContent-Type
Существует общий термин, называемыйMIME type
.
оMIME type
, хочу вставить сюда небольшой эпизод:
В браузере Chrome, когда MIME-тип данных, возвращаемых междоменным запросом, не соответствует MIME-типу междоменного тега, браузер запускает CORB для защиты данных от утечки. Защищенные данные: html, xml, json. (например: типы MIME, поддерживаемые тегами script и img, несовместимы с ними), поэтому сервер должен возвращать правильный тип при возврате ресурсов.
Content-Type
, чтобы браузер не блокировал возвращаемые результаты.Проблема, с которой я столкнулся, заключалась в том, что после версии chrome v76 данные возвращались при запросе ресурса междоменного изображения.
Content-Type
нетimage/*
, изображение будет заблокировано, и страница не будет отображать изображение.
характеристика
- Без гражданства: сервер не отслеживает запрошенное состояние
- Нет подключения: браузеру необходимо установить tcp-соединение для каждого запроса.
нет статуса
Для функций без сохранения состояния механизм cookie/сеанса может использоваться для аутентификации и записи состояния.
Нет соединения
Существует два типа проблем с производительностью, вызванных отсутствием соединения:
- Невозможно повторно использовать соединение
Каждый раз, когда отправляется запрос, требуется tcp-соединение (то есть 3 рукопожатия и 4 волны), что делает коэффициент использования сети очень низким. - блокировка в начале очереди
HTTP 1.0 предусматривает, что следующий запрос может быть отправлен только после получения ответа на предыдущий запрос, если предыдущий запрос заблокирован, последующий запрос также будет заблокирован.
HTTP 1.1
HTTP 1.1 был запущен через полгода после выпуска 1.0, доведя версию 1.0 до совершенства. В настоящее время все еще существует множество интернет-проектов, предоставляющих услуги на базе HTTP 1.1.
характеристика
- Длинное соединение: новое поле «Соединение», вы можете установить значение поддержания активности, чтобы соединение не отключалось.
- Конвейер: на основе указанного выше длинного соединения конвейер может продолжать отправлять последующие запросы, не дожидаясь ответа на первый запрос, но порядок ответов по-прежнему возвращается в порядке запросов.
- Обработка кеша: новое поле cache-control
- передача точки останова
Длинное соединение
HTTP 1.1 поддерживает длинное соединение по умолчанию и сохраняет непрерывное соединение tcp после завершения передачи данных и продолжает использовать этот канал для передачи данных.
Трубопровод
Основываясь на длинных соединениях, давайте сначала посмотрим на ответ на запрос без конвейерной обработки:
tcp не отключен, используется тот же канал
请求1 > 响应1 --> 请求2 > 响应2 --> 请求3 > 响应3
Конвейерный ответ на запрос:
请求1 --> 请求2 --> 请求3 > 响应1 --> 响应2 --> 响应3
Даже если сервер сначала готовит ответ 2, он сначала возвращает ответ 1 в порядке запросов.
Несмотря на конвейерную обработку, несколько запросов могут быть отправлены одновременно, но ответы по-прежнему возвращаются последовательно, что по-прежнему не может решить проблему блокировки заголовка строки.
Обработка кеша
Когда браузер запрашивает ресурс, он сначала проверяет, есть ли кешированный ресурс.Если кеш есть, он будет выбран напрямую, и запрос не будет отправлен.Если кеша нет, запрос будет отправлен. Кэш управляется установкой поля cache-control.
передача точки останова
При загрузке/скачивании ресурсов, если ресурсы слишком велики, разделите их на несколько частей и загружайте/скачивайте их по отдельности.Если вы столкнулись с сбоем в сети, вы можете продолжить запрос с места, которое уже было загружено/скачено, вместо начиная с нуля, повышая эффективность
HTTP 2
характеристика:
- Бинарное кадрирование
- Мультиплексирование: одновременная отправка запросов и ответов на основе общего TCP-канала.
- сжатие заголовка
- Сервер Push: сервер может дополнительно передавать ресурсы клиенту без явного запроса клиента.
Бинарное кадрирование
Разбор HTTP 1.x основан на тексте После HTTP 2 вся передаваемая информация делится на более мелкие сообщения и кадры, и они кодируются в двоичном формате для повышения эффективности передачи.
мультиплексирование
Отправляйте запросы и ответы одновременно на основе общих TCP-ссылок. На основе двоичного кадрирования все обращения под одним и тем же доменным именем осуществляются с одного и того же TCP-соединения. HTTP-сообщения разбиваются на независимые кадры и отправляются не по порядку. заголовки собирают сообщение.
сжатие заголовка
Поскольку HTTP не имеет состояния, каждому запросу требуется информация заголовка, чтобы идентифицировать релевантную информацию этого запроса, поэтому это приведет к передаче большого количества дублирующейся информации.Когда количество запросов увеличивается, потребляемые ресурсы будут постепенно накапливаться. Таким образом, HTTP 2 может поддерживать словарь информации заголовка, дифференцированно обновлять информацию заголовка и сокращать ресурсы, занимаемые передачей информации заголовка.Введение в технологию сжатия заголовков HTTP/2.
HTTPS и HTTP
- Протокол HTTPS должен подать заявку на сертификат
- HTTP и HTTPS используют разные порты, первый — 80, второй — 443.
- Протокол HTTP работает поверх TCP, весь передаваемый контент представляет собой открытый текст, HTTPS работает поверх SSL/TLS, SSL/TLS работает поверх TCP, и весь передаваемый контент зашифрован.
- HTTPS может эффективно предотвратить захват оператора связи
конец
Хотя HTTP 2 был выпущен в 2015 году, в современных интернет-сервисах используется немало служб, использующих HTTP 1.x. Одна из основных причин заключается в том, что текущие основные браузеры, такие как Chrome и Firefox, поддерживают только протокол HTTP 2, развернутый на основе TLS означает, что ваш сайт необходимо сначала обновить до HTTPS. Однако для HTTPS требуется сертификат.
Конечно, если ваш веб-сайт был обновлен до HTTPS, очень легко перейти на HTTP 2. Интерфейсный сервисный инструментnginx
может сделать все это для вас, см.Open Source NGINX 1.9.5 Released with HTTP/2 Support