PassFront
  1. PassFront
  2. База знаний
  3. DNS, WebSocket и другие протоколы

Что такое handshake в протоколе WebSocket?

DNS, WebSocket и другие протоколы

WebSocket handshake — начальный HTTP-запрос, с помощью которого клиент просит сервер перейти с HTTP на протокол WebSocket в рамках того же TCP-соединения.

Как проходит

Клиент отправляет обычный HTTP GET с заголовком Upgrade:

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

Сервер соглашается ответом 101 Switching Protocols:

HTTP/1.1 101 Switching Protocols
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Accept: s3pPLMBiTxaQ9kYGzzhZRbK+xOo=

Sec-WebSocket-Accept — хеш от ключа клиента: подтверждает, что сервер понимает WebSocket. После этого по тому же соединению передаются бинарные и текстовые кадры в обе стороны.

Зачем так сделано

  • Работает через стандартные порты 80/443 и проходит через прокси и балансировщики.
  • Можно передать cookie, Origin и заголовки авторизации для проверки доступа.
  • Для защищённого канала используют wss:// (TLS).

Нюансы

  • Браузерный API не позволяет задавать произвольные заголовки, поэтому токены часто передают в query или subprotocol.
  • Сервер проверяет Origin, иначе возможен межсайтовый захват соединения.

Коротко для собеседования

Handshake — HTTP-запрос с Upgrade: websocket, на который сервер отвечает 101 Switching Protocols. После этого то же TCP-соединение используется для двунаправленных кадров WebSocket.

Другие вопросы раздела