Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Пример пояснительной записки курсовой работы.docx
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
303.17 Кб
Скачать

1.3 Протокол полнодуплексной связи WebSocket

WebSocket – это значительное расширение HTTP протокола, которое позволит приложениям (в том числе и играм) поддерживать многопользовательское взаимодействие в режиме реального времени.

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

WebSocket — протокол полнодуплексной двунаправленной связи поверх TCP-соединения, предназначенный для обмена сообщениями между браузером и веб-сервером в режиме реального времени. Программисты и ранее пытались решить проблему «равноправия» между сервером и клиентом. Они экспериментировали с двунаправленной связью, используя запросы XMLHttpRequest. Но это было очень медленно, так как каждый раз приходилось создавать новое TCP-соединение для каждого сообщения.

В отличие от XMLHttpRequest WebSockets устанавливает одно TCP-соединение и подтверждает, что сервер может общаться с WebSocket, делая специальные проверки, после чего сервер и клиент могут отправлять текстовые сообщения через установленное соединение при необходимости, в результате чего связь становится быстрее. Соединение постоянно держится открытым, но не передаёт лишних HTTP заголовков. При этом в веб-сокетах нет ограничений на количество соединений.

1.4 Общий принцип работы протокола WebSockets

Как только страница сайта решает, что ей необходимо открыть WebSocket на сервер, она создает специальный javascript-объект. Все начинается так же как в обычном HTTP-запросе. Браузер подключается по протоколу TCP на 80-й порт сервера, но дает немного необычный GET-запрос, и, если сервер поддерживает WebSocket, то он отвечает. Если браузер это устраивает, то он просто оставляет TCP-соединение открытым. Все — установление связи совершено, канал обмена данными готов.

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

0x00, <строка в кодировке UTF-8>, 0xFF

То есть просто строка текста — последовательность байт, к которой спереди приставлен нулевой байт 0x00, а в конце — 0xFF. Без заголовков и метаданных. Что именно отправлять, разработчики полностью оставили на усмотрение разработчиков сайтов: XML, JSON, простой текст.

С помощью протокола WebSockets так же можно передавать различные бинарные данные, к примеру, изображения. Для них используется другой дата-фрейм следующего вида:

0x80, <длина - один или несколько байт>, <тело сообщения>

«Один или несколько байт» - очень хитрый способ указания длины тела сообщения. Чтобы не создавать ограничений на длину передаваемого сообщения и в тоже время не расходовать байты нерационально, разработчики протокола использовали следующий алгоритм. Каждый байт в указании длины рассматривается по частям: самый старший бит указывает, является ли этот байт последним (0) или же за ним есть другие (1), а младшие 7 битов содержат собственно данные.

Соответственно, как только получается признак бинарного дата-фрейма 0x80, то берется следующий байт и откладывается его в отдельную «копилку», потом на следующий байт — если у него установлен старший бит, то переносится и его в «копилку». И так далее, пока вам не встретится байт со старшим битом - 0. Это означит что этот байт - последний в указателе длины. Он также складывается в «копилку». Теперь из всех байтов в «копилке» убираются старшие биты, и соединяется в единое целое остаток. Вот это и будет длина тела сообщения.

Скорость обработки такого соединения стремится к скорости чистого TCP-сокета. Это обусловлено тем, что соединение открыто, остается только переслать необходимые байты информации.

Данный протокол обладает перечнем особенностей, которые нужно учитывать при работе с ним. Скорость и эффективность передачи обеспечивает малый размер передаваемых данных, который может быть помещен в один TCP-пакет. При этом учтите, что соединение уже готово — не надо тратить время и трафик на его установление. Важное преимущество заключается в том, что время жизни канала - WebSockets никак не ограничивается. Это значит, что больше не надо периодически обновлять соединение, т.к. его не вправе закрывать прокси-сервера. Значит, соединение может висеть в неактивном виде и не требовать ресурсов.

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