Como visualizo os tamanhos da fila de envio e recebimento TCP no Windows?


Respostas:


3

(isto é um pouco de despejo cerebral)

Observando algumas versões da fonte netstat, parece que as informações que você está procurando estão sendo consultadas diretamente do kernel (/ proc / net / ...) e não por meio de chamadas relacionadas a soquetes que possuem equivalentes do Windows. Se você está realmente determinado a ter isso, eu veria como ele está sendo recuperado no netstat e veria o que você pode encontrar que fornece algo equivalente.

Você provavelmente deve consultar ndis.com (Especificação da interface do driver de rede) e PCAUSA.com para obter informações no nível do driver, porque esse é provavelmente o melhor local para recuperar essas informações no Windows.

Eu não acredito que o getsockopt () ou a maior parte da arena do Winsock o levará a algum lugar útil, mas se você quiser ir nessa direção, consulte as informações do MSDN Winsock e também consulte as Perguntas frequentes do programador do Winsock .

Para entrada, você pode conseguir algo útil da função ioctlsocket () com FIONREAD para obter a quantidade de dados legíveis para um soquete; talvez você não consiga obter isso entre os processos e, dependendo do tipo de dados, ele pode retornar informações apenas para o primeiro bloco de dados, não para toda a fila, se houver mais de um item na fila.

Você pode pesquisar um pouco sobre o "backlog" nesse contexto, mas a maior parte do que vi parecia estar relacionada à definição do tamanho máximo para lidar com inundações SYN, e não à ver o tamanho do backlog real.

Se você estiver realmente determinado, poderá fazer algo com seu próprio provedor de serviços em camadas , mas essa é uma estrada estranha e feia, cheia de perigos, e eu sugiro ficar longe dela.

ATUALIZAÇÃO: Depois de bisbilhotar um pouco mais, definitivamente acho que você deve consultar os OIDs NDIS. Encontrar as informações mais relevantes para você é um exercício entre você, o MSDN e o TechNet.


3

Esta pergunta é antiga, mas eu queria adicionar algumas informações. É um resultado de pesquisa bastante alto no Google.

Até onde eu sei, não há uma maneira de fazer isso, mas se alguém puder cavar mais e descobrir uma alternativa válida, isso seria muito apreciado!

Como o @Fencepost apontou em sua resposta, você pode tentar consultar os OIDs NDIS. O NDIS OID mais relevante que encontrei é OID_GEN_TRANSMIT_QUEUE_LENGTH

A maioria dos NDIS OIDs é mapeada para classes WMI, você pode listá-los no PowerShell com

Get-WmiObject -Namespace root\wmi -List  | Where-Object {$_.name -Match "MSNdis" } | Sort-Object

mas parece não haver um para o comprimento da fila de transmissão.

@ Chris J mencionou Interface de Rede \ Comprimento da Fila de Saída. Você pode obter esse valor na linha de comando com typeperf .

typeperf "\Network Interface(*)\Output Queue Length" -sc 1

Mas o valor é sempre 0: http://support.microsoft.com/kb/822226

O Windows monitora essas informações apenas no software do driver da NIC, e são apenas pacotes na fila por NIC e não faz distinção entre o que está na fila por soquete.

Se você quer fazer depuração de rede na linha de comando, todos os contadores que você encontra em perfmon pode ser consultado usando typeperf ou logman .


1

O que você deseja podem ser os resultados das chamadas de função da API WinSock getsockopt:

  • SO_RCVBUF O espaço total do buffer por soquete reservado para recebimento. Isso não está relacionado SO_MAX_MSG_SIZEe não corresponde necessariamente ao tamanho da janela de recebimento do TCP.

  • SO_SNDBUF O espaço total do buffer por soquete reservado para envios. Isso não está relacionado SO_MAX_MSG_SIZEe não corresponde necessariamente ao tamanho de uma janela de envio TCP.

O problema é que podem ser solicitados soquetes cuja alça você conhece. Consultar de fora parece difícil, veja a ferramenta sysinternals TcpView . Mark Russinovich é realmente um crack e até ele não fornece as informações em sua ferramenta. Tenho certeza de que ele teria adicionado uma coluna se tivesse a intenção de obter os valores facilmente ...

Eu acho que algum driver do kernel poderia ajudar a detalhar o sistema, mas não encontrou nenhuma ferramenta disponível. Os tamanhos podem ser definidos em uma base por soquete, para que os valores globais não tenham significado ...


1

A coisa mais próxima que posso encontrar é o contador de desempenho Network Interface\Output Queue Length. Porém, isso não é por conexão - apenas por interface e abrange apenas a fila de saída (obviamente, pelo nome).


1

Agora, os tamanhos das janelas são diferentes por soquete! As configurações por interface representam apenas os valores padrão.

Não conheço nenhuma maneira de visualizar o tamanho da janela de cada soquete. No Solaris, isso pode ser visto com "netstat".


0

1
especificamente, o que eu deveria estar olhando lá?

O Windows usa vários algoritmos para definir o tamanho da janela de recebimento TCP; você pode substituir o padrão definindo uma chave do Registro. Este programa também pode ajudá-lo: dslreports.com/drtcp .
Massimo

Massimo - você está confundindo o tamanho da janela com os dados na fila. Não estou interessado nos tamanhos das janelas.

Ok desculpe. Esta informação não está disponível no Windows, de qualquer maneira.
Massimo
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.