tcp retransmite via curl e netcat

1

Estou tentando configurar o iptables para causar falhas de rede realistas entre os contêineres do Docker. No servidor, eu corro ambos netcat -lk 1234 e um servidor de cowboy Erlang. No cliente, executo clientes:

  • echo blah | netcat myserver 1234
  • curl myserver/xyz

Inicialmente, estes funcionam ok, há evidências de comunicações cliente-servidor. Em seguida, introduzo a regra DROP do iptables na saída do cliente.

  • iptables -A OUTPUT -j DROP
  • echo blah | netcat myserver 1234
  • curl myserver/xyz

Ambas as comunicações netcat e curl não passam, até eu removo a regra DROP, no ponto em que elas se recuperam perfeitamente!

Finalmente eu repito o acima, mas antes de remover a regra DROP, eu ctrl-c os executáveis do cliente. Ao remover a regra DROP, não observo nenhuma evidência de que o servidor esteja recebendo solicitações do cliente.

Minha conclusão é que o cliente netat / curl deve estar tentando retransmitir indefinidamente? Eu não deveria, eventualmente, esperar um fracasso? Btw, a mesma coisa acontece quando com outros clientes, por exemplo. Erlang http / websocket_client.

    
por darnok 02.11.2015 / 13:11

1 resposta

0

Sim, o TCP tenta estabelecer uma conexão confiável em uma rede não confiável, por isso é tolerante a algum grau de perda de pacotes. O remetente continuaria tentando enviar seus dados até receber um ACK do receptor ou até expirar e decidir que a conexão foi perdida.

De acordo com esta postagem , no Linux o tempo limite padrão ao enviar dados é de pouco mais de 2 minutos.

(Se nenhum ponto de extremidade estiver enviando dados, eles podem não descobrir que a conexão está totalmente interrompida, a menos que estejam configurados para enviar mensagens keepalive de TCP. No entanto, as mensagens TCP keepalive são enviadas após 2 horas de inatividade por padrão). / p>     

por 02.11.2015 / 16:28

Tags