O que significa multiplexação em HTTP / 2


Respostas:


215

Simplificando, a multiplexação permite que seu navegador dispare várias solicitações ao mesmo tempo na mesma conexão e receba as solicitações de volta em qualquer ordem.

E agora para a resposta muito mais complicada ...

Quando você carrega uma página da web, ele baixa a página HTML, vê que precisa de algum CSS, algum JavaScript, um carregamento de imagens ... etc.

Em HTTP / 1.1, você só pode baixar um de cada vez em sua conexão HTTP / 1.1. Assim, seu navegador baixa o HTML e, a seguir, pede o arquivo CSS. Quando isso é retornado, ele pede o arquivo JavaScript. Quando isso é retornado, ele pede o primeiro arquivo de imagem ... etc. O HTTP / 1.1 é basicamente síncrono - uma vez que você envia uma solicitação, você fica preso até obter uma resposta. Isso significa que, na maioria das vezes, o navegador não está fazendo muito, pois disparou uma solicitação, está aguardando uma resposta, depois dispara outra solicitação e, em seguida, está aguardando uma resposta ... etc. É claro que sites complexos com muito JavaScript exige que o navegador faça muito processamento, mas isso depende do download do JavaScript, portanto, pelo menos no início, os atrasos herdados do HTTP / 1.1 causam problemas. Normalmente, o servidor não é

Portanto, um dos principais problemas da web hoje é a latência da rede no envio de solicitações entre o navegador e o servidor. Pode ser apenas dezenas ou talvez centenas de milissegundos, o que pode não parecer muito, mas eles se somam e costumam ser a parte mais lenta da navegação na web - especialmente à medida que os sites ficam mais complexos e exigem recursos extras (conforme estão obtendo) e acesso à Internet é cada vez mais via celular (com latência mais lenta do que a banda larga).

Como exemplo, digamos que haja 10 recursos que sua página da web precisa carregar após o próprio HTML ser carregado (que é um site muito pequeno para os padrões de hoje, pois mais de 100 recursos são comuns, mas vamos mantê-lo simples e continuar com isso exemplo). E digamos que cada solicitação leve 100 ms para percorrer a Internet até o servidor da Web e voltar e o tempo de processamento em qualquer uma das extremidades seja insignificante (digamos 0 para este exemplo, para simplificar). Como você tem que enviar cada recurso e esperar uma resposta um de cada vez, isso levará 10 * 100ms = 1.000ms ou 1 segundo para baixar o site inteiro.

Para contornar isso, os navegadores geralmente abrem várias conexões com o servidor da web (normalmente 6). Isso significa que um navegador pode disparar várias solicitações ao mesmo tempo, o que é muito melhor, mas ao custo da complexidade de ter que configurar e gerenciar várias conexões (o que afeta o navegador e o servidor). Vamos continuar o exemplo anterior e também dizer que existem 4 conexões e, para simplificar, vamos dizer que todos os pedidos são iguais. Nesse caso, você pode dividir as solicitações em todas as quatro conexões, de modo que dois terão 3 recursos para obter e dois terão 2 recursos para obter totalmente os dez recursos (3 + 3 + 2 + 2 = 10). Nesse caso, o pior caso são 3 rodadas ou 300ms = 0,3 segundos - uma boa melhoria, mas este exemplo simples não inclui o custo de configuração dessas conexões múltiplas,

HTTP / 2 permite que você envie várias solicitações no mesmoconexão - então você não precisa abrir várias conexões conforme acima. Portanto, seu navegador pode dizer "Gimme this CSS file. Gimme that JavaScript file. Gimme image1.jpg. Gimme image2.jpg ... Etc." para utilizar totalmente uma única conexão. Isso tem o benefício óbvio de desempenho de não atrasar o envio das solicitações que aguardam uma conexão gratuita. Todas essas solicitações fazem seu caminho através da Internet para o servidor em (quase) paralelo. O servidor responde a cada um, e então eles começam a voltar. Na verdade, é ainda mais poderoso do que isso, pois o servidor web pode responder a eles em qualquer ordem que desejar e enviar arquivos de volta em ordem diferente, ou até mesmo quebrar cada arquivo solicitado em pedaços e misturar os arquivos.problema de bloqueio do chefe de linha ). O navegador da web é então encarregado de juntar todas as peças novamente. Na melhor das hipóteses (assumindo que não há limites de largura de banda - veja abaixo), se todas as 10 solicitações forem disparadas praticamente ao mesmo tempo em paralelo e forem respondidas pelo servidor imediatamente, isso significa que você basicamente tem uma viagem de ida e volta ou 100 ms ou 0,1 segundo, para baixe todos os 10 recursos. E isso não tem nenhuma das desvantagens que as conexões múltiplas tinham para HTTP / 1.1! Isso também é muito mais escalonável à medida que os recursos em cada site aumentam (atualmente os navegadores abrem até 6 conexões paralelas em HTTP / 1.1, mas isso deve crescer à medida que os sites se tornam mais complexos?).

