Esclarecimento do cabeçalho Keep-alive

106

Pediram-me para construir um site e um dos co-desenvolvedores me disse que eu precisaria incluir o cabeçalho keep-alive.

Bem, eu li muito sobre isso e ainda tenho dúvidas.

msdn ->

A conexão aberta melhora o desempenho quando um cliente faz várias solicitações de conteúdo da página da Web, porque o servidor pode retornar o conteúdo de cada solicitação mais rapidamente. Caso contrário, o servidor deve abrir uma nova conexão para cada solicitação

Olhando para

insira a descrição da imagem aqui

  • Quando o IIS (F) envia keep alivecabeçalho ( ou usuário envia keep-alive ), isso significa que ( E, C, B) salvar uma conexão que é apenas para a minha sessão?
  • Onde essa informação é mantida ( "esta conexão pertence a" Royi " )?
  • Isso significa que ninguém mais pode usar essa conexão
  • Em caso afirmativo - isso significa que o cabeçalho keep alive - reduz o número de usuários de conexão sobreposta?
  • em caso afirmativo, por quanto tempo a conexão é salva para mim? (em outras palavras, se eu definir keep alive- "manter" até quando?)

ps para quem estiver interessado:

clicar nesta página de amostra retornará o cabeçalho keep alive

Royi Namir
fonte
2
Pfff, eu vi isso em uma palestra, mas não tenho certeza. Achei que o keep-alive estava apenas no servidor e no usuário. Afinal, tudo que está no meio nem deveria saber que é HTTP, muito menos olhar para os cabeçalhos.
Noctua
A declaração citada do MSDN é drivel. É o cliente que deve abrir uma nova conexão se não houver keep-alive.
Marquês de Lorne
E se você estiver construindo um site, não um servidor ou cliente da Web, o cabeçalho keepalive já foi feito para você.
Marquês de Lorne

Respostas:

145

Onde essa informação é mantida ("esta conexão é entre o computador Ae o servidor F")?

Uma conexão TCP é reconhecida pelo IP e porta de origem e IP e porta de destino. Seu sistema operacional, todos os dispositivos com reconhecimento de sessão intermediária e o sistema operacional do servidor reconhecerão a conexão por meio disso.

O HTTP trabalha com solicitação-resposta: o cliente se conecta ao servidor, realiza uma solicitação e obtém uma resposta. Sem o keep-alive, a conexão com um servidor HTTP é fechada após cada resposta. Com HTTP keep-alive, você mantém a conexão TCP subjacente aberta até que certos critérios sejam atendidos.

Isso permite vários pares de solicitação-resposta em uma única conexão TCP, eliminando parte da inicialização relativamente lenta da conexão do TCP.

Quando o IIS (F) envia o cabeçalho keep alive (ou o usuário envia keep-alive), isso significa que (E, C, B) salva uma conexão

Não. Os roteadores não precisam se lembrar das sessões. Na verdade, vários pacotes TCP pertencentes à mesma sessão TCP não precisam passar pelos mesmos roteadores - ou seja, para o TCP gerenciar. Os roteadores apenas escolhem o melhor caminho IP e encaminham os pacotes. Keep-alive é apenas para cliente, servidor e quaisquer outros dispositivos intermediários com reconhecimento de sessão.

que é só para minha sessão?

Isso significa que ninguém mais pode usar essa conexão

Essa é a intenção das conexões TCP : é uma conexão ponta a ponta destinada apenas a essas duas partes.

Em caso afirmativo - isso significa que o cabeçalho keep alive - reduz o número de usuários de conexão sobreposta?

Defina "conexões sobrepostas". Consulte a conexão persistente HTTP para algumas vantagens e desvantagens, como:

  • Menor uso de CPU e memória (porque menos conexões são abertas simultaneamente).
  • Ativa o pipelining HTTP de solicitações e respostas.
  • Congestionamento de rede reduzido (menos conexões TCP).
  • Latência reduzida em solicitações subsequentes (sem handshaking).

em caso afirmativo, por quanto tempo a conexão é salva para mim? (em outras palavras, se eu definir keep alive- "manter" até quando?)

Uma resposta típica de keep-alive tem esta aparência:

Keep-Alive: timeout=15, max=100

Consulte Cabeçalho Keep-Alive do Protocolo de Transferência de Hipertexto (HTTP), por exemplo (um rascunho para HTTP / 2 em que o cabeçalho keep-alive é explicado com mais detalhes do que 2616 e 2086 ):

  • Um host define o valor do timeoutparâmetro para o tempo que o host permitirá que uma conexão inativa permaneça aberta antes de ser fechada. Uma conexão fica inativa se nenhum dado for enviado ou recebido por um host.

  • O maxparâmetro indica o número máximo de solicitações que um cliente fará ou que um servidor permitirá que sejam feitas na conexão persistente. Depois que o número especificado de solicitações e respostas for enviado, o host que inclui o parâmetro pode fechar a conexão.

No entanto, o servidor está livre para fechar a conexão após um tempo ou número arbitrário de solicitações (desde que retorne a resposta à solicitação atual). A forma como isso é implementado depende do seu servidor HTTP.

CodeCaster
fonte
Defina "conexões sobrepostas" ----> Quero dizer simultaneamente. (e acho que o número de conexões simultâneas será reduzido porque, como você disse: "a conexão X é reservada para John porque usa o cabeçalho keep-alive." ... estou certo?
Royi Namir
1
Então o que você está dizendo é que se o servidor pode lidar com 100 conexões por vez, e todas essas conexões usam keep-alive, então a 101ª conexão será despejada ???
Royi Namir
1
@Royi não, não sei quantas conexões keep-alive um navegador faz para um determinado host e não quis dizer que um navegador só abre uma. A quantidade de solicitações feitas simultaneamente é limitada e varia por navegador . Eu quis dizer que se um navegador usa conexões keep-alive, ele pode, em vez de disparar Nsolicitações sobre Nconexões (como por padrão, a conexão é fechada após cada resposta), por exemplo, disparar Nsolicitações sobre N / Mou mesmo apenas Mconexões, porque pode disparar várias solicitações sobre cada conexão aberta, então pode usar menos.
CodeCaster
1
Eu sei disso. (:-)) você disse em seu comentário: um cliente fará menos conexões simultâneas ao usar o keep-alive, ele disparará as solicitações em série, não em paralelo . Eu simplesmente não entendo como isso se relaciona com o keepalive.
Royi Namir
5
E, C, B não salvam sessões. Esses são roteadores, eles não têm nenhuma tabela de sessão e não precisam, porque vários pacotes de uma mesma sessão cliente-servidor TCP podem seguir caminhos diferentes. A função do roteador é escolher o melhor caminho IP e encaminhar o pacote de acordo, para que ele não suba para a camada de transporte (TCP / UDP), nem vá para a camada de aplicativo para ver o cabeçalho keep-alive. Então, basicamente, o keep-alive é explicitamente entre o cliente e o servidor e, implicitamente, permite que dispositivos com reconhecimento de sessão - por exemplo, firewalls - sejam abertos para essa sessão cliente-para-servidor explícita
Amine Kadimi