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
Используйте этот рабочий процесс:
- Сохраните DNS и TCP-соединение.
- Проверьте рукопожатие TLS для
wss://. - Проверьте заголовки запросов на обновление клиента.
- Проверьте статус ответа сервера.
- Подтвердите «101 протокол коммутации», если ожидается.
- Сравните запросы клиент-прокси и прокси-сервер.
- Ищите перенаправления или ответы аутентификации.
- Если обновление прошло успешно, проверьте FIN/RST/тайм-аут после обновления.
- Сохраните время пинг-понга WebSocket, если оно отображается.
- Обрезайте только после сохранения полного рукопожатия.
Окончательный диагноз
Сбои обновления WebSocket обычно связаны с HTTP-квитированием или проблемами пересылки прокси-сервера, пока не будет проверен «101 протокол коммутации». После обновления сбои приводят к длительному тайм-ауту TCP, сбросу или проблемам протокола приложения.
PCAP Surgery помогает сохранить обе фазы, поэтому неопределенную ошибку WebSocket можно отследить по заголовкам, поведению прокси-сервера, TLS, ответу серверной части или времени жизни соединения.