Este diagrama mostra as diferenças e também há uma versão animada .

Nota: HTTP / 1.1 tem o conceito de pipelining, que também permite que várias solicitações sejam enviadas de uma vez. No entanto, eles ainda tinham que ser devolvidos na ordem em que foram solicitados, em sua totalidade, portanto, nem de longe tão bons quanto HTTP / 2, mesmo que conceitualmente seja semelhante. Sem mencionar o fato de que isso é tão mal suportado por navegadores e servidores que raramente é usado.

Uma coisa destacada nos comentários abaixo é como a largura de banda nos afeta aqui. Claro que sua conexão com a Internet é limitada pela quantidade que você pode baixar e HTTP / 2 não resolve isso. Portanto, se os 10 recursos discutidos nos exemplos acima forem todos imagens de grande qualidade de impressão, o download deles ainda será lento. No entanto, para a maioria dos navegadores da web, a largura de banda é menos problemática do que a latência. Portanto, se esses dez recursos são itens pequenos (particularmente recursos de texto como CSS e JavaScript que podem ser compactados para serem minúsculos), como é muito comum em sites, a largura de banda não é realmente um problema - é o grande volume de recursos que muitas vezes problema e HTTP / 2 procura resolver isso. É também por isso que a concatenação é usada em HTTP / 1.1 como outra solução alternativa, então, por exemplo, todos os CSS são frequentemente agrupados em um arquivo:anti-padrão em HTTP / 2 - embora haja argumentos contra eliminá-lo completamente também).

Para colocá-lo como um exemplo do mundo real: suponha que você tenha que pedir 10 itens de uma loja para entrega em casa:

  • HTTP / 1.1 com uma conexão significa que você deve fazer o pedido um de cada vez e não pode pedir o próximo item até que o último chegue. Você pode entender que levaria semanas para resolver tudo.

  • HTTP / 1.1 com conexões múltiplas significa que você pode ter um número (limitado) de pedidos independentes em movimento ao mesmo tempo.

  • HTTP / 1.1 com pipelining significa que você pode solicitar todos os 10 itens, um após o outro, sem esperar, mas todos eles chegam na ordem específica que você solicitou. E se um item estiver fora de estoque, você terá que esperar por isso antes de receber os itens encomendados depois disso - mesmo se esses itens posteriores estiverem realmente em estoque! Isso é um pouco melhor, mas ainda está sujeito a atrasos, e digamos que a maioria das lojas não apóie essa forma de pedido de qualquer maneira.

  • HTTP / 2 significa que você pode solicitar seus itens em qualquer ordem específica - sem atrasos (semelhante ao anterior). A loja irá despachá-los assim que estiverem prontos, então eles podem chegar em um pedido diferente do que você pediu, e eles podem até mesmo dividir os itens para que algumas partes desse pedido cheguem primeiro (melhor do que acima). Em última análise, isso deve significar que você 1) obterá tudo mais rápido no geral e 2) poderá começar a trabalhar em cada item assim que chegar ("oh, isso não é tão bom quanto eu pensei que seria, então, talvez eu queira pedir outra coisa também ou em vez disso" )

Claro que você ainda está limitado pelo tamanho da van do carteiro (a largura de banda), então eles podem ter que deixar alguns pacotes de volta na sala de triagem até o dia seguinte se eles estiverem lotados para aquele dia, mas isso raramente é um problema comparado ao atraso no envio do pedido de ida e volta. A maior parte da navegação na web envolve o envio de pequenas cartas para a frente e para trás, em vez de pacotes volumosos.

Espero que ajude.


8
Explicação incrível. Exemplo é o que eu precisava para conseguir isso. Portanto, no HTTP / 1.1 há uma perda de tempo entre esperar pela resposta e despachar a próxima solicitação. HTTP / 2 corrige isso. Obrigado.
user3448600

1
Mas duro, eu acho. Poderia ter apenas me pedido para adicionar uma peça sobre largura de banda - o que estou feliz em fazer e farei quando terminarmos esta discussão. No entanto, a largura de banda IMHO não é um problema tão grande para a navegação na web (pelo menos no mundo ocidental) - a latência é. E o HTTP / 2 melhora a latência. A maioria dos sites é composta de muitos recursos pequenos e, mesmo se você tiver largura de banda para baixá-los (como costumam fazer), será lento devido à latência da rede. A largura de banda se torna mais um problema para grandes recursos. Concordo que esses sites com imagens enormes e outros recursos ainda podem atingir um limite de largura de banda.
Barry Pollard de

