Revise o estabelecimento e a desconexão da conexão TCP / IP e as causas comuns de um grande número de estados TIME_WAIT e CLOSE_WAIT

Processo de estabelecimento e desconexão da conexão:

 

FECHADO : Indica o estado inicial.
LISTEN : Este também é um estado muito fácil de entender, pois significa que um SOCKET no lado do servidor está no estado de escuta e pode aceitar conexões.
SYN_RCVD : este estado indica que uma mensagem SYN foi recebida. Em circunstâncias normais, este estado é um estado intermediário durante a sessão de handshake de três vias do SOCKET no lado do servidor ao estabelecer uma conexão TCP. É muito curto. Basicamente, você dificilmente pode vê-lo com netstat Neste estado, a menos que você escreva deliberadamente um programa de teste do cliente, deliberadamente não envie a última mensagem ACK no processo de handshake TCP de três vias. Portanto, neste estado, após receber a mensagem ACK do cliente, ele entrará no estado ESTABLISHED.
SYN_SENT : este estado ecoa a telepresença SYN_RCVD. Quando o cliente SOCKET executa uma conexão CONNECT, ele primeiro envia uma mensagem SYN, então entrará imediatamente no estado SYN_SENT e esperará que o servidor envie a segunda mensagem no handshake triplo . O estado SYN_SENT indica que o cliente enviou uma mensagem SYN.
ESTABELECIDO : É fácil de entender, indicando que a conexão foi estabelecida.
FIN_WAIT_1 : Este estado precisa ser explicado. Na verdade, o verdadeiro significado dos estados FIN_WAIT_1 e FIN_WAIT_2 é aguardar a mensagem FIN da outra parte. A diferença entre esses dois estados é: o estado FIN_WAIT_1 na verdade significa que quando o SOCKET está no estado ESTABLISHED, ele deseja encerrar ativamente a conexão e envia uma mensagem FIN para a outra parte. Nesse momento, o SOCKET entra no estado FIN_WAIT_1 . Quando a outra parte responde à mensagem ACK, ela entra no estado FIN_WAIT_2. Claro, em circunstâncias normais reais, não importa a situação da outra parte, ela deve responder imediatamente à mensagem ACK, então o estado FIN_WAIT_1 é geralmente mais difícil de ver. O status FIN_WAIT_2 pode ser visto freqüentemente com netstat às vezes.
FIN_WAIT_2 : Este estado foi explicado em detalhes acima. Na verdade, o SOCKET no estado FIN_WAIT_2 significa semi-conectado, ou seja, uma parte solicita o fechamento da conexão, mas também informa à outra parte que ainda tenho alguns dados para enviar para você por enquanto. Feche a conexão.
TIME_WAIT : Indica que a mensagem FIN da outra parte foi recebida e uma mensagem ACK foi enviada.Após 2MSL, você pode retornar ao estado disponível FECHADO. Se estiver no estado FIN_WAIT_1, ao receber uma mensagem com o sinalizador FIN e o sinalizador ACK ao mesmo tempo, você pode entrar diretamente no estado TIME_WAIT sem passar pelo estado FIN_WAIT_2.
ENCERRAMENTO : Este estado é muito especial, deveria ser raro em situações reais e pertence a um estado excepcional relativamente raro. Em circunstâncias normais, quando você envia uma mensagem FIN, é lógico que você deve receber (ou ao mesmo tempo) a mensagem ACK da outra parte primeiro e, em seguida, receber a mensagem FIN da outra parte. Mas o estado CLOSING significa que depois de enviar a mensagem FIN, você não recebeu a mensagem ACK da outra parte, mas em vez disso recebeu a mensagem FIN da outra parte. Em que circunstâncias isso acontecerá? Na verdade, se você pensar bem, não é difícil concluir: se ambas as partes fecharem um SOCKET quase ao mesmo tempo, então haverá uma situação em que ambas as partes enviarão mensagens FIN ao mesmo tempo, ou seja, o O estado CLOSING aparecerá, indicando que ambas as partes estão fechando a conexão SOCKET.
CLOSE_WAIT : O significado deste estado está realmente esperando para ser fechado. Como entender isso? Quando a outra parte fecha um SOCKET e envia uma mensagem FIN para si mesma, seu sistema sem dúvida responderá com uma mensagem ACK para a outra parte e entrará no estado CLOSE_WAIT neste momento. Em seguida, o que você realmente precisa considerar é se você ainda tem dados para enviar para a outra parte. Caso contrário, você pode fechar o SOQUETE e enviar uma mensagem FIN para a outra parte, ou seja, feche a conexão. Portanto, no estado CLOSE_WAIT, o que precisa ser feito é aguardar que você feche a conexão.
LAST_ACK: Este estado é relativamente fácil de entender.É que após a parte fechada passivamente enviar uma mensagem FIN, ela finalmente espera pela mensagem ACK da outra parte. Depois de receber a mensagem ACK, você pode entrar no estado disponível FECHADO

 

O número de conexões está relacionado ao identificador do sistema de arquivos

Ver com ulimt -n

Você pode modificar /etc/security/limit.conf

Defina o número de nofiles para um usuário

 

Em alguns sistemas de alta simultaneidade, geralmente há um grande número de estados TIME_WAIT e CLOSE_WAIT. O seguinte enfoca a otimização desses dois estados.

TEMPO DE ESPERA:

Um grande número desse estado geralmente indica que a simultaneidade do sistema é relativamente alta e um grande número de conexões são estabelecidas e liberadas.Você pode usar conexões longas ou recuperação rápida de conexões curtas.

/etc/sysctl.conf

net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_tw_recycle = 1
net.ipv4.tcp_fin_timeout = 30

Em seguida, execute para    /sbin/sysctl -p  que os parâmetros tenham efeito.

net.ipv4.tcp_syncookies = 1   significa habilitar Cookies SYN. Quando a fila de espera SYN transborda, os cookies são habilitados para processamento, o que pode evitar uma pequena quantidade de ataques SYN.O padrão é 0, o que significa que está fechado;

net.ipv4.tcp_tw_reuse = 1   significa habilitar a reutilização. Permitir que os soquetes TIME-WAIT sejam reutilizados para novas conexões TCP, o padrão é 0, o que significa que está fechado;

net.ipv4.tcp_tw_recycle = 1   significa ligar a reciclagem rápida de sockets TIME-WAIT na conexão TCP, o padrão é 0, que significa fechar.

net.ipv4.tcp_fin_timeout   modificar o tempo TIMEOUT padrão do sistema

 

CLOSE_WAIT:

O programa do servidor está no estado CLOSE_WAIT em vez do estado LAST_ACK, indicando que o FIN não foi enviado ao cliente, então pode haver muitos dados a serem enviados ou outras coisas a serem feitas antes que a conexão seja encerrada, resultando em o pacote FIN não está sendo enviado.

Mas o soquete do cliente foi desconectado.
De um modo geral, um CLOSE_WAIT dura pelo menos 2 horas. Se um rogue escreveu um programa especialmente para causar muitos CLOSE_WAIT e consumir
seus recursos, então normalmente o sistema terá resolvido a falha antes do momento do lançamento.
Esse tempo só pode ser reduzido modificando os parâmetros TCP / IP: modificar a série de parâmetros tcp_keepalive_ * pode ajudar a resolver esse problema.

Acho que você gosta

Origin blog.csdn.net/yyws2039725/article/details/113826698
Recomendado
Clasificación