Концептуальные принципы протокола WebSocket
Концептуальные принципы протокола WebSocket

Часть 1. Что такое WebSocket

WebSocket — это сетевой транспортный протокол, обеспечивающий полнодуплексную связь через одно TCP-соединение. Он расположен на прикладном уровне модели OSI.

WebSocket и HTTP — это не одно и то же протокол,Хотя оба они расположены на прикладном уровне модели OSI.,И все они полагаются на базовый протокол TCP. У них свой формат протокола,Применяйте разные сценарии. Сам протокол WebSocket не зависит от протокола HTTP.,Но на начальном этапе установки WebSocket полагается на HTTP.,Потому что процесс рукопожатия WebSocket использует HTTP-запросы для обновления протокола.

URL-адрес протокола WebSocket аналогичен HTTP. Схема протокола открытого текста — ws:, а соответствующий протокол HTTP — http:. Схема протокола WebSocket, основанного на SSL/TLS, — wss:, а соответствующего протокола HTTP — https:. Порт по умолчанию для ws — 80, а порт по умолчанию для wss — 443.

Часть 2. Зачем нужен WebSocket

В веб-коммуникациях уже есть протокол HTTP, зачем нам разрабатывать протокол WebSocket? Должно быть, протокол HTTP не может удовлетворить потребности определенных сценариев. Давайте сначала разберем проблемы с протоколом HTTP, а затем разберем, как работает WebSocket.

1HTTP-протокол

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

Когда клиент отправляет HTTP-запрос на сервер, между клиентом и сервером открывается TCP-соединение, а после получения ответа TCP-соединение разрывается. Каждый HTTP-запрос открывает отдельное TCP-соединение с сервером. Если клиент отправляет 10 запросов на сервер, будет открыто 10 отдельных TCP-соединений.

Протокол HTTP имеет следующие проблемы:

  • Низкая производительность в реальном времени: вы можете видеть это из предыдущего представления протокола HTTP.,HTTP использует модель запрос-ответ.,Сервер не может заранее отправлять сообщения клиенту. Невозможно удовлетворить потребности некоторых сценариев применения.,Как и в онлайн-играх, данные обновляются в режиме реального времени. Если реализовано с использованием протокола HTTP,Нужно реализовать через опрос,Своевременность плохая.
  • Производительность невысока: TCP-соединение открывается для каждого запроса и закрывается после ответа на запрос. В сценарии частого обмена данными такое частое установление и закрытие TCP-соединения снижает производительность.

Поэтому протокол WebSocket был введен для решения проблем HTTP.

2Протокол WebSocket

Процесс взаимодействия с протоколом WebSocket показан ниже. Весь процесс разделен на два этапа. Этап 1: Выполните рукопожатие. Этап 2: Произведите передачу данных.

рукопожатие

Из соображений совместимости рукопожатие реализовано с использованием HTTP. Сообщение, отправленное клиентом, представляет собой запрос HTTP-сообщения с заголовком Upgrade.

Язык кода:javascript
копировать
GET /chat HTTP/1.1
Host: server.example.com
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ==
Origin: http://example.com
Sec-WebSocket-Protocol: chat, superchat
Sec-WebSocket-Version: 13
  • Отправить HTTP-запрос через GET,нуждатьсяHTTPномер версии>=1.1
  • Хост: имя хоста, используемое клиентом и сервером для проверки того, используют ли они один и тот же хост.
  • Обновление: переход на протокол WebSocket.
  • Соединение: тип соединения должен быть обновлен, обычно используется с обновлением.
  • Sec-WebSocket-Key: случайно создаваемый 16-байтовый контент.,Затем закодируйте его через Base64. Убедитесь, что сервер может правильно ответить на запрос клиента.,Чтобы проверить идентичность сервера
  • Sec-WebSocket-Protocol: укажите, какой протокол использовать.
  • Sec-WebSocket-Version: какие субтитры могут быть приняты клиентом.

Сообщение, которое сервер отвечает клиенту, выглядит следующим образом.

Язык кода:javascript
копировать
HTTP/1.1 101 Switching Protocols
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Accept: s3pPLMBiTxaQ9kYGzzhZRbK+xOo=
Sec-WebSocket-Protocol: chat
  • 101: Сервер отвечает кодом состояния 101.,Любой код состояния, отличный от 101, приведет к ошибке.,означает, что WebSocketрукопожатие не завершено
  • Sec-WebSocket-Accept:Воляклиент Прошел мимоSec-WebSocket-Key Хэш-значение в кодировке Base64 в сочетании с глобальным уникальным идентификатором.

Если значение Sec-WebSocket-Accept не соответствует ожидаемому значению,Отсутствует поле заголовка или код состояния HTTP не 101.,тогда соединение не будет установлено,И не будет Отправить данныерамка。

Отправить данные

Формат кадра данных WebSocket следующий:

  • FIN: занимает 1 бит, указывая, является ли этот кадр последним в сообщении. Первый кадр также может быть последним. Поскольку при связи через WebSocket полное сообщение может потребоваться разделить на несколько кадров для передачи, а поле FIN используется, чтобы сообщить другой стороне, есть ли последующие кадры.
  • RSV1/RSV2/RSV3: каждый занимает 1 бит, значение должно быть 0.
  • код операции: код операции, занимает 4 бита, означает загрузку данных payload тип данных, подробности см. в таблице ниже.
  • МАСКА: идентификация маски,Занимает 1 бит. Указывает, маскируются ли полезные данные. Если установлено значение 1,В разделе Masking-key есть ключ маскировки.,Используйте этот ключ для маскировки данных полезной нагрузки.
  • Payload len: данныедлина,Занимает 7/(7+16)/(7+64) бит. Если значение находится в диапазоне 0–125,Тогда значение представляет длину данных. Если значение 126,Тогда 16-битное целое число без знака, представленное следующими двумя байтами (16 бит), представляет собой длину данных. если значение 127,Тогда 64-битное целое число без знака, представленное следующими восемью байтами (64 бита), представляет собой длину данных.
  • Маскирующий ключ: маскирующий ключ,Занимает 0 или 4 байта,Все сообщения, отправляемые на сервер, должны быть замаскированы 32-битным значением.
  • Payload data:приложениеданные。

