Протокол WebSocket 8 Вопросы

WebSocket
Протокол WebSocket 8 Вопросы

Больше отличных статей.

«Микросервисы — это не все, а лишь подмножество определенного домена».

«Подбиблиотека и подтаблица»? Отбор и процесс должны быть осторожными, иначе все выйдет из-под контроля».

С таким количеством компонентов мониторинга всегда найдется подходящий для вас

«С Нетти, что мы разрабатываем? 》

«Вероятно, это наиболее подходящая спецификация Redis».

«Портрет программиста, десять лет взлетов и падений»

Самая полезная серия:

«Наиболее часто используемый набор навыков «vim» в производственной среде Linux.

«Наиболее часто используемый набор навыков «Sed» в производственной среде Linux.

«Наиболее часто используемый набор навыков «AWK» в производственной среде Linux.


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

на http一问一答Неудовлетворенность двусторонним процессом породила поддержку двустороннего общения.WebSocketрождение. Веб-сокет — это不太干净протокол.

1. Может ли протокол WebSocket инициироваться только браузером?

нет. Текущая аудитория для этого протокола - это не только веб-разработчики.

WebSocket — это просто протокол, он такой же, как протокол http, с использованием类似okhttpкомпоненты, которые можно вызывать где угодно, даже с помощью WebSocketRPCРамка.

2. Какая связь между WebSocket и HTTP?

WebSocket, как и http, находится вOSIВерхний слой в модели:应用层.

С WebSockethttpСоглашение рукопожатие рук, а после успешного рукопожатия он превратится вTCP通道, и больше никогда не увидите http.

С помощью netstat или ss можно увидеть соответствующее подключение, внешне ничем не отличающееся от сокета на уровне абстракции.

3. В чем разница между WebSocket и длинным опросом?

Длинный опрос означает, что клиент отправляет запрос, а сервер всегда будет ждать на этом соединении (разумеется, очень большой таймаут), и не вернется, пока не будут данные.Это все еще вопросно-ответный режим . Такие, как знаменитый Контед.

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

Соединение, созданное WebSocket, отличается от длинного соединения Http. Поскольку нижний уровень длинного соединения Http по-прежнему является протоколом Http, это все еще вопрос и ответ, но Hold живет долгоживущим соединением.

Длительный опрос и длинные соединения Http блокируют ввод-вывод, но WebSocket может не блокировать (в частности, мультиплексирование).

4. Как создать подключение?

Создание соединения WebSocket осуществляется по протоколу Http. Этот дизайн в основном основан на совместимости, и очень удобно инициировать запросы в браузере, что кажется довольно запутанным.

На рисунке ниже показан типичный ws-запрос, инициированный браузером, который очень похож на http-запрос. Однако это выглядит как фаза запроса:

Обычно запрашиваемый адрес:ws://\*\*\*или безопасный протокол, использующий шифрование SSL/TLS.wss:, используемый для идентификации запроса WebSocket.

1. Сначала через заголовок HttpUpgradeдомен, запрашивающий преобразование протокола. Если сервер его поддерживает, вы можете переключиться на протокол WebSocket. Проще говоря: соединение уже есть, и переход на протокол ws через рукопожатие — это просто переключение состояния соединения.

1,ConnectionДомен можно рассматривать какUpgradeИнформация заголовка сопряжения домена. Прокси-сервер, как Nginx - это обработать соединение первым, а затем инициировать преобразование протокола.

SEC-Websocket-ключ - это случайная строка, которая использует эти данные для создания сводки информации SHA-1. Ну, вы можете попытаться избежать нормальных HTTP-запросов, которые будут приняты для ошибок для протоколов WebStocket.

Другие, например заголовки Sec-WebSocket*, указывают подпротоколы, поддерживаемые клиентом, и другую информацию. Как и mqtt, который очень популярен в IoT, его можно использовать как подпротокол WebSocket.

