Resposta de handshake do Websocket não encaminhada do TCP para o cliente

0

Estou tentando criar um servidor de websocket. Eu posso ver o handhshake de abertura do cliente websocket. Minha resposta é recebida pelo laptop do cliente (eu posso ver isso no wireshark). Então a conexão TCP foi estabelecida. Mas o cliente (uma extensão do cliente websocket do chrome) não recebe o pacote de handshake. Qual poderia ser uma razão possível para o TCP não encaminhar o handshake para o cliente ou para o cliente não conseguir ler a mensagem TCP?

Aperto de mão do cliente:

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

Resposta do servidor:

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: 

Obrigado!

    
por s2o_ozman 08.06.2014 / 09:53

1 resposta

1

De acordo com a especificação WebSockets, um cabeçalho Sec-WebSocket-Extensions em branco não é permitido e considerado dados malformados, e "o destinatário de tais dados malformados DEVE imediatamente Fail the WebSocket Connection ." (ênfase deles)

link

Se o seu servidor WebSockets não suportar nenhuma dessas extensões, você deve omitir esse cabeçalho em vez de anexá-lo, mas deixá-lo mal formado (em branco). Em outro lugar na especificação, ele menciona que o cliente deve considerar a lista de extensões de suporte como nula se esse cabeçalho não estiver presente na resposta do servidor.

Atualizado para adicionar:
Eu também acredito que a saída Sec-WebSocket-Accept do seu servidor está incorreta.

Eu escrevi a seguinte função shell para obter um valor Sec-WebSocket-Key e calcular um Sec-WebSocket-Accept dele

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

Eu testei isso com o exemplo da especificação WebSockets RFC6455 e ele obtém o valor correto:

$ wscalc dGhlIHNhbXBsZSBub25jZQ==
s3pPLMBiTxaQ9kYGzzhZRbK+xOo=

Mas quando eu executo no Sec-WebSocket-Key do seu cliente, recebo um valor diferente do que o seu servidor colocou em Sec-WebSocket-Accept :

$ wscalc 'qrmw/m+BoZije6h9HYKmVw=='
B18B9fmlWz7D6Gu9eCWRNkcB1II=
    
por 08.06.2014 / 11:32