Декодер кадров WebSocket (RFC 6455)
Вставьте сырые байты кадра WebSocket (шестнадцатеричный или двоичный формат) и декодируйте заголовок RFC 6455 поле за полем — FIN, RSV, opcode, MASK, формы длины полезной нагрузки 7/16/64-бит, ключ маскирования и демаскированную полезную нагрузку XOR — с разбивкой по смещению байта.
Ввод
Вывод
Поля кадра
| Поле | Значение |
|---|---|
| No data yet | |
Структура байтов
| Смещение | Байты (hex) | Часть | Декодировано |
|---|---|---|---|
| No data yet | |||
Полезная нагрузка
| Поле | Значение |
|---|---|
| No data yet | |
Экспорт JSON
Руководства
Что такое WebSocket-кадр?
Каждое сообщение, отправляемое через соединение WebSocket, заключено в кадр — небольшой двоичный заголовок (определенный RFC 6455 §5.2), за которым следуют данные полезной нагрузки. Заголовок компактно упаковывает несколько полей в первый или два байта: бит FIN, три бита RSV (зарезервированные), 4-битный opcode, идентифицирующий тип кадра (text, binary, ping, pong, close…), бит MASK и длину полезной нагрузки, которая может занимать три разные ширины байтов в зависимости от размера полезной нагрузки. Если кадр замаскирован, полезная нагрузка также подвергается XOR с 4-байтовым ключом маскирования перед тем, как вы сможете его прочитать. Ничего из этого нельзя прочитать с первого взгляда — этот инструмент декодирует его поле за полем.
Как это использовать
- Вставьте сырые байты кадра как hex (разделенные пробелом, двоеточием или
0x—81 05 48 65 6c 6c 6fи0x81,0x05,0x48,0x65,0x6c,0x6c,0x6fоба работают) или как двоичную строку битов (напр.10000001 00000101 ...). - Frame Fields отображает FIN, RSV1–3, opcode (с его именем), MASK, как необработанное поле длины 7-бит, так и фактически разрешенную длину полезной нагрузки, ключ маскирования (если есть) и любые предупреждения протокола.
- Byte Structure разбивает кадр по смещению байта — какие байты составляют заголовок, расширенную длину (если присутствует), ключ маскирования (если присутствует) и полезную нагрузку — отражая макет на диаграмме RFC 6455.
- Payload показывает полезную нагрузку как полученную (все еще замаскированную, если применимо), де-XOR hex и — для текстовых кадров — декодированный текст UTF-8. Кадры закрытия получают свой 2-байтовый код состояния и фразу причины UTF-8, разделенные отдельно.
- JSON Export предоставляет те же декодированные поля как единый объект JSON для скриптов или отчетов об ошибках.
Три формы длины полезной нагрузки
Младшие 7 бит второго байта кодируют длину, но какое значение они несут, зависит от значения:
- 0–125 — это фактическая длина полезной нагрузки.
- 126 — реальная длина следует как следующие 2 байта (big-endian, unsigned 16-bit).
- 127 — реальная длина следует как следующие 8 байтов (big-endian, unsigned 64-bit; старший бит должен быть 0 по RFC).
Маскирование
Кадры клиента к серверу должны быть замаскированы (MASK=1) — полезная нагрузка XORится побайтово с 4-байтовым ключом маскирования, который сразу же следует за полем длины, цикличeся ключ каждые 4 байта (payload[i] XOR key[i mod 4]). Кадры сервера к клиенту обычно не замаскированы. Этот инструмент автоматически демаскирует всякий раз, когда MASK=1, и показывает как необработанный, так и немаскированный hex, чтобы вы могли сравнить.
Что этот инструмент помечает как предупреждение
- Control frame (close/ping/pong, opcode 0x8–0xA) с FIN=0, или с полезной нагрузкой более 125 байтов — оба недействительны согласно RFC 6455 §5.5 (control frame не может быть фрагментирован или содержать большие полезные нагрузки).
- Любой установленный RSV бит без согласованного расширения, чтобы его определить.
- Зарезервированный opcode (0x3–0x7 или 0xB–0xF) — не определен без расширения.
- Усеченный кадр — объявленная длина превышает действительно предоставленные байты.
Что этот инструмент не делает
Декодирует заголовок одного уже захваченного кадра — не открывает активное соединение WebSocket, не собирает последовательность фрагментированных кадров (кадров продолжения opcode 0x0) в одно логическое сообщение и не валидирует handshake HTTP Upgrade, который предшествует любому трафику WebSocket.
FAQ
Где я могу получить сырые байты кадра для вставки? Захватите их на панели DevTools Network вашего браузера (вкладка WS → нажмите на кадр → сырые байты), из захвата пакетов (Wireshark's "Follow → WebSocket Stream" или hex-представление TCP payload), или из инструмента прокси, такого как Burp/mitmproxy.
Почему мой ввод не удается распарсить? Заголовок кадра составляет минимум 2 байта — убедитесь, что вы вставили полный кадр, а не только payload. Hex-вход требует четного количества hex-цифр; двоичный вход требует количества битов, кратного 8.
Мои данные куда-то загружаются? Нет — декодирование выполняется полностью в вашем браузере. Ничто, что вы вставляете, никогда не покидает ваше устройство.
Связанные инструменты
- Hex Dump Viewer — для общего просмотра на уровне байтов любого двоичного блока.
- HTTP Header Analyzer — декодируйте handshake HTTP Upgrade, который предшествует соединению WebSocket.
- Raw HTTP Request Parser — распарсьте необработанную строку HTTP-запроса и заголовки.
Другие способы использовать этот инструмент
REST API
curl -X POST https://api.iotools.cloud/v1/tool/websocket-frame-decoder \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"frameInput": "81 05 48 65 6c 6c 6f"
}'Подставьте свой собственный ключ из аккаунта. Поля инструмента — это тело запроса, без обёртки.
Спросите у ИИ-агента
Use the IOTools `websocket-frame-decoder` tool (WebSocket Frame Decoder (RFC 6455)) on this input:
YOUR_INPUT_HEREВставьте это любому агенту, подключённому к MCP-серверу IOTools, и добавьте свой ввод.
Виджет для встраивания
<iframe
src="https://iotools.cloud/embed/websocket-frame-decoder/"
width="100%" height="520" frameborder="0" scrolling="no" loading="lazy"
title="Декодер кадров WebSocket (RFC 6455) — iotools.cloud"
sandbox="allow-scripts allow-forms allow-same-origin allow-downloads allow-popups allow-popups-to-escape-sandbox"
allow="clipboard-write"
style="width:100%;border:1px solid #e5e7eb;border-radius:12px;overflow:hidden"></iframe>
<script src="https://iotools.cloud/embed.js" async></script>Вставьте это на свою страницу — бесплатно, без ключа, нужна лишь обратная ссылка.
| Стоимость вызова | От 5 кредитов |
|---|