WebSocket Закрыть Код 1002

Вопрос:Я написал приложение, которое использует веб-сокеты для связи между сервером и клиентом. Я хотел бы обработать случай, когда клиент устарел (слишком старый) и, таким образом, неправильно интерпретирует/не обрабатывает сообщения. Я думаю, что если клиент слишком стар, я закрываю соединение и отправляю соответствующий код состояния. Я прочитал спецификацию, и кажется, что 1002 может быть подходящим кодом:

Вопрос:

Я написал приложение, которое использует веб-сокеты для связи между сервером и клиентом. Я хотел бы обработать случай, когда клиент устарел (слишком старый) и, таким образом, неправильно интерпретирует/не обрабатывает сообщения. Я думаю, что если клиент слишком стар, я закрываю соединение и отправляю соответствующий код состояния. Я прочитал спецификацию, и кажется, что 1002 может быть подходящим кодом:

1002 indicates that an endpoint is terminating the connection due to a protocol error.

Однако я действительно не знаю, что это значит (если он действительно ссылается на протокол веб-сокета и, следовательно, на ошибку более низкого уровня). Для этого подходит 1002, или я должен сделать код закрытого (прикладного) кода в области 4000-4999, как определено здесь: https://developer.mozilla.org/en-US/docs/Web/API/CloseEvent

Лучший ответ:

Код ошибки 1002 предназначен для нарушений протокола WebSocket на низком уровне. Например, сообщение WebSocket было текстовым сообщением, но полезная нагрузка содержала недопустимый UTF8. Вы не должны использовать это для ситуации. Ошибки 1002 обычно генерируются внутренними средствами реализации WebSocket, а не приложением, использующим WebSocket.

Теперь в вашей ситуации у вас есть два варианта:

  • Если клиент может быть идентифицирован как “слишком старый” уже во время установления рукопожатия открытия WebSocket, вы можете не выполнить рукопожатие, используя HTTP Bad Request 400.

  • Вы можете разрешить рукопожатие завершить, выполнить обмен сообщениями в WebSocket, определяющий версию клиента, а затем закрыть соединение (выполняющее надлежащее квитирование с помощью WebSocket) с кодом ошибки из диапазона 4000-4999. Да, этот диапазон был бы уместным. https://tools.ietf.org/html/rfc6455#section-7.4.2

Последний более гибкий и дает клиенту лучшую обратную связь. В частности, JavaScript в браузере получит доступ только к закрытому коду (2), а не к HTTP-ошибке в (1).

Еще один заметный аспект: соответствующая реализация WebSocket просто не позволит приложению запускать с помощью 1002. Единственными закрытыми кодами, разрешенными для использования приложения, являются 1000 (который является “нормальным” ) и 3000 — 3999 (использование приложения, но зарегистрировано в IETF) и 4000 — 4999 (использование приложения, частная незарегистрированная).

Оцените статью
Добавить комментарий