1) Por que o protocolo WebSockets é melhor?
O WebSockets é melhor para situações que envolvem comunicação de baixa latência, especialmente para baixa latência para mensagens de cliente para servidor. Para dados de servidor para cliente, é possível obter uma latência bastante baixa usando conexões de longa data e transferência em blocos. No entanto, isso não ajuda na latência do cliente para o servidor, o que requer que uma nova conexão seja estabelecida para cada mensagem de cliente para servidor.
Seu handshake HTTP de 48 bytes não é realista para conexões do navegador HTTP do mundo real, onde geralmente existem vários kilobytes de dados enviados como parte da solicitação (em ambas as direções), incluindo muitos dados de cabeçalhos e cookies. Aqui está um exemplo de uma solicitação / resposta para usar o Chrome:
Solicitação de exemplo (2800 bytes, incluindo dados do cookie, 490 bytes sem dados do cookie):
GET / HTTP/1.1
Host: www.cnn.com
Connection: keep-alive
Cache-Control: no-cache
Pragma: no-cache
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.17 (KHTML, like Gecko) Chrome/24.0.1312.68 Safari/537.17
Accept-Encoding: gzip,deflate,sdch
Accept-Language: en-US,en;q=0.8
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.3
Cookie: [[[2428 byte of cookie data]]]
Resposta de exemplo (355 bytes):
HTTP/1.1 200 OK
Server: nginx
Date: Wed, 13 Feb 2013 18:56:27 GMT
Content-Type: text/html
Transfer-Encoding: chunked
Connection: keep-alive
Set-Cookie: CG=US:TX:Arlington; path=/
Last-Modified: Wed, 13 Feb 2013 18:55:22 GMT
Vary: Accept-Encoding
Cache-Control: max-age=60, private
Expires: Wed, 13 Feb 2013 18:56:54 GMT
Content-Encoding: gzip
HTTP e WebSockets têm handshakes de conexão inicial de tamanho equivalente, mas com uma conexão WebSocket o handshake inicial é executado uma vez e, em seguida, pequenas mensagens possuem apenas 6 bytes de sobrecarga (2 para o cabeçalho e 4 para o valor da máscara). A sobrecarga de latência não é muito do tamanho dos cabeçalhos, mas da lógica para analisar / manipular / armazenar esses cabeçalhos. Além disso, a latência da configuração da conexão TCP provavelmente é um fator maior que o tamanho ou o tempo de processamento de cada solicitação.
2) Por que foi implementado em vez de atualizar o protocolo HTTP?
Há esforços para reprojetar o protocolo HTTP para obter melhor desempenho e menor latência, como SPDY , HTTP 2.0 e QUIC . Isso melhorará a situação das solicitações HTTP normais, mas é provável que o WebSockets e / ou o WebRTC DataChannel ainda tenham menor latência para transferência de dados de cliente para servidor do que o protocolo HTTP (ou será usado em um modo semelhante ao WebSockets enfim).
Atualização :
Aqui está uma estrutura para pensar em protocolos da web:
- TCP : camada de transporte de pedidos de baixo nível, bidirecional, full-duplex e garantida. Não há suporte para navegador (exceto via plugin / Flash).
- HTTP 1.0 : protocolo de transporte solicitação-resposta em camadas no TCP. O cliente faz uma solicitação completa, o servidor fornece uma resposta completa e a conexão é fechada. Os métodos de solicitação (GET, POST, HEAD) têm significado transacional específico para recursos no servidor.
- HTTP 1.1 : mantém a natureza de solicitação-resposta do HTTP 1.0, mas permite que a conexão permaneça aberta para várias solicitações / respostas completas (uma resposta por solicitação). Ainda possui cabeçalhos completos na solicitação e resposta, mas a conexão é reutilizada e não fechada. O HTTP 1.1 também adicionou alguns métodos de solicitação adicionais (OPTIONS, PUT, DELETE, TRACE, CONNECT) que também possuem significados transacionais específicos. No entanto, conforme observado na introdução à proposta de rascunho do HTTP 2.0, o pipelining do HTTP 1.1 não é amplamente implantado; portanto, isso limita muito o utilitário do HTTP 1.1 para resolver a latência entre navegadores e servidores.
- Pesquisa longa : tipo de "hack" para HTTP (1.0 ou 1.1) em que o servidor não responde imediatamente (ou apenas parcialmente com cabeçalhos) à solicitação do cliente. Após uma resposta do servidor, o cliente envia imediatamente uma nova solicitação (usando a mesma conexão se for através do HTTP 1.1).
- Streaming HTTP : uma variedade de técnicas (resposta em várias partes / partes) que permitem ao servidor enviar mais de uma resposta para uma única solicitação do cliente. O W3C está padronizando isso como Eventos Enviados pelo Servidor usando um
text/event-stream
tipo MIME. A API do navegador (que é bastante semelhante à API WebSocket) é chamada de API EventSource.
- Envio de cometa / servidor : este é um termo abrangente que inclui tanto pesquisas longas quanto streaming HTTP. As bibliotecas de cometas geralmente suportam várias técnicas para tentar maximizar o suporte entre navegadores e entre servidores.
- WebSockets : um TCP interno da camada de transporte que usa um handshake de atualização amigável para HTTP. Diferente do TCP, que é um transporte de streaming, o WebSockets é um transporte baseado em mensagens: as mensagens são delimitadas na conexão e são remontadas na íntegra antes da entrega ao aplicativo. As conexões WebSocket são bidirecionais, full-duplex e de longa duração. Após a solicitação / resposta inicial do handshake, não há semântica transacional e há muito pouco por sobrecarga de mensagem. O cliente e o servidor podem enviar mensagens a qualquer momento e devem lidar com o recebimento de mensagens de forma assíncrona.
- SPDY : uma proposta iniciada pelo Google para estender o HTTP usando um protocolo de conexão mais eficiente, mas mantendo toda a semântica do HTTP (solicitação / resposta, cookies, codificação). O SPDY apresenta um novo formato de estrutura (com quadros com prefixo de comprimento) e especifica uma maneira de colocar em camadas pares de solicitação / resposta HTTP na nova camada de estrutura. Cabeçalhos podem ser compactados e novos cabeçalhos podem ser enviados após a conexão ter sido estabelecida. Existem implementações do SPDY no mundo real em navegadores e servidores.
- HTTP 2.0 : possui objetivos semelhantes ao SPDY: reduz a latência e a sobrecarga do HTTP, preservando a semântica do HTTP. O rascunho atual é derivado do SPDY e define um handshake de atualização e um enquadramento de dados muito semelhante ao padrão WebSocket para handshake e enquadramento. Uma proposta de rascunho alternativa do HTTP 2.0 (httpbis-speed-Mobility) realmente usa WebSockets para a camada de transporte e adiciona a multiplexação SPDY e o mapeamento HTTP como uma extensão WebSocket (as extensões WebSocket são negociadas durante o handshake).
- WebRTC / CU-WebRTC : propostas para permitir conectividade ponto a ponto entre navegadores. Isso pode permitir uma comunicação de média e máxima latência mais baixa porque o transporte subjacente é SDP / datagrama em vez de TCP. Isso permite a entrega fora de ordem de pacotes / mensagens, o que evita a emissão de picos de latência causados por pacotes descartados, que atrasam a entrega de todos os pacotes subsequentes (para garantir a entrega em ordem).
- QUIC : é um protocolo experimental destinado a reduzir a latência da Web em relação à do TCP. Na superfície, o QUIC é muito semelhante ao TCP + TLS + SPDY implementado no UDP. O QUIC fornece multiplexação e controle de fluxo equivalente ao HTTP / 2, segurança equivalente ao TLS e semântica de conexão, confiabilidade e controle de congestionamento equivalentes ao TCP. Como o TCP é implementado nos kernels do sistema operacional e no firmware da caixa intermediária, é quase impossível fazer alterações significativas no TCP. No entanto, como o QUIC é construído sobre o UDP, ele não sofre essas limitações. O QUIC foi projetado e otimizado para semântica HTTP / 2.
Referências :
- HTTP :
- Evento enviado pelo servidor :
- WebSockets :
- SPDY :
- HTTP 2.0 :
- WebRTC :
- QUIC :