Что такое 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.