1
O HTTP não deve ser usado para impor pedidos - porque não oferece tais garantias. Com HTTP / 2 você pode sugerir uma prioridade de entrega, mas não um pedido. Além disso, se um de seus ativos JavaScript estiver em cache, mas o outro não, o HTTP não poderá influenciar nem mesmo a prioridade. Em vez disso, você deve usar ordenação no HTML juntamente com o uso apropriado de assíncrono ou adiar ( growthwiththeweb.com/2014/02/async-vs-defer-attributes.html ), ou uma biblioteca como require.js.
Barry Pollard

1
Ótima explicação. Obrigado!
hmacias de

2
É porque HTTP / 1.1 é um fluxo de texto e HTTP / 2 é baseado em pacotes - bem, eles são chamados de quadros em HTTP / 2 em vez de pacotes. Assim, em HTTP / 2, cada quadro pode ser marcado em um fluxo que permite a intercalação dos quadros. No HTTP / 1.1 não existe tal conceito, pois é apenas uma série de linhas de texto para o cabeçalho e depois o corpo. Mais detalhes aqui: stackoverflow.com/questions/58498116/…
Barry Pollard

5

Solicitar multiplexação

O HTTP / 2 pode enviar várias solicitações de dados em paralelo em uma única conexão TCP. Este é o recurso mais avançado do protocolo HTTP / 2 porque permite que você baixe arquivos da web de forma assíncrona de um servidor. A maioria dos navegadores modernos limita as conexões TCP a um servidor. Isso reduz o tempo adicional de ida e volta (RTT), tornando o carregamento do seu site mais rápido sem qualquer otimização e torna desnecessária a fragmentação de domínio.

insira a descrição da imagem aqui


4

Resposta simples ( fonte ):

Multiplexação significa que seu navegador pode enviar várias solicitações e receber várias respostas "agrupadas" em uma única conexão TCP. Portanto, a carga de trabalho associada às pesquisas de DNS e apertos de mão é salva para arquivos vindos do mesmo servidor.

Resposta complexa / detalhada:

Veja a resposta fornecida por @BazzaDP.


1
isso pode ser feito usando pipelining também em http 1.1. O principal objetivo da multiplexação em HTTP2 é não esperar pelas respostas de forma ordenada
Dhairya Lakhera

3

A multiplexação no HTTP 2.0 é o tipo de relacionamento entre o navegador e o servidor que usa uma única conexão para entregar várias solicitações e respostas em paralelo, criando muitos quadros individuais neste processo.

A multiplexação rompe com a semântica estrita de solicitação-resposta e permite relacionamentos um-para-muitos ou muitos-para-muitos.

Processo de intercâmbio HTTP1 VS HTTP2


Seu exemplo de multiplexação HTTP / 2 não mostra realmente a multiplexação. O cenário em seu diagrama mostra o pipelining HTTP que foi introduzido no HTTP / 1.1.
ich5003

@ ich5003 É multiplexação porque usa uma única conexão. Mas também é verdade que não estão representados os casos de envio de várias respostas por apenas uma solicitação.
Juanma Menendez

1
o que tento dizer é que o cenário mostrado acima também pode ser alcançado apenas usando pipelining HTTP.
ich5003

Acredito que a fonte de confusão aqui é a ordem de solicitação / resposta no diagrama à direita - eles exibem um caso especial de multiplexação em HTTP / 2 que também pode ser obtido por pipelining em HTTP / 1.1. Se a ordem de resposta no diagrama for diferente da ordem de solicitação, não haverá confusão.
raiks

1

Já que a resposta de @Juanma Menendez está correta e seu diagrama é confuso, decidi aprimorá-lo, esclarecendo a diferença entre multiplexação e pipelining, noções que costumam ser confundidas.

Pipelining (HTTP / 1.1)

Várias solicitações são enviadas pela mesma conexão HTTP. As respostas são recebidas na mesma ordem. Se a primeira resposta demorar muito, outras respostas terão que esperar na fila. Semelhante ao pipeling da CPU, em que uma instrução é buscada enquanto outra está sendo decodificada. Várias instruções estão em andamento ao mesmo tempo, mas sua ordem é preservada.

Multiplexação (HTTP / 2)

Várias solicitações são enviadas pela mesma conexão HTTP. As respostas são recebidas na ordem arbitrária. Não há necessidade de esperar por uma resposta lenta que está bloqueando os outros. Semelhante à execução de instruções fora de ordem em CPUs modernas.

Esperançosamente, a imagem aprimorada esclarece a diferença:

Fluxo / Pipelining / Multiplexação HTTP / 1.1 padrão

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.