Глубокое понимание протокола HTTP

задняя часть сервер HTTP браузер

Введение

HTTPПротокол (протокол передачи гипертекста), который представляет собой протокол передачи прикладного уровня, основанный на протоколе TCP.Проще говоря, это правило для передачи данных между клиентом и сервером.

Уведомление: Роли клиента и сервера не фиксированы.Один конец выступает в качестве клиента, а также может выступать в качестве сервера в запросе. Это зависит от отправителя запроса. Протокол HTTP относится к прикладному уровню и построен поверх протокола транспортного уровня TCP. Клиент устанавливает TCP-соединение с сервером, а затем отправляет HTTP-запросы и получает HTTP-ответы, обращаясь к интерфейсу Socket для вызова протокола TCP.

HTTPэтонет статуса(без гражданства) протокол,HTTPСам протокол не сохраняет отправленный запрос и соответствующее состояние связи. Целью этого является сохранение простоты протокола HTTP, чтобы он мог быстро обрабатывать большое количество транзакций и повышать эффективность.

Однако во многих сценариях приложений нам необходимо, чтобы пользователь оставался в системе или записывал товары в корзине пользователя. так какHTTPявляется протоколом без сохранения состояния, поэтому необходимо ввести некоторые методы для записи состояния управления, такие какCookie.

текст

HTTP URL

HTTP URLСодержит подробную информацию для поиска ресурса в следующем формате:

  http://host[":"port][abs_path]

HTTP-запрос

Следующее изображение — это изображение, найденное в Интернете, и я думаю, что оно может очень хорошо отображать формат данных, отправляемых HTTP-запросом.

Как видно из вышеуказанного рисунка, HTTP-запрос состоит из трех частей: строка запроса, заголовок сообщения и тело запроса.

Строка состояния HTTP-запроса

строка запроса по запросуMethod, URLполя иHTTP VersionОн состоит из трех частей. Как правило, строка запроса определяет метод запроса этого запроса, запрошенный адрес и версию протокола HTTP, которой следует следовать. Например:

GET /example.html HTTP/1.1 (CRLF)

Методы протокола HTTP:

  • GET: проситьПолучатьРесурс, указанный Request-URI
  • POST: после ресурса, указанного Request-URIУвеличиватьновые данные
  • HEAD: Запрос на получение ресурса, указанного Request-URI.заголовок ответного сообщения
  • PUT: сервер запросовхранить или изменятьресурс с Request-URI в качестве идентификатора
  • DELETE: сервер запросовУдалитьРесурс, указанный Request-URI
  • TRACE: запросите у сервера отправку полученной информации запроса, в основном используемой длятест или диагноз
  • CONNECT: зарезервировано для использования в будущем
  • OPTIONS: запрос на запрос производительности сервера или на запрос параметров и требований, связанных с ресурсом.

Заголовки HTTP-запроса

Заголовок сообщения состоит из ряда пар ключ-значение, что позволяет клиенту отправлять некоторую дополнительную информацию на сервер или информацию о самом клиенте, в том числе:

