HTTP против WebSocket
Эта статья сравнивает протоколы HTTP и WebSocket, объясняя их ключевые различия, особенности и идеальные случаи использования. Она предоставляет разработчикам важные инсайты для выбора правильного протокола для своих веб-приложений, сопоставляя модель запроса-ответа HTTP с возможностями двусторонней реальной коммуникации WebSocket.
Основа всего цифрового мира - это коммуникация между машинами. Авторизованные клиенты создают запрос, который сервер получает, интерпретирует и предоставляет соответствующий ответ. Это общее понимание цифровой коммуникации для обычных людей. Однако работа за кулисами сложна и утомительна.
Разработчикам приложений необходимо проделать большую работу, чтобы обеспечить правильное функционирование этой клиент-серверной коммуникации. Выбор правильного протокола связи - одна из этих задач. Когда разработчики пытаются выбрать жизнеспособный протокол связи, они сталкиваются с двумя распространенными концепциями: HTTP и WebSocket.
Уяснение этих двух протоколов, их сходств, функций и других аспектов является важным для выбора правильного варианта, основанного на реальных потребностях.
Введение в HTTP
Давайте сначала разберемся с HTTP. Вероятно, это самый часто используемый протокол в области цифровой связи. Первая версия HTTP была выпущена в 1989 году с огранич енной функциональностью и областью применения. Но он быстро был улучшен и обновлён для поддержки масштабной связи между браузерами и серверами.
HTTP - это однонаправленный протокол, что означает, что в любое время только одна из сторон в коммуникации может отправлять или получать информацию. Когда клиент отправляет запрос серверу, этот запрос отправляется в форме HTTP или HTTPS, и сервер отправляет соответствующий, уникальный ответ клиенту после получения запроса. Каждый запрос HTTP или HTTPS устанавливает новое соединение с сервером и автоматически заканчивает соединение после полученного ответа.
Некоторые основные характеристики HTTP включают:
- Без состояния
- Может работать на основе протоколов с ориентированной на соединение (таких как SCTP и TCP)
- Информация закодирована в ASCII
- Основные компоненты HTTP-запроса включают версию HTTP (HTTP/1.1, HTTP/2, HTTP/3), метод, заголовок HTTP, информацию о хосте и сообщение
Что такое WebSocket?
WebSocket - это протокол связи, который может обеспечить двустороннюю реальную коммуникацию между клиентом и сервером.
WebSocket - это протокол для создания двусторонних реальных коммуникационных каналов в веб-приложениях. В отличие от традиционных HTTP-запросов (обычно один запрос соответствует одному ответу), WebSocket может устанавливать постоянные соединения, позволяя серверу направлять данные клиенту в реальном времени, а также получать данные от клиента. По сравнению с традиционным опросом, WebSocket значительно сокращает сетевой трафик и задержку, улучшая эффективность и скорость передачи данных. Это особенно подходит для разработки онлайн игр и приложений, работающих в реальном времени.
Некоторые основные характеристики WebSocket включают:
- Основан на постоянных соединениях TCP, которые остаются открытыми до тех пор, пока клиент или сервер не инициирует запрос на завершение
- Построен на HTTP-протоколе, все запросы WebSocket отправляются через стандартный HTTP-протокол и затем идентифицируются как определенная информация заголовка "Upgrade" на серверной стороне
- Протокол WebSocket основан на фреймах (пакеты данных), полный пакет данных может быть разделен на несколько фреймов, каждый из которых содержит часть данных и информацию заголовка
Взаимоотношение между HTTP и WebSocket
Из вышеизложенного можно увидеть, что оба протокола HTTP и WebSocket:
- Используют протокол TCP для передачи данных
- Используются для связи между клиентом и сервером
Мы можем более наглядно показать различия между HTTP и WebSocket с помощью следующей таблицы.
HTTP | WebSocket |
---|---|
Устанавливает новое соединение для каждого запроса (если не используется длительное соединение HTTP, например HTTP/1.1 Keep-Alive), и закрывает соединение после завершения связи | Соединение остается открытым после успешного начального рукопожатия, если только оно не закрыто активно или не произошла ошибка |
Односторонний режим связи, клиент отправляет запрос, сервер возвращает ответ, каждая новая связь требует повторного установления соединения | Двусторонний режим связи, после установления соединения клиент и сервер могут отправлять данные в любой момент без повторного установления соединения |
Каждая связь требует отправки полных заголовков запроса и ответа, поэтому накладные расходы велики для частых коротких сообщений | Как только соединение установлено, передача данных становится легче, нет необходимости передавать информацию заголовка каждый раз, подходит для высокочастотных, низкозадержечных коммуникаций |
В основном используется для передачи относительно стабильных данных | В основном используется для передачи данных в реальном времени |
Из-за необходимости повторного установления соединения для каждого запроса и необходимости переноса необходимой информации через заголовки и т.д., использование пропускной способности и скорость ответа страдают | Непрерывное соединение устраняет шаги повторного установления соединения и переноса необходимой информации для каждого запроса, что приводит к более низкой задержке и более высокой эффективности использования полосы пропускания |
Частые запросы влияют на производительность | Частые запросы не влияют на производительность |
Как выбрать, какой протокол использовать?
Основываясь на сравнении преимуществ и недостатков HTTP и WebSocket в предыдущем разделе, мы можем оценить сценарии использования из двух разных измерений:
- Быстро ли изменяются данные и зависит ли бизнес от данных в реальном времени
- Вовлечена ли частая двусторонняя коммуникация
Например, если Джек хочет создать приложение для видеочата, где каждый пользователь должен получать в реальном времени видеоданные от партнера по чату и передавать свой собственный видеопоток другой стороне, тогда WebSocket - это лучший выбор.
Административная консоль Logto не нуждается в частом получении текущего использования ресурсов пользователем, потому что ресурсы изменяют состояние только тогда, когда пользователи изменяют конфигурации. Нужно только своевременно обновлять состояние ресурсов, когда пользователи взаимодействуют с ресурсами. С этой точки зрения, HTTP очень подходит для сценария использования административной консоли Logto. Аналогично, для большинства информационных панелей облачных сервисов можно выбрать HTTP в качестве протокола связи между панелью и сервером.