PCAP-анализ ошибки обновления WebSocket: 101 протокол коммутации, заголовки прокси, TLS и разрывы соединения

Как устранять сбои обновления WebSocket с помощью перехвата пакетов, включая HTTP 101, заголовки обновления, заголовки подключений, удаление прокси-сервера, TLS, сбросы и тайм-ауты простоя.

Сбои WebSocket часто скрываются за общими сообщениями браузера или приложения: "«Не удалось подключиться к WebSocket», «Неожиданный код ответа», «Соединение закрыто до получения ответа на рукопожатие», «Отсутствует 101 протокол коммутации» или «сокет отключен». Пользователи ищут «Ошибка обновления WebSocket pcap», «101 протокол коммутации не возвращен», «заголовки прокси-сервера nginx websocket» и «сброс соединения WebSocket», когда кажется, что HTTP работает, но трафик в реальном времени - нет."

Захват пакета может показать, был ли отправлен запрос на обновление HTTP, вернул ли сервер «101 протокол коммутации», удалил ли прокси-сервер необходимые заголовки, прошел ли TLS успешно и разорвалось ли соединение после обновления.

PCAP Surgery полезен, поскольку для трассировки WebSocket часто требуется сохранение как HTTP-квитирования, так и временной шкалы TCP после обновления.

Как выглядит здоровое обновление WebSocket

Клиент отправляет HTTP-запрос с заголовками обновления:

GET /socket HTTP/1.1
Host: example.com
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Key: ...
Sec-WebSocket-Version: 13

The server replies:

HTTP/1.1 101 Switching Protocols
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Accept: ...

После этого соединение больше не является обычным трафиком HTTP-запросов/ответов. Он содержит фреймы WebSocket.

Распространенные сбои обновления

Общие причины включают в себя:

  • Прокси удаляет заголовок «Upgrade».
  • Прокси удаляет или перезаписывает «Соединение: Обновление».
  • Внутренний маршрут не поддерживает WebSocket.
  • Завершение TLS отправляет запрос не тому восходящему каналу.
  • Поведение обновления HTTP/2 до HTTP/1.1 настроено неправильно.
  • Перенаправление аутентификации происходит вместо 101.
  • Серверная часть возвращает 400, 403, 404, 426, 502 или 504.
  • Соединение сбрасывается после обновления.
  • Тайм-аут простоя закрывает тихий WebSocket.

Код состояния и заголовки имеют значение.

Проблемы с заголовком прокси

Обратные прокси-серверы должны правильно пересылать заголовки обновления WebSocket. Если серверная часть никогда не видит Upgrade: websocket, она может рассматривать запрос как обычный HTTP.

Пакет доказательств:

  • Запрос клиент-прокси включает заголовки обновления.
  • В запросе от прокси-сервера их нет.
  • Бэкэнд возвращает обычный HTTP-ответ вместо 101.

Это проблема конфигурации прокси, а не ошибка клиента WebSocket.

TLS и SNI

Для безопасного WebSocket (wss://) TLS выполняется перед обновлением HTTP. В случае сбоя TLS подтверждение WebSocket никогда не начинается. Сохраните DNS, TCP, TLS ClientHello, SNI и любые оповещения или сбросы TLS.

Не диагностируйте заголовки обновления, пока не будет проверен путь TLS.

Соединение обрывается после 101

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

Искать:

  • Отправитель FIN или RST.
  • Продолжительность тайм-аута простоя.
  • Активность WebSocket в режиме пинг/понг.
  • Таймаут чтения прокси.
  • TCP-ретрансляции.
  • Нулевое окно.
  • Перезапуск внутреннего процесса.

Если удаление происходит через фиксированный интервал, скорее всего, существует политика тайм-аута.

Checklist

Используйте этот рабочий процесс:

  1. Сохраните DNS и TCP-соединение.
  2. Проверьте рукопожатие TLS для wss://.
  3. Проверьте заголовки запросов на обновление клиента.
  4. Проверьте статус ответа сервера.
  5. Подтвердите «101 протокол коммутации», если ожидается.
  6. Сравните запросы клиент-прокси и прокси-сервер.
  7. Ищите перенаправления или ответы аутентификации.
  8. Если обновление прошло успешно, проверьте FIN/RST/тайм-аут после обновления.
  9. Сохраните время пинг-понга WebSocket, если оно отображается.
  10. Обрезайте только после сохранения полного рукопожатия.

Окончательный диагноз

Сбои обновления WebSocket обычно связаны с HTTP-квитированием или проблемами пересылки прокси-сервера, пока не будет проверен «101 протокол коммутации». После обновления сбои приводят к длительному тайм-ауту TCP, сбросу или проблемам протокола приложения.

PCAP Surgery помогает сохранить обе фазы, поэтому неопределенную ошибку WebSocket можно отследить по заголовкам, поведению прокси-сервера, TLS, ответу серверной части или времени жизни соединения.