Header объяснять Пример
Accept Указывает тип контента, который может получать клиент. Accept: text/plain, text/html
Accept-Charset Набор кодировок символов, принимаемых браузером Accept-Charset: iso-8859-5,utf-8
Accept-Encoding Указывает тип кодирования сжатия содержимого, возвращаемый веб-сервером, который может поддерживать браузер. Accept-Encoding: compress, gzip
Accept-Language Языки, принимаемые браузером Accept-Language: en,zh
Accept-Ranges Можно запросить одно или несколько полей подобласти объекта веб-страницы. Accept-Ranges: bytes
Authorization Тип сертификата авторизации для HTTP-авторизации Authorization: Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ==
Cache-Control Указывает механизм кэширования, за которым следуют запросы и ответы. Cache-Control: no-cache
Connection Указывает, требуются ли постоянные подключения (HTTP 1.1 по умолчанию использует постоянные подключения) Connection: close
Cookie Когда HTTP-запрос отправлен, сохраните все значения cookie ниже доменного имени запроса на веб-сервере. Cookie: $Version=1; Skin=new;
Content-Length Длина запрошенного контента Content-Length: 348
Content-Type Запрошенная информация MIME, соответствующая объекту Content-Type: application/x-www-form-urlencoded
Date дата и время отправки запроса Date: Tue, 15 Nov 2010 08:12:31 GMT
Expect Запрошено определенное поведение сервера Expect: 100-continue
From Электронная почта пользователя, сделавшего запрос From: user@email.com
Host Укажите доменное имя и номер порта запрашиваемого сервера Host: www.zcmhi.com
If-Match Действителен только в том случае, если содержимое запроса соответствует объекту Если-совпадение: "737060cd8c284d8af7ad3082f209582d"
If-Modified-Since Если часть запроса изменена по истечении указанного времени, запрос считается успешным, и возвращается код 304, если он не был изменен. If-Modified-Since: Sat, 29 Oct 2010 19:43:31 GMT
If-None-Match Если содержимое не изменилось, верните код 304, параметр — это Etag, ранее отправленный сервером, и сравните его с Etag, возвращенным сервером, чтобы определить, изменился ли он. Если-нет-совпадения: "737060cd8c284d8af7ad3082f209582d"
If-Range Если сущность не изменилась, сервер отправляет клиенту недостающую часть, в противном случае он отправляет всю сущность. Параметр также является Etag Если-диапазон: "737060cd8c284d8af7ad3082f209582d"
If-Unmodified-Since Запрос выполняется только в том случае, если объект не был изменен после указанного времени. If-Unmodified-Since: Sat, 29 Oct 2010 19:43:31 GMT
Max-Forwards Ограничьте время прохождения информации через прокси и шлюзы Max-Forwards: 10
Pragma Используется для содержания инструкций, специфичных для реализации. Pragma: no-cache
Proxy-Authorization Сертификат полномочий для подключения к брокеру Proxy-Authorization: Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ==
Range Запросить только часть сущности, указав область действия Range: bytes=500-999
Referer Адрес предыдущей страницы, за которой следует текущая страница запроса, т.е. источник Referer: Woohoo.Регистрационный код Hi.com/archives/71…
TE Кодировка передачи, которую клиент готов принять, и информирует сервер о необходимости принять информацию заголовка. TE: trailers,deflate;q=0.5
Upgrade Укажите транспортный протокол к серверу для преобразования сервером (если поддерживается) Upgrade: HTTP/2.0, SHTTP/1.3, IRC/6.9, RTA/x11
User-Agent Содержимое User-Agent содержит информацию о пользователе, сделавшем запрос User-Agent: Mozilla/5.0 (Linux; X11)
Via Сообщить адрес промежуточного шлюза или прокси-сервера, протокол связи Via: 1.0 fred, 1.1 nowhere.com (Apache/1.1)
Warning Предупреждения о сообщениях Warn: 199 Miscellaneous warning

Тело HTTP-запроса

только при отправкеPOSTТело запроса будет только тогда, когда запрос будет сделан.GETМетод не имеет тела запроса.

Сообщение HTTP-запроса

HTTP-ответ

Аналогично HTTP-запросу, сначала предыдущее изображение:

Ответ HTTP также состоит из трех частей, включая строку состояния, заголовки сообщений и текст ответа.

Строка состояния ответа HTTP

Строка состояния также состоит из трех частей, включая версию протокола HTTP, код состояния и текстовое описание кода состояния. Например:

HTTP/1.1 200 OK (CRLF)

Код состояния ответа HTTP

Код состояния состоит из трех цифр, первая цифра определяет ответкатегория, и есть пять возможных значений:

  • 1xx:инструкции- Указывает, что запрос получен, продолжить обработку
  • 2xx:успех- Указывает, что запрос был успешно получен, понят, принят
  • 3xx:перенаправить- Для выполнения запроса требуются дальнейшие действия.
  • 4xx:Ошибка клиента- В запросе есть синтаксическая ошибка или запрос не может быть выполнен
  • 5xx:Ошибка на стороне сервера- сервер не смог выполнить законный запрос

Общие коды состояния, описания состояний, описания:

  • 200:OK- Запрос клиента выполнен успешно
  • 400:Bad Request- В клиентском запросе есть синтаксическая ошибка, которую сервер не может понять.
  • 401:Unauthorized- запрос не авторизован, этот код состояния должен совпадать сWWW-Authenticateполя заголовка, используемые вместе
  • 403:Forbidden- Сервер получает запрос, но отказывается обслуживать
  • 404:Not Found- Запрошенный ресурс не существует, например: был введен неверный URL-адрес.
  • 500:Internal Server Error- Произошла непредвиденная ошибка на сервере
  • 503:Server Unavailable- В настоящее время сервер не может обработать запрос клиента и может вернуться в нормальное состояние через некоторое время.

Описание кода состояния ответа HTTP

StatusCode Семантика кода состояния Китайское описание
100 Continue Продолжать. Клиент должен продолжить свой запрос
101 Switching Protocols Переключение протоколов. Сервер переключает протоколы по запросу клиента. Может переключаться только на протокол более высокого уровня, например, на более новую версию HTTP.
200 OK Запрос выполнен успешно. Обычно используется для запросов GET и POST.
201 Created созданный. Успешно запрошен и создан новый ресурс
202 Accepted принятый. Заявка принята, но не выполнена
203 Non-Authoritative Information Несанкционированная информация. Запрос выполнен успешно. Но возвращенная метаинформация находится не на исходном сервере, а на копии
204 No Content Без содержания. Сервер успешно обработал, но не вернул содержимого. Гарантирует, что браузер продолжает отображать текущий документ без обновления веб-страницы.
205 Reset Content Сбросить содержимое. Серверный процесс выполнен успешно, и пользовательский терминал (например, браузер) должен сбросить представление документа. Поля формы браузера можно очистить с помощью этого кода возврата.
206 Partial Content Часть. Сервер успешно обработал часть запроса GET
300 Multiple Choices множественный выбор. Запрошенный ресурс может включать несколько местоположений, и, соответственно, список характеристик и адресов ресурса может быть возвращен для выбора пользовательского терминала (например, браузера).
301 Moved Permanently Переехать навсегда. Запрошенный ресурс был окончательно перемещен на новый URI, возвращаемая информация будет включать новый URI, и браузер будет автоматически перенаправлен на новый URI. Любые новые запросы в будущем должны использовать вместо этого новый URI.
302 Найден Временно перемещен. Похоже на 301. Но ресурс перемещается только временно. Клиенты должны продолжать использовать исходный URI.
303 See Other Посмотрите другие адреса. Похоже на 301. Просмотр с использованием запросов GET и POST
304 Not Modified Без изменений. Запрошенный ресурс не был изменен, и ресурс не будет возвращен, когда сервер вернет этот код состояния. Клиенты обычно кэшируют посещенные ресурсы, предоставляя заголовок, указывающий, что клиент хочет вернуть только ресурсы, измененные после указанной даты.
305 Use Proxy Используйте прокси. Запрошенный ресурс должен быть доступен через прокси
306 Unused Устаревшие коды состояния HTTP
307 Temporary Redirect Временная переадресация. Похоже на 302. Перенаправление с помощью GET-запроса
400 Bad Request В клиентском запросе есть синтаксическая ошибка, которую сервер не может понять.
401 Unauthorized Запрос требует аутентификации пользователя
402 Payment Required зарезервировано для использования в будущем
403 Forbidden Сервер понимает запрос запрашивающего клиента, но отказывается выполнять запрос
404 Not Found Сервер не смог найти ресурс (веб-страницу) по запросу клиента. С помощью этого кода веб-дизайнеры могут настроить персонализированную страницу с надписью «Запрошенный вами ресурс не найден».
405 Method Not Allowed метод в клиентском запросе запрещен
406 Not Acceptable Сервер не может выполнить запрос на основе характеристик содержимого запроса клиента.
407 Proxy Authentication Required Запрос требует проверки подлинности прокси-сервера, аналогичной 401, но запрашивающая сторона должна использовать прокси-сервер для авторизации.
408 Request Time-out Сервер слишком долго ждет запроса, отправленного клиентом, и истекает время ожидания.
409 Conflict Сервер может вернуть этот код после завершения клиентского запроса PUT, и при обработке запроса сервером возник конфликт.
410 Gone Ресурс, запрошенный клиентом, больше не существует. 410 отличается от 404. Если ресурс был удален ранее безвозвратно, можно использовать код 410, а дизайнер сайта может указать новое местоположение ресурса через код 301.
411 Length Required Сервер не может обработать информацию запроса, отправленную клиентом без Content-Length
412 Precondition Failed Информация о запросе клиента с неправильными предварительными условиями
413 Request Entity Too Large Запрос был отклонен, так как запрошенный объект был слишком большим для обработки сервером. Чтобы предотвратить непрерывные запросы от клиентов, сервер может закрыть соединение. Если сервер не может временно его обработать, он будет содержать ответное сообщение Retry-After.
414 Request-URI Too Larg Запрошенный URI (обычно URL) слишком длинный для обработки сервером.
415 Unsupported Media Type Сервер не может обработать формат мультимедиа, прикрепленный к запросу.
416 Requested range not satisfiable Недопустимая область действия, запрошенная клиентом
417 Expectation Failed Сервер не может удовлетворить информацию заголовка запроса Expect
500 Internal Server Error Внутренняя ошибка сервера, невозможно выполнить запрос
501 Not Implemented Сервер не поддерживает запрошенную функцию и не может выполнить запрос
502 Bad Gateway Сервер, выступающий в роли шлюза или прокси-сервера, получил недопустимый запрос от удаленного сервера.
503 Service Unavailable Из-за перегрузки или обслуживания системы сервер временно не может обработать запрос клиента. Продолжительность задержки может быть включена в заголовок сервера Retry-After.
504 Gateway Time-out Сервер, выступающий в роли шлюза или прокси, не получил вовремя запрос от удаленного сервера.
505 HTTP Version not supported Сервер не поддерживает запрошенную версию протокола HTTP и не может завершить обработку

