
Tenho dois servidores e usei meu próprio sistema embarcado com LwIP para fazer conexão com esses servidores.
Meu sistema embarcado com LwIP é o cliente e tenho server1 e server2. Conectei-me ao servidor1 e finalizei a conexão antes de conectar ao servidor2.
Análise adicional do fluxo:
- Cliente cria novo soquete com server1
- Cliente enviou pacote DNS para obter o endereço IP do servidor1; recebeu ACK do AP
- Cliente envia pacote TCP SYN;
- Server1 envia TCP SYN-ACK e realiza alguma transmissão de dados
- O cliente encerra a conexão com o servidor1 enviando o pacote TCP RST; e feche o soquete
- Cliente cria novo soquete com server2
- Cliente enviou pacote DNS para obter o endereço IP do servidor2; recebeu ACK do AP
- Cliente envia pacote TCP SYN para server2
- Server2 envia TCP SYN-ACK e realiza alguma transmissão de dados
- O cliente encerra a conexão com o servidor2 enviando o pacote TCP RST; e feche o soquete
No entanto, às vezes o server2 não responde ao pacote SYN do cliente que está na Etapa 9. Isso só acontece em algum momento. Eu verifiquei vários fóruns como:
[1]Por que um servidor não enviaria um pacote SYN/ACK em resposta a um pacote SYN?
[2]Servidor não envia um pacote SYN/ACK em resposta a um pacote SYN
Meu código não permite o dimensionamento de janelas. Não consigo verificar se o servidor é privado, por isso não tenho certeza se ele foi descartado. Meu ambiente é bastante barulhento e ocupado com muitos roteadores e dispositivos de comunicação. Este problema só acontece em ambientes barulhentos, mas não em ambientes mais limpos.
O que posso fazer como cliente para resolver esse problema?
Responder1
Algumas idéias sobre por que às vezes seu servidor não responde com SYN-ACK:
- O aplicativo no servidor é interrompido quando o pacote SYN é enviado: Isso pode travar e depois conseguir funcionar novamente com um mecanismo de reinicialização automática do programa. Quando o aplicativo do servidor é interrompido ou travado, o soquete de escuta tcp é fechado, então o sistema operacional não responde.
- Seu servidor tem alguns problemas para encontrar seu cliente de volta. Pode haver algum problema de roteamento ou roteamento assimétrico (isso quebra o firewall).
- Se o cliente e o servidor estiverem na mesma rede, isso pode ser algum problema da camada 2, como protocolo Spanning Tree ou ARP.
- Perda de pacotes na rede: seu pacote SYN ou SYN ACK foi descartado.
- O servidor está sobrecarregado e às vezes não consegue responder ao pacote SYN.
Pode haver um grande número de coisas que podem fazer com que o servidor não responda ao pacote SYN.
O que eu farei :
- Fazendo algum tcpdump no servidor para verificar a rede: O servidor recebe o pacote SYN ou há algum problema na rede antecipadamente? O servidor gera e envia um pacote SYN ACK? E trabalhe a partir daí.
- Se você não tiver acesso ao servidor, faça a mesma coisa no roteador/firewall mais próximo.
- Entre em contato com alguém que tenha acesso ao servidor.