значение кода операции

значение

0

продолжить кадр

1

текстовый фрейм

2

двоичный кадр

3-7

бронировать

8

закрыть кадр

9

пинг-фрейм

10

рамка для понга

11-15

бронировать

Сценарии использования Part3WebSocket

1 веб-приложение, работающее в режиме реального времени

Веб-приложения реального времени используют соединения WebSocket для отображения данных, отправленных сервером. Например, на торговом веб-сайте или при торговле акциями, где цены постоянно колеблются, задержка при отображении цен клиентам должна быть как можно меньше.

2 игровых приложения

В игровом приложении клиент продолжает отправлять данные на сервер, а затем сервер отправляет данные обратно клиенту без обновления пользовательского интерфейса.

3 приложения для чата

Большинство чат-приложений используют WebSocket для обеспечения бесперебойного и быстрого канала связи между пользователями.

4Совместное редактирование в режиме реального времени

Как и различные облачные документы, такие как документы Tencent, графитовые документы и т. д.

5 Визуализация данных в реальном времени

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

6Приложения для позиционирования в реальном времени

Обмен обновлениями местоположения в режиме реального времени в мобильных приложениях.

7 приложений для распознавания голоса

Распознавание речи, возвращающее распознанный текст в реальном времени.

boy illustration
Неразрушающее увеличение изображений одним щелчком мыши, чтобы сделать их более четкими артефактами искусственного интеллекта, включая руководства по установке и использованию.
boy illustration
Копикодер: этот инструмент отлично работает с Cursor, Bolt и V0! Предоставьте более качественные подсказки для разработки интерфейса (создание навигационного веб-сайта с использованием искусственного интеллекта).
boy illustration
Новый бесплатный RooCline превосходит Cline v3.1? ! Быстрее, умнее и лучше вилка Cline! (Независимое программирование AI, порог 0)
boy illustration
Разработав более 10 проектов с помощью Cursor, я собрал 10 примеров и 60 подсказок.
boy illustration
Я потратил 72 часа на изучение курсорных агентов, и вот неоспоримые факты, которыми я должен поделиться!
boy illustration
Идеальная интеграция Cursor и DeepSeek API
boy illustration
DeepSeek V3 снижает затраты на обучение больших моделей
boy illustration
Артефакт, увеличивающий количество очков: на основе улучшения характеристик препятствия малым целям Yolov8 (SEAM, MultiSEAM).
boy illustration
DeepSeek V3 раскручивался уже три дня. Сегодня я попробовал самопровозглашенную модель «ChatGPT».
boy illustration
Open Devin — инженер-программист искусственного интеллекта с открытым исходным кодом, который меньше программирует и больше создает.
boy illustration
Эксклюзивное оригинальное улучшение YOLOv8: собственная разработка SPPF | SPPF сочетается с воспринимаемой большой сверткой ядра UniRepLK, а свертка с большим ядром + без расширения улучшает восприимчивое поле
boy illustration
Популярное и подробное объяснение DeepSeek-V3: от его появления до преимуществ и сравнения с GPT-4o.
boy illustration
9 основных словесных инструкций по доработке академических работ с помощью ChatGPT, эффективных и практичных, которые стоит собрать
boy illustration
Вызовите deepseek в vscode для реализации программирования с помощью искусственного интеллекта.
boy illustration
Познакомьтесь с принципами сверточных нейронных сетей (CNN) в одной статье (суперподробно)
boy illustration
50,3 тыс. звезд! Immich: автономное решение для резервного копирования фотографий и видео, которое экономит деньги и избавляет от беспокойства.
boy illustration
Cloud Native|Практика: установка Dashbaord для K8s, графика неплохая
boy illustration
Краткий обзор статьи — использование синтетических данных при обучении больших моделей и оптимизации производительности
boy illustration
MiniPerplx: новая поисковая система искусственного интеллекта с открытым исходным кодом, спонсируемая xAI и Vercel.
boy illustration
Конструкция сервиса Synology Drive сочетает проникновение в интрасеть и синхронизацию папок заметок Obsidian в облаке.
boy illustration
Центр конфигурации————Накос
boy illustration
Начинаем с нуля при разработке в облаке Copilot: начать разработку с минимальным использованием кода стало проще
boy illustration
[Серия Docker] Docker создает мультиплатформенные образы: практика архитектуры Arm64
boy illustration
Обновление новых возможностей coze | Я использовал coze для создания апплета помощника по исправлению домашних заданий по математике
boy illustration
Советы по развертыванию Nginx: практическое создание статических веб-сайтов на облачных серверах
boy illustration
Feiniu fnos использует Docker для развертывания личного блокнота Notepad
boy illustration
Сверточная нейронная сеть VGG реализует классификацию изображений Cifar10 — практический опыт Pytorch
boy illustration
Начало работы с EdgeonePages — новым недорогим решением для хостинга веб-сайтов
boy illustration
[Зона легкого облачного игрового сервера] Управление игровыми архивами
boy illustration
Развертывание SpringCloud-проекта на базе Docker и Docker-Compose