Enviando quadro de ping / pong do websocket a partir do navegador

130

Continuo lendo sobre mensagens de ping / pong nos websockets para manter a conexão ativa, mas não sei ao certo o que são. É um tipo de quadro distinto? (Não vejo nenhum método em um objeto WebSocket javascript no chrome relacionado ao ping-pong). Ou é apenas um padrão de design (por exemplo, eu literalmente enviei "ping" ou qualquer outra string para o servidor e ele respondeu). O pingue-pongue está relacionado a quadros de continuação?

O motivo pelo qual pergunto é que estou usando uma estrutura python que roda atrás do Mongrel2, por isso estou pensando se há uma maneira de enviar ao Mongrel2 uma mensagem específica de ping / pong que diria para manter a conexão ativa sem a necessidade de meu aplicativo python. preocupado com isso. Análogo a ter um método HTTP separado, eu acho. E imagino que um quadro de mensagem de ping / pong dedicado possa ser mais simples (menos carga no servidor e na rede) do que a string "ping", embora isso provavelmente não importe muito.

Edição: Acabei de olhar para RFC 6455 e parece que Ping e Pong são definitivamente tipos de quadros de controle com seus próprios opcodes. Então, como envio um quadro Ping a partir do javascript no Chrome?

danny
fonte
Basta executar ping no servidor. Todo mundo sabe sobre o problema de rede em portas não padrão, então eles estão começando a executar ping em intervalos curtos regulares. Eu acho que você pode executar ping em um servidor mal escrito, mas pode não ser muito inteligente fazer algo sensível a eles.
@ user1382306 o ping do servidor primeiro utilizará a bateria do dispositivo móvel muito rapidamente. Ping do cliente pode economizar bateria do dispositivo.
bronze man
@ user1382306 Nem todo mundo! Qual é o problema de rede em portas não padrão?
214 HappyDog

Respostas:

121

Não há API Javascript para enviar quadros de ping ou receber quadros de pong. Isso é suportado pelo seu navegador ou não. Também não há API para ativar, configurar ou detectar se o navegador suporta e está usando quadros de ping / pong. Houve discussão sobre a criação de uma API Javascript ping / pong para isso. Existe a possibilidade de que os pings possam ser configuráveis ​​/ detectáveis ​​no futuro, mas é improvável que o Javascript possa enviar e receber diretamente quadros de ping / pong.

No entanto, se você controlar o código do cliente e do servidor, poderá adicionar facilmente o suporte a ping / pong em um nível superior. Você precisará de algum tipo de cabeçalho / metadado do tipo de mensagem na sua mensagem, se ainda não a tiver, mas isso é bastante simples. A menos que você esteja planejando enviar pings centenas de vezes por segundo ou ter milhares de clientes simultâneos, a sobrecarga será bastante mínima para você fazer isso sozinho.

kanaka
fonte
1
@bigmugcup O link está morto
Sr. Jo
19

O ping deve ser enviado apenas do servidor para o cliente, e o navegador deve responder o mais rápido possível com o Pong OpCode, automaticamente. Então você não precisa se preocupar com isso em um nível superior.

Embora nem todos os navegadores suportem o padrão como supõem, eles podem ter algumas diferenças na implementação desse mecanismo e pode até significar que não há funcionalidade de resposta do Pong. Mas, pessoalmente, estou usando Ping / Pong e nunca vi clientes que não implementam esse tipo de OpCode e resposta automática na implementação de baixo nível do lado do cliente.

moka
fonte
73
Onde você leu que o ping é apenas do servidor para o cliente? O RFC diz "Um terminal PODE enviar um quadro de ping a qualquer momento após a conexão ser estabelecida e antes do fechamento da conexão".
precisa saber é o seguinte
7
Se você deseja que o cliente detecte automaticamente um estado desconectado (quando nenhum pacote RST / FIN foi recebido, mas a rede foi desconectada), será necessário que o cliente inicie também os pacotes ping.
Pschwamb
13
O TCP não notifica as desconexões quando os pacotes RST / FIN não foram recebidos. O TCP só detecta conexões descartadas quando um remetente tenta enviar uma conexão desconectada. Pings são usados ​​como pulsações em muitos aplicativos e é um uso válido. Uma conexão morta simplesmente permanecerá morta para sempre até que o cliente tente enviar. Portanto, com o WebSockets no navegador, uma mensagem personalizada de ping (ou pulsação) deve ser usada para detectar a desconexão do cliente no lado do cliente. O servidor pode estar tentando executar ping e detectando a desconexão do cliente, mas o cliente não é informado. Cliente pings também estão bem.
DDS
15
No RFC 6455, o Protocolo WebSocket, ele declara explicitamente: "Observação: um quadro Ping pode servir como um keepalive ou como um meio de verificar se o ponto de extremidade remoto ainda responde."
DDS
4
É possível que o ping somente do servidor tenha sido uma prática recomendada quando os agentes do usuário foram atualizados com frequência. Mas agora muitos sites são projetados como SPAs. Nesse ambiente, pode ser bastante essencial para o aplicativo cliente executar ping regularmente no servidor para garantir que a conexão não seja perdida.
Noel Abrahams