Como fazer um tempo limite de soquete TCP

18

Para simulações de catástrofe de rede do nosso ambiente de servidor, estamos procurando uma maneira de intencionalmente tempo limite de um soquete TCP. Existem maneiras simples para os soquetes existentes? Além disso, o pequeno programa de casos-teste C seria uma vantagem.

Já tentamos colocar interfaces de rede durante a leitura do buffer TCP e ler a partir de recursos montados desconectados (samba).

O servidor de teste Out é o Ubuntu 12.04.4.

    
por er453r 11.06.2014 / 20:28

2 respostas

17

Para causar uma conexão existente ao tempo limite, você pode usar iptables . Basta ativar uma regra de DROP na porta que você deseja desativar. Então, para simular um tempo limite para o seu servidor Samaba, enquanto uma conexão ativa estiver ativa, execute o seguinte no servidor:

sudo iptables -A INPUT -p tcp --dport 445 -j DROP

A meta DROP não responderá com um erro RST packet ou ICMP ao remetente do pacote. O cliente deixará de receber pacotes do servidor e, eventualmente, o tempo limite.

Dependendo de se / como você tem iptables configurado, convém inserir a regra mais alta no conjunto de regras INPUT .

    
por 11.06.2014 / 21:53
14

A primeira resposta está correta, mas eu descobri como esses tempos limites funcionam, então você pode observar e testá-los (não se esqueça de bloquear a porta!).

Existem 4 parâmetros de kernel mais interessantes que lidam com tempos limite de TCP:

/proc/sys/net/ipv4/tcp_keepalive_time
/proc/sys/net/ipv4/tcp_keepalive_intvl
/proc/sys/net/ipv4/tcp_keepalive_probes
/proc/sys/net/ipv4/tcp_retries2

Agora existem dois cenários:

  1. O soquete é aberto e tenta transmitir - então (se não houver resposta do outro lado), o sistema tenta novamente tcp_retries2 times. Com o valor padrão de retiradas, leva em torno de 2 minutos e o soquete expira.

  2. O soquete está aberto e inativo - então os limites de keepalive são interessantes. Com um soquete ocioso, o sistema aguardará tcp_keepalive_time segundos e, depois, tente tcp_keepalive_probes times para enviar um TCP KEEPALIVE em intervalos de tcp_keepalive_intvl segundos. E somente depois disso tudo falha, o soquete expira.

por 13.06.2014 / 12:27