Descarte pacotes TCP e evite a retransmissão TCP

1

Eu tenho um aplicativo que envia dados TCP para um servidor. Meu servidor é feito para descartar intencionalmente os pacotes enviados pelo aplicativo e, como resultado, o cliente retransmite os pacotes. Preciso evitar que o cliente os retransmita. Existe alguma configuração que eu possa fazer no cliente para evitar retransmissões. Talvez algumas regras do iptables? Ou com algumas variáveis net.ipv4.tcp ?

Eu entendo que o TCP inerentemente tem que retransmitir pacotes, mas eu realmente preciso testar uma funcionalidade no meu servidor, onde eu tenho que observar como o servidor se comporta quando ele descarta um pacote TCP e ele não é retransmitido. Então eu não posso usar o UDP aqui.

O cliente é capaz de completar o handshake TCP, e somente os pacotes enviados depois disso são descartados, para os quais a retransmissão está acontecendo. Esta é a retransmissão que eu preciso evitar.

Estou usando o Fedora:

[root@test sipp.svn]# uname -r
2.6.23.1-42.fc8
[root@test sipp.svn]# 
    
por Rishabh 05.09.2014 / 10:46

2 respostas

2

Do seu comentário (o que seria melhor fazer parte da sua pergunta):

I understand that TCP inherently has to retransmit packets, but I actually need to test out a functionality on my server, where I have to observe how the server behaves when it drops a TCP packet and it does not get retransmitted. So I cannot use UDP here.

Pelo que entendi, você não precisa realmente se importar com o que o cliente envia, só é importante que os pacotes reenviados não cheguem ao servidor. Então, por que você não coloca esses pacotes no lado do servidor da mesma maneira que você soltou o pacote inicial? Eu não sei como você descartou isso, mas com o iptables ele provavelmente deveria ser o suficiente para bloquear qualquer pacote TCP sem o SYN / FIN do cliente.

Se você precisar fazer com que o cliente não se importe, você precisará falsificar os ACKs do servidor. Você pode fazer essas coisas com scapy ou ferramentas similares.

    
por 05.09.2014 / 11:21
1

Removendo meu comentário e postando uma resposta .

O TCP foi projetado para confiabilidade e transmissões verificadas por erros. Por essa razão, é de sua própria natureza reenviar pacotes que não foram ACK reconhecidos pelo outro lado da conexão. Se você não quiser que esse mecanismo seja aplicado, provavelmente deve usar apenas outro protocolo, como o UDP.

No entanto, se você estiver preso ao TCP, talvez queira usar um aplicativo proxy. Em vez de receber os pacotes TCP diretamente no seu aplicativo no lado do servidor, eles são recebidos por outro aplicativo, um proxy , que decidirá se os pacotes serão ou não transmitidos para o "real" aplicação por trás. Basicamente:

  • O cliente envia seus pacotes TCP.
  • Um aplicativo proxy no lado do servidor os recebe na porta A.
  • Seu aplicativo de servidor real atende na porta B.
  • O aplicativo proxy decide se transmite ou não um pacote de A para B.

Como o proxy sempre reconhece os pacotes, eles nunca são retransmitidos (exceto se eles realmente falharem para chegar lá, é claro). Com isso em mente, cabe a você usar / projetar um aplicativo de proxy que aplique as regras de filtragem adequadas. Aqui está um link para uma questão relacionada Eu perguntei no Security Stack Exchange.

    
por 05.09.2014 / 11:11