Используя javascript, легко подключиться к серверу WebSocket.

<script>
  var ws = new WebSocket('ws://localhost:80');
  ws.onopen = function () {
    console.log('ws onopen');
    ws.send('from client: hello');
  };
  ws.onmessage = function (e) {
    console.log('ws onmessage');
    console.log('from server: ' + e.data);
  };
  ...
</script>

5. Как обрабатывать данные?

WebSocket работает посредством уведомления о событии. Он содержит четыре события и два действия (отправить и закрыть).

События веб-сокета

событие крюк Примечание
open onopen Запускается при установлении соединения
message onmessage Срабатывает, когда клиент получает данные от сервера
error onerror Срабатывает при возникновении ошибки связи
close onclose Запускается, когда соединение закрыто

Данные могут передаваться напрямую черезSocket.send()способ передачи.

По хрому Inspect->Network->WS можно увидеть на странице WebSocket connection. Код операции FIG равен 2, что указывает на то, что это двоичный кадр.

WebSocket имеет формат фрейма, аналогичный протоколу tcp, который не будет подробно объясняться здесь.

Ссылаться на:(tools.I ETF.org/HTML/RFC645…)

сердцебиение

Для операций ping и pong, соответствующих пульсу, коды операций равны 0x9 и 0xA соответственно. Сторона, получающая пульс, должна самостоятельно обновить время обновления пульса. такой жеС Нетти, что именно мы разрабатываем?Как и во введении, в некоторых мобильных средах необходимо более разумно контролировать сердцебиение.

6. Как использовать Nginx для балансировки нагрузки?

Официальный сайт nginx привел примеры. В основном настройки заголовков Upgrade и Connection.

map $http_upgrade $connection_upgrade {
    default upgrade;
    '' close;
}

location /chat/ {
    proxy_pass http://backend;
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection $connection_upgrade;
}

Следует отметить, что nginx выполняет балансировку нагрузки и не требует настройки.ip_hashи другие параметры, nginx естественно поддерживает. Поскольку ip_hash использует для хеширования только первые три цифры IP-адреса, это также может привести к дисбалансу на стороне сервера.

7. Как реализовать java-сервер?

Вы можете реализовать пакет под javax.websocket, простая реализация сервера WS. В настоящее время вы можете в основном написать код аннотацией, напримерServerEndpoint.

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

8. Что может WebSocket?

Функция уведомления

При длительном соединении, когда сервер отправляет новые сообщения, они могут быть переданы пользователю в режиме реального времени. Как и уведомления и комментарии на Zhihu, вы можете использовать связь WebSocket.

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

Сбор данных

Некоторые неоптимальные данные, такие как журнал поведения, трассировка, сбор стека исключений и т. д., могут передаваться через выделенный канал WebSocket. Это может увеличить концентрацию информации и может своевременно подтолкнуть соответствующую конфигурацию для поведения пользователя. Так как большинство ядер браузеров поддерживают его, это сделает клиентAPMМодель программирования проста.

Шифрование и& аутентификация

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

крюк управления обратным ходом

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

Я считаю, что Alipay тайно вызывает вашу камеру, чтобы сфотографировать вас.

End

Тогда появление кометы долгое время удивляло и вдохновляло. Но технологии меняются с каждым днем, cometd устаревает, а Socket.io стремительно развивается. После периода хаоса для WebSocket спецификация становилась все более и более совершенной, а использование становилось все более и более удобным, и нет необходимости иметь дело с таким количеством совместимости.

Но суть его в том, чтобы расфасовать старое вино в новые бутылки, а суп поменять, не меняя лекарства. Разработка WebSocket выиграла от формулировки спецификации HTML5. Смысл спецификации в том, чтобы ограничить реализацию фантазии производителей и указать направление развития.

Это, конечно, имеет типичный контрпример, которыйie. Теперь только группа признанных ** все еще настаивает на использовании.