Relação entre o estado tcp TIME_WAIT e HTTP keep-alive

3

Qual é a relação entre o keep-alive em um pedido HTTP e um soquete tcp em TIME_WAIT - eles devem ser correlacionados?

Além disso, as configurações do sistema e do servidor da Web devem estar alinhadas, %código%? De acordo com Como reduzir o número de sockets em TIME_WAIT? no Linux o estado TIME_WAIT é codificado em 60 segundos (pelo menos para os valores do Ubuntu / Debain do Linux).

No lighttpd, o valor padrão server.max-keep-alive-idle = 60 e eles recomendam ainda mais baixo para alta carga. Parece um desperdício fechar um pedido http após 5 segundos se o soquete tcp estiver disponível - assumindo, é claro, que a configuração server.max-keep-alive-idle = 5 faz o que diz na lata.

Esta questão relacionada - Como o tcp mantém uma conexão ativa? [closed] toca no problema, mas não responde totalmente por mim.

    
por aland 24.10.2014 / 22:21

1 resposta

4

TCP é a camada 4, camada HTTP 7.

No HTTP 1.0, o HTTP Keep-Alive é usado na camada 7 para simular conexões persistentes usando Connection header.

No HTTP 1.1, as conexões são assumidas como persistentes por padrão e, em seguida, dependem do TCP apenas para executar esse trabalho. As solicitações podem ser pipeleadas na mesma conexão TCP e, em seguida, um lado definirá Connection: close nos últimos cabeçalhos de solicitação ou resposta, portanto, os dois lados sabem que nenhuma solicitação HTTP pode ser trocada e a conexão será fechada.

Normalmente, no caso de um servidor web, o estado TIME_WAIT será o estado após o qual, uma vez decidido fechar a conexão ativamente, ele recebeu o pacote FIN do cliente e está enviando o último ACK de volta quatro vias de ruptura. Depois disso, ele aguarda 2 * MSL : é uma maneira de ter certeza de que a conexão está fechada. É daí que vem o 60s compilado no kernel. Desta forma, temos a certeza de que não receberemos em uma nova conexão, usando os mesmos pacotes de 4 tuplas fora de seqüência decorrentes da conexão anterior.

Você não quer alterá-lo .

No outro lado, server.max-keep-alive-idle é o tempo limite após o qual uma conexão ESTABLISHED será considerada inativa se nenhuma solicitação HTTP entrar e será ativamente fechada pelo servidor web. Quando essa decisão for tomada, como você entende agora, a desmontagem do TCP ocorrerá.

Tenha muito cuidado com tcp_tw_recycle , se seus visitantes vierem de trás de uma ampla rede NAT, isso poderá levar a várias conexões TCP com a mesma 4 tupla ocorrendo com timestamps fora de ordem, resultando na queda silenciosa das tentativas de conexão do cliente no lado do servidor.

Portanto, a melhor opção é ajustar o parâmetro que você viu no lighttpd. Em todo o sistema, você pode reduzir com segurança FIN_WAIT2 state e aumentar os buckets para soquetes em TIME_WAIT state com net.ipv4.tcp_fin_timeout e net.ipv4.tcp_max_tw_buckets .

    
por 25.10.2014 / 00:48