Mensagens TCP Mescladas?

3

Eu tenho um aplicativo que envia 100 mensagens TCP de 186 bytes (excluindo cabeçalhos) de volta para trás sem intervalo do host A para o host B.

Eu executei o tcpdump para capturar os pacotes no host A (onde o remetente é), e notei que depois de algumas mensagens (como 9), as próximas ~ 25 mensagens foram mescladas em uma mensagem 5 + K.

Eu já desativei o algoritmo de Nagle através de setsockopt () no aplicativo emissor, e as janelas TCP calculadas são mais de 14K byte o tempo todo. Portanto, não parece que as 9 primeiras mensagens preencheram o host B e o host B pediu ao host A para diminuir a velocidade.

Alguma dica sobre como descobrir por que as mensagens TCP foram mescladas?

Obrigado!

    
por Hei 26.12.2015 / 11:55

2 respostas

3

I have an application that sends 100 of 186-byte (excluding headers) TCP messages back to back without gap from host A to host B.

Em seguida, você pode enviá-los mais rápido do que a rede pode transportá-los; nesse caso, quando a implementação TCP no remetente estiver pronta para enviar um pacote na rede, poderá haver várias mensagens enfileiradas, nas quais caso ele envie o máximo que puder em um único segmento TCP. O protocolo TCP oferece um serviço de fluxo de bytes, com a noção no de limites de mensagens, portanto, é permitido fazer isso.

I have already turned on Nagle's algorithm

O algoritmo de Nagle explicitamente faz o que você está dizendo que o TCP no remetente está fazendo :

Nagle's algorithm works by combining a number of small outgoing messages, and sending them all at once.

então transformá-lo em não impedirá isso. Desligá-lo pode, em alguns casos, impedir isso, mas, como seu aplicativo envia uma série de mensagens, ele provavelmente não o impedirá.

(por exemplo, a resposta para "por que o TCP no remetente mescla as mensagens?" é "porque pode").

    
por 26.12.2015 / 21:03
1

O que você está vendo é mais provável devido à transferência da funcionalidade da pilha de rede do kernel para a interface de rede e / ou driver.

A interface de rede ainda estará recebendo os pacotes individuais da rede. Mas antes que os pacotes sejam entregues ao kernel, eles são mesclados pela interface ou pelo driver.

Você pode ver as configurações atuais de todos os recursos de descarregamento usando este comando:

ethtool -k eth0

Se você quiser desativar esse recurso específico, isso pode ser feito com este comando:

ethtool -K eth0 generic-receive-offload off

Você pode ler mais sobre o descarregamento em esta pergunta mais antiga .

    
por 26.12.2015 / 12:13