Implementando fragmentação de IP

1

Estou trabalhando em um aplicativo que gera geração de tráfego de rede. O aplicativo tem eth1 no modo promíscuo. Por isso, lida diretamente com todo o tráfego de entrada e saída.

Um dos recursos que estou implementando é a fragmentação e a desfragmentação de IP. Os fragmentos de entrada precisam ser remontados e os pacotes de saída precisam ser fragmentados se seus tamanhos excederem o MTU de 1500 bytes.

Uma maneira simples de testar meu aplicativo é enviar um comando ping para o endereço IP de eth1 :

ping -c1 -s 20000 10.3.2.1

Isso está funcionando bem.

No entanto, quando o tamanho do pacote excede ~ 53000 bytes, ele falha. De acordo com o Wireshark eu recebo fragmentos até o fragmento compensar ~ 51000 e depois nada, seguido por um tempo limite de remontagem.

O tamanho máximo de um pacote IP é de 65535 bytes. O comando ping permite especificar um tamanho até 65507. Isso realmente funciona se eu fizer ping para eth0 (controlado pelo OS).

Ao inspecionar o aplicativo a partir do interior com o GDB, tudo está indo bem. Percorrendo o código revela que os fragmentos entram no meu aplicativo, o pacote IP é remontado com sucesso e, em seguida, fragmentado novamente, e os fragmentos são enviados de volta ao remetente. Mesmo para o último fragmento, o valor de retorno de send(...) (API de soquete) é igual ao tamanho do fragmento, indicando sucesso.

Alguém tem ideia do que poderia estar errado?

O sistema operacional é o Linux (baseado no RTLinux).

    
por StackedCrooked 26.08.2010 / 15:19

3 respostas

2

Se os pacotes estão fragmentados corretamente, então remontados no lado do cliente, mas o contrário não funciona,

A -----> B
         |
A <--x-- B

Eu sugeriria primeiro tentar inverter os papéis (já que o problema está no caminho de volta) e verificar se, desta vez, os pacotes / remontagens fragmentados podem ser realizados por A

A <----- B
|
?

Se não, há um problema no gerenciamento de pacotes de B para A, pode ser uma limitação de firewall ou qualquer roteador ou switch que você possa ter entre.

    
por 26.08.2010 / 15:52
0
The maximum TCP segment you can have is 65,495 bytes. 

Se você se preocupa com os cabeçalhos ... pode ser o limite que você está procurando: >

Além disso, você tem uma janela constante para o TCP ou está se adaptando? Talvez uma janela menor seja usada e você não possa enviar mais dados

    
por 26.08.2010 / 15:31
0

Resolvido

O problema foi a perda de pacotes. A resposta IP foi enviada para um switch em uma linha gigabit. Esse switch, por sua vez, encaminhou as mensagens por uma linha de 100 MBit. Isso significa que os pacotes chegaram a uma velocidade maior do que a que deixaram, fazendo com que o uso da memória dentro do switch aumentasse rapidamente. Uma vez que toda a memória foi usada, o switch não teve outra opção senão começar a descartar pacotes.

    
por 27.08.2010 / 11:10