Соединение webSocket имеет свою собственную схему соединения (которая начинается с http-соединения), схему обновления с http до протокола webSocket, свою собственную схему согласования безопасности и собственный формат данных, и были некоторые изменения в спецификации c со временем, что означает, что вам может потребоваться поддержка нескольких версий для поддержки всех клиентов. Чтобы реализовать сервер webSocket, вы должны реализовать все это.
Необработанный протокол определяется здесь: https://tools.ietf.org/html/rfc6455
В двух словах:
Каждое соединение webSocket начинается с http-запроса, который содержит несколько пользовательских заголовков, указывающих, что это запрос «обновить» протокол webSocket. Этот первоначальный запрос также содержит ключ безопасности и номер версии безопасности.
Если сервер принимает обновление до протокола webSocket, он отправляет ответ с другим ключом безопасности.
После подтверждения в этот момент клиент или сервер могут начать отправку пакетов на другую сторону, используя формат пакета кадра данных webSocket и используя соответствующие ключи безопасности.
Пример:
Клиент отправляет:
GET /chat HTTP/1.1
Host: server.example.com
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Key: x3JJHMbDL1EzLkh9GBhXDw==
Sec-WebSocket-Protocol: chat, superchat
Sec-WebSocket-Version: 13
Origin: http://example.com
Сервер отвечает:
HTTP/1.1 101 Switching Protocols
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Accept: s3pPLMBiTxaQ9kYGzzhZRbK+xOo=
И, идея, как выглядит фрейм данных:
0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-------+-+-------------+-------------------------------+
|F|R|R|R| opcode|M| Payload len | Extended payload length |
|I|S|S|S| (4) |A| (7) | (16/64) |
|N|V|V|V| |S| | (if payload len==126/127) |
| |1|2|3| |K| | |
+-+-+-+-+-------+-+-------------+ - - - - - - - - - - - - - - - +
| Extended payload length continued, if payload len == 127 |
+ - - - - - - - - - - - - - - - +-------------------------------+
| |Masking-key, if MASK set to 1 |
+-------------------------------+-------------------------------+
| Masking-key (continued) | Payload Data |
+-------------------------------- - - - - - - - - - - - - - - - +
: Payload Data continued ... :
+ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
| Payload Data continued ... |
+---------------------------------------------------------------+
Вы можете увидеть некоторые другие обсуждения того, как протокол в этих других ответах:
nodejs net сокеты + websocket без socket.io
Используют ли реализации веб-сокета внутренне протокол HTTP?
В чем разница между обменом данными через WebSocket и обычным сокетом?
Если только это Academi c Exe Из соображений изучения, это действительно, очень неэффективное использование вашего времени разработчика для повторной реализации протокола низкого уровня, для которого уже существуют стандартные, хорошо протестированные реализации с открытым исходным кодом. Вы будете тратить много времени на низкоуровневое переключение битов и тестирование совместимости с различными реализациями клиентов, а затем больше времени на обслуживание по мере развития стандарта.