O TCP RWIN é definido por aplicativo ou sistema operacional?

2

Eu tenho uma situação em que um aplicativo está escutando em uma porta TCP e de vez em quando, como visto em tcp dumps, obtém seu Receiving Window (RWIN) definido como zero. Quando isso acontece, seu Recv-Q pára de se mover (porque o remetente pára de enviar) e o encadeamento do aplicativo escutando na conexão / porta simplesmente trava. No WireShark, vejo os estados "ZeroWindow" sendo produzidos, o que acontece quando o RWIN é definido como 0 (uma janela de tamanho 0).

Estou tentando determinar se meu aplicativo, que usa muitas bibliotecas de código-fonte aberto com código misterioso, está definindo manualmente o RWIN = 0 da conexão, ou se isso está acontecendo na camada do sistema operacional. Se for o aplicativo, eu tenho acesso a todo o código-fonte e com algum trabalho duro pode depurar corretamente.

Mas se for o sistema operacional que diz " hey, há algo errado com essa conexão, definindo RWIN como 0 ... ", então não tenho a menor idéia de como diagnosticar . Alguma ideia? Obrigado antecipadamente!

    
por Mara 18.04.2013 / 14:52

2 respostas

1

A janela de recebimento é calculada / definida pelo sistema operacional. O Linux pode alterar a memória disponível para receber pacotes TCP com a configuração net.core.rmem_max sysctl.

Existem muitas páginas para ajuste de desempenho do TCP, por exemplo, este:

link

Infelizmente, isso provavelmente não o ajudará, pois aumenta a quantidade de dados armazenados em buffer.

Se o buffer estiver cheio, o tamanho da janela será definido como 0. Você deve examinar seu aplicativo para saber por que ele não coleta os dados do buffer TCP. Arquivos de log, inicie-o no modo de depuração, etc. Não há muito o que você pode fazer no nível do SO para isso.

    
por 18.04.2013 / 15:06
0

Isso realmente depende. Você não especificou de qual sistema operacional você está falando, mas, no Windows (e eu suponho, Linux também), o tamanho da janela TCP é normalmente manipulado pela pilha TCP.

No entanto, é perfeitamente possível que algum componente não-SO também afete isso. Por exemplo: - Um aplicativo pode influenciar o comportamento da pilha TCP, especificando um tamanho de buffer não padrão para o soquete (SO_RCVBUF). - Um aplicativo poderia estar usando soquetes brutos e reimplementar o TCP no modo de usuário (não tenho certeza porque você gostaria de fazer isso, mas é possível).

Por fim, você deve saber que obter um tamanho de 0 na verdade é uma condição normal: indica que uma parte já tem um buffer de dados completo e precisa de mais tempo para processá-lo.

    
por 18.04.2013 / 15:07