HTTP-ответное сообщение

Подробное объяснение протокола HTTP

Пять особенностей HTTP

  1. служба поддержкиклиент/сервермодель.
  2. Просто и быстро: когда клиент запрашивает услугу с сервера, ему нужно только передать метод запроса и путь. Обычно используемые методы запроса:GET,HEAD,POST. Каждый метод определяет другой тип контакта клиент-сервер. так какHTTPПротокол прост, что делаетHTTPРазмер программы сервера небольшой, поэтому скорость связи высокая.
  3. гибкий: HTTP позволяет передавать объекты данных любого типа. Передаваемый тип задаетсяContent-Typeбыть отмечены.
  4. нет соединения: Значение без установления соединения заключается в том, чтобы ограничить обработку только одним запросом на одно соединение. После того, как сервер обработает запрос клиента и получит ответ клиента, он отключится. Таким образом можно сэкономить время передачи. Причина для того, чтобы сделать это в первые дни, состоит в том, чтобы запросить меньше ресурсов и быстро следовать. позже черезConnection: Keep-Aliveдолгосрочная связь
  5. нет статуса:HTTPПротокол является протоколом без сохранения состояния. Без сохранения состояния означает, что протокол не имеет памяти для обработки транзакций. Отсутствие состояния означает, что если предыдущая информация требуется для последующей обработки, она должна быть передана повторно, что может привести к увеличению объема данных, передаваемых за соединение. С другой стороны, сервер быстрее отвечает, когда ему не нужна предыдущая информация.

Непостоянные и постоянные соединения

В практических приложениях клиент часто отправляет серию запросов, а затем сервер отвечает на каждый запрос. Для этих запросов|ответов, если каждый отправляется через отдельное TCP-соединение, называемоенепостоянное соединение. И наоборот, если он каждый раз отправляется через одно и то же TCP-соединение, он называетсяпостоянное соединение.

Непостоянные соединения должны быть разорваны после каждого запроса|ответа, и в следующий раз будет установлено новое TCP-соединение, что вызывает большие накладные расходы на связь. Например, вышеупомянутое время в оба конца(RTT)Это цена в процессе установления TCP-соединения.

Непостоянные подключения ложатся тяжелым бременем на серверы, каждый из которых может обрабатывать сотни и более запросов одновременно. Постоянное соединение предназначено для решения этих проблем, которое характеризуется сохранением состояния TCP-соединения до тех пор, пока не будет получен явный запрос на прерывание, а затем соединение будет прервано. Постоянные соединения уменьшают накладные расходы на связь и экономят трафик.

HTTP и HTTPS

Недостатки HTTP

  • Для связи используется открытый текст (не зашифрованный), содержимое может быть перехвачено
  • Личность общающейся стороны не проверяется, поэтому есть вероятность маскировки
  • Целостность сообщения не может быть доказана, возможно, оно было подделано.

Введение в HTTPS

HTTPВ протоколе нет механизма шифрования, но его можноSSL(Secure Socket Layer, безопасный уровень сокетов)илиTLS(Transport Layer Security, Транспортный протокол уровня безопасности) в комбинации, зашифрованныйHTTPСодержание связи. Он относится к шифрованию связи, который зашифрован по всей линии связи.

HTTP + 加密 + 认证 + 完整性保护 = HTTPS(HTTP Secure )

HTTP和HTTPS对比

HTTPSиспользоватьШифрование с общим ключом(симметричный) ишифрование с открытым ключом(асимметричный) обасмешиваниемеханизм шифрования. Если можно безопасно обмениваться ключами, то можно рассмотреть возможность использования для связи только шифрования с открытым ключом. Но шифрование с открытым ключом медленнее, чем шифрование с общим ключом.

Поэтому мы должны в полной мере воспользоваться их соответствующими преимуществами и объединить несколько методов для общения. существуетобмен ключамисценическое использованиешифрование с открытым ключомкстати, после установления связиобмен сообщениямиэтап используетсяШифрование с общим ключомСпособ.

混合加密方式

HTTPSКраткое описание процесса рукопожатия выглядит следующим образом:

`HTTPS`握手过程

  1. Браузер отправляет набор поддерживаемых им правил шифрования на веб-сайт.

    服务器获得浏览器公钥
    
  2. Веб-сайт выбирает набор алгоритмов шифрования и алгоритмов HASH и отправляет свою идентификационную информацию обратно в браузер в виде сертификата. Сертификат содержит такую ​​информацию, как адрес веб-сайта, открытый ключ шифрования и орган, выдавший сертификат.

    浏览器获得服务器公钥
    
  3. После получения сертификата веб-сайта браузер должен сделать следующее:

    (a) Проверить легитимность сертификата (является ли организация, выпустившая сертификат, законной, совпадает ли адрес веб-сайта, указанный в сертификате, с посещаемым адресом и т. д.), если сертификат является доверенным, небольшое замок будет отображаться в строке браузера, в противном случае он выдаст сообщение о том, что сертификат не является доверенным.

    (б) Если сертификат является доверенным или пользователь принимает ненадежный сертификат, браузер сгенерирует случайное количество паролей (ключ для последующей связи) и зашифрует их с помощью открытого ключа, предоставленного в сертификате (общий ключ). шифрование).

    (c) Используйте согласованный HASH для расчета сообщения рукопожатия, зашифруйте сообщение сгенерированным случайным числом и, наконец, отправьте всю ранее сгенерированную информацию на веб-сайт.

      浏览器验证 -> 随机密码
      服务器的公钥加密 -> 通信的密钥
      通信的密钥 -> 服务器
    
  4. После того, как веб-сайт получает данные, отправленные браузером, он делает следующее:

    (а) Используйте свой собственный закрытый ключ для расшифровки информации и извлечения пароля, используйте пароль для расшифровки сообщения рукопожатия, отправленного браузером, и проверьте, соответствует ли HASH тому, который отправлен браузером.

    (b) Зашифруйте сообщение рукопожатия с помощью пароля и отправьте его в браузер.

      服务器用自己的私钥解出随机密码 -> 用密码解密握手消息(共享密钥通信)-> 验证HASH与浏览器是否一致(验证浏览器)
    

Недостатки HTTPS

  • Процесс шифрования и дешифрования сложен, что приводит к низкой скорости доступа.
  • Шифрование требует оплаты центру сертификации
  • Весь запрос страницы должен использовать HTTPS

Добро пожаловать в технический публичный аккаунт: Zero One Technology Stack

零壹技术栈

Эта учетная запись будет продолжать делиться сухими продуктами серверных технологий, включая основы виртуальных машин, многопоточное программирование, высокопроизводительные фреймворки, асинхронное ПО, промежуточное ПО для кэширования и обмена сообщениями, распределенные и микросервисы, материалы для обучения архитектуре и расширенные учебные материалы и статьи.