Один из сетевых протоколов, понятных учащимся начальной школы: WebSocket.

задняя часть WebSocket Сетевой протокол
Один из сетевых протоколов, понятных учащимся начальной школы: WebSocket.

Введение

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

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

Так есть хорошее решение?

Поскольку запрос нельзя использовать, его можно изменить на отправку сервера. Мы знаем, что в HTTP/2 предусмотрен серверный метод push, но этот метод является односторонним, то есть на одном и том же TCP-соединении взаимодействие между клиентом и сервером не может быть реализовано.

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

webSocket vs HTTP

webSocket — это сетевой протокол двусторонней связи, основанный на базовом протоколе TCP. Эта двусторонняя связь достигается через TCP-соединение. webSocket был опубликован в качестве стандарта IETF в 2011 году как RFC 6455.

Также как стандартный протокол, основанный на протоколе TCP, в чем разница между ним и HTTP?

С точки зрения семиуровневой модели OSI оба находятся на четвертом уровне семиуровневого протокола. Но это два разных протокола. Учитывая, что HTTP стал настолько популярным, чтобы обеспечить универсальность webSocket, webSocket также совместим с протоколом HTTP. То есть там, где можно использовать протокол HTTP, можно использовать и webScoket.

Это похоже на рассмотренный ранее HTTP 3. Хотя HTTP 3 является новым протоколом, для обеспечения его широкой базы приложений HTTP 3 все еще переписывается и строится на существующем протоколе UDP. Цель - совместимость.

В режиме реального времени webSocket использует заголовок обновления HTTP для перехода с протокола HTTP на протокол webSocket.

HTTP upgrade header

Что такое заголовок обновления HTTP?

Заголовок обновления HTTP — это заголовок HTTP, представленный в HTTP 1.1. Когда клиент чувствует, что протокол HTTP нуждается в обновлении, он отправляет запрос на обновление на сервер, и сервер отвечает соответствующим образом.

Для websocket после того, как клиент установит соединение с сервером, он сначала отправит на сервер заголовки Upgrade: WebSocket и Connection: Upgrade. После того, как сервер получит запрос клиента, если он поддерживает протокол webSocket, он вернет клиенту те же заголовки Upgrade: WebSocket и Connection: Upgrade. После того, как клиент получает ответ от сервера, он знает, что сервер поддерживает протокол websocket, и тогда он может отправлять сообщения, используя протокол websocket.

Преимущества веб-сокетов

На самом деле, как мы упоминали ранее, по сравнению с традиционным HTTP-запросом, webSocket может реализовать передачу данных в реальном времени с помощью TCP-соединения. Связь в режиме реального времени между сервером и клиентом может быть реализована при снижении нагрузки на сервер.

Применение веб-сокета

WebSocket использует ws и wss в качестве маркеров URI. Где ws представляет websocket, а wss представляет WebSocket Secure.

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

Для клиента браузера вы можете использовать стандартный объект браузера WebSocket для связи с сервером.Давайте рассмотрим простой пример клиента javascript, использующего для связи webSocket:

// 使用标准的WebSocket API创建一个socket连接
const socket = new WebSocket('ws://www.flydean.com:8000/webscoket');

// 监听webSocket的open事件
socket.onopen = function () {
  setInterval(function() {
    if (socket.bufferedAmount == 0)
      socket.send(getUpdateData());
  }, 50);
};

// 监听接收消息事件
socket.onmessage = function(event) {
  handleUpdateData(event.data);
};

// 监听socket关闭事件
socket.onclose = function(event) {
  onSocketClose(event);
};

// 监听error事件
socket.onerror = function(event) {
  onSocketError(event);
};

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

Процесс рукопожатия веб-сокета

Как мы сказали выше, websocket обновляется с протокола HTTP, и клиент отправляет:

Upgrade: websocket
Connection: Upgrade

На стороне сервера обновите протокол. Возьмем конкретный пример:

GET /webscoket HTTP/1.1
Host: www.flydean.com
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Key: x123455688xafe=
Sec-WebSocket-Protocol: chat, superchat
Sec-WebSocket-Version: 13
Origin: http://flydean.com

Соответствующий возврат на стороне сервера:

HTTP/1.1 101 Switching Protocols
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Accept: Qhfsfew12445m=
Sec-WebSocket-Protocol: chat

В приведенном выше примере, помимо использования заголовка Upgrade, клиент также отправил серверу заголовок Sec-WebSocket-Key. Этот заголовок содержит случайный байт в кодировке base64. Сервер соответственно возвращает хеш-значение этого ключа и устанавливает его в заголовке Sec-WebSocket-Accept.

Это делается не для безопасной работы, а для того, чтобы избежать ситуации с кешем последнего соединения.

WebSocket API

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

Он обеспечивает функциональную инкапсуляцию веб-сокета. Его конструктор такой:

WebSocket(url[, protocols])

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

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

Например, когда клиент запрашивает сервер, он помещает соответствующий протокол в заголовок Sec-WebSocket-Protocol:

GET /socket HTTP/1.1
...
Sec-WebSocket-Protocol: soap, wamp

Сервер будет делать соответствующие возвраты в соответствии с поддерживаемыми типами, такими как:

Sec-WebSocket-Protocol: soap

WebSocket API имеет четыре состояния, а именно:

определение состояния ценность
WebSocket.CONNECTING 0
WebSocket.OPEN 1
WebSocket.CLOSING 2
WebSocket.CLOSED 3

При вызове метода close или Send будет инициировано соответствующее событие события.События WebSocket API в основном включают в себя: закрытие, ошибка, сообщение и открытие.

Ниже приведен пример конкретного использования:

// 创建连接
const socket = new WebSocket('ws://localhost:8000');

// 开启连接
socket.addEventListener('open', function (event) {
    socket.send('没错,开启了!');
});

// 监听消息
socket.addEventListener('message', function (event) {
    console.log('监听到服务器的消息 ', event.data);
});

Суммировать

Выше приведено краткое введение и использование websocket.Если вы хотите узнать, как Websocket передает сообщения, ждите моей следующей статьи.

Эта статья была включена вWoo Woo Floyd Press.com/06-Web Soc для…

Самая популярная интерпретация, самая глубокая галантерея, самые краткие уроки и множество трюков, о которых вы не знаете, ждут вас!

Добро пожаловать, чтобы обратить внимание на мой официальный аккаунт: «Программируйте эти вещи», разбирайтесь в технологиях, лучше поймите себя!