Я пытаюсь создать сервер веб-сокетов. Я вижу открывающее рукопожатие клиента websocket. Мой ответ на него получен клиентским ноутбуком (я вижу это на wireshark). Итак, соединение TCP установлено. Но клиент (расширение клиента веб-сокета Chrome) не получает пакет квитирования. Что может быть причиной того, что TCP не передает рукопожатие клиенту, или клиенту не удается прочитать сообщение TCP?

Рукопожатие клиента:

GET HTTP/1.1
Upgrade: websocket
Connection:Upgrade
Cache-Control:no-cache
Host:192.168.0.101
Origin:http://www.websocket.org
Pragma:no-cache
Sec-WebSocket-Extensions:permessage-deflate; client_max_window_bits, x-webkit-deflate-frame
Sec-WebSocket-Key: qrmw/m+BoZije6h9HYKmVw==
Sec-WebSocket-Version:13
Upgrade:websocket

Ответ сервера:

HTTP/1.1 101 Switching Protocols
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Accept: jj1g5Io57m9ks8cme3jkbyo2asc=
Access-Control-Allow-Origin: http://www.websocket.org
Server: xyz
Sec-WebSocket-Extensions: 

Спасибо!

1 ответ1

1

Согласно спецификации WebSockets, пустой заголовок Sec-WebSocket-Extensions не допускается и считается некорректными данными, и «получатель таких искаженных данных ДОЛЖЕН немедленно прервать соединение WebSocket ». (акцент их)

http://tools.ietf.org/html/rfc6455#section-9.1

Если ваш сервер WebSockets не поддерживает ни одно из этих расширений, вы должны пропустить этот заголовок, вместо того, чтобы добавлять его, но оставляя его искаженным (пустым). В другом месте в спецификации упоминается, что клиент должен считать список расширений поддержки пустым, если этот заголовок отсутствует в ответе сервера.

Обновлено, чтобы добавить:
Я также считаю, что вывод Sec-WebSocket-Accept вашего сервера является неправильным.

Я написал следующую функцию оболочки, чтобы получить значение Sec-WebSocket-Key и вычислить из него Sec-WebSocket-Accept

wscalc () {
    WSGUID="258EAFA5-E914-47DA-95CA-C5AB0DC85B11"
    echo -n "${1}${WSGUID}" | openssl sha1 -binary | openssl base64
}

Я протестировал это на примере из спецификации WebSockets RFC6455, и он получил правильное значение:

$ wscalc dGhlIHNhbXBsZSBub25jZQ==
s3pPLMBiTxaQ9kYGzzhZRbK+xOo=

Но когда я запускаю его на Sec-WebSocket-Key вашего клиента, я получаю значение, отличное от того, что ваш сервер поместил в Sec-WebSocket-Accept:

$ wscalc 'qrmw/m+BoZije6h9HYKmVw=='
B18B9fmlWz7D6Gu9eCWRNkcB1II=

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .