¿Cómo veo los tamaños de la cola de envío y recepción TCP en Windows?

10

Linux netstat muestra los tamaños de cola de envío y recepción.

¿Cómo obtengo esta información en Windows, específicamente Server 2003?

Izzy
fuente
¿Puedes pegar un ejemplo de la salida que te gustaría ver?
Izzy
Mira este enlace. Necesito las columnas Recv-Q y Send-Q de netstat. linux-ip.net/html/tools-netstat.html

Respuestas:

3

(Esto es un poco un tugurio cerebral)

Al mirar un par de versiones de la fuente netstat, parece que la información que está buscando se consulta directamente desde el núcleo (/ proc / net / ...) no a través de llamadas relacionadas con sockets que tienen equivalentes de Windows. Si realmente está decidido a tener esto, miraría cómo se está recuperando en netstat y veré qué puede encontrar que proporcione algo equivalente.

Probablemente debería buscar en ndis.com (Especificación de interfaz de controlador de red) y PCAUSA.com para obtener información a nivel de controlador, porque es probable que sea el mejor lugar para recuperar esta información en Windows.

No creo que getsockopt () o la mayor parte de la arena de Winsock vaya a llevarte a algún lugar útil, pero si quieres ir en esa dirección, mira la información de MSDN Winsock y también consulta las preguntas frecuentes del programador de Winsock .

Para la entrada, es posible que pueda obtener algo útil de la función ioctlsocket () con FIONREAD para obtener la cantidad de datos legibles para un socket; es posible que no pueda transmitir esto a través de los procesos y, dependiendo del tipo de datos, solo puede devolver información para el primer bloque de datos, no para toda la cola si hay más de un elemento en cola.

Podría investigar un poco sobre la "acumulación" en este contexto, pero la mayor parte de lo que vi parecía estar relacionado con la configuración del tamaño máximo para lidiar con las inundaciones SYN, no realmente para ver qué tan grande era la acumulación real.

Si está realmente decidido, es posible que pueda hacer algo con su propio proveedor de servicios en capas , pero ese es un camino extraño y feo lleno de peligros y voy a sugerirle que se mantenga alejado de él.

ACTUALIZACIÓN: Después de hurgar un poco más, definitivamente creo que debería consultar consultas OID NDIS. Encontrar la información más relevante para usted se deja como un ejercicio entre usted, MSDN y TechNet.

poste de la cerca
fuente
3

Esta pregunta es antigua pero quería agregar alguna información. Es un resultado de búsqueda bastante alto en Google.

Por lo que puedo decir, no hay una manera de hacer esto, pero si alguien puede investigar más y encontrar una alternativa válida, ¡sería muy apreciado!

Como @Fencepost señaló en su respuesta, puede intentar consultar los OID de NDIS. El OID NDIS más relevante que encontré es OID_GEN_TRANSMIT_QUEUE_LENGTH

La mayoría de los OID NDIS están asignados a clases WMI, puede enumerarlos en powershell con

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

pero no parece haber uno para la longitud de la cola de transmisión.

@ Chris J mencionó la interfaz de red \ longitud de la cola de salida. Puede obtener este valor en la línea de comando con typeperf .

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

Pero el valor siempre es 0: http://support.microsoft.com/kb/822226

Windows solo realiza un seguimiento de esta información en el software del controlador NIC, y solo se trata de paquetes en cola por NIC, y no distingue entre lo que está en cola por socket.

Si desea realizar la depuración de la red en la línea de comandos, cualquier contador que encuentre en perfmon puede consultarse utilizando typeperf o logman .

hmatt1
fuente
1

Lo que desea pueden ser los resultados de las llamadas a la función WinSock API getsockopt:

  • SO_RCVBUF El espacio total de búfer por socket reservado para recibir. Esto no está relacionado SO_MAX_MSG_SIZEy no corresponde necesariamente con el tamaño de la ventana de recepción TCP.

  • SO_SNDBUF El espacio total de almacenamiento intermedio por socket reservado para envíos. Esto no está relacionado SO_MAX_MSG_SIZEy no corresponde necesariamente al tamaño de una ventana de envío TCP.

El problema es que se le pueden pedir enchufes cuyo manejo conozca. Consultar desde el exterior parece ser difícil, eche un vistazo a la herramienta sysinternals TcpView . Mark Russinovich es realmente un crack e incluso él no proporciona la información en su herramienta. Estoy bastante seguro de que habría agregado una columna si tuviera un medio para obtener los valores fácilmente ...

Supongo que algún controlador de kernel podría ayudar a profundizar en el sistema, pero no encontró ninguna herramienta disponible. Los tamaños se pueden establecer en una base por socket para que los valores globales no tengan significado ...

jdehaan
fuente
1

Lo más cercano que puedo encontrar es el contador de rendimiento Network Interface\Output Queue Length. Sin embargo, esto no es por conexión, solo por interfaz y solo cubre la cola de salida (obviamente, por su nombre).

Chris J
fuente
1

¡Ahora, los tamaños de las ventanas son diferentes por zócalo! La configuración por interfaz solo representa los valores predeterminados.

No conozco ninguna forma de ver el tamaño de la ventana de cada socket. En Solaris, esto se puede ver con "netstat".

asd
fuente
0

Eche un vistazo aquí: http://support.microsoft.com/kb/224829 .

Massimo
fuente
1
específicamente, ¿qué se supone que debo mirar allí?
Windows usa varios algoritmos para establecer el tamaño de la ventana de recepción TCP; puede anular el valor predeterminado configurando una clave de Registro. Este programa también puede ayudarlo: dslreports.com/drtcp .
Massimo
Massimo: está confundiendo los tamaños de las ventanas con los datos en cola. No me interesan los tamaños de las ventanas.
OK lo siento. Esta información no está disponible en Windows, de todos modos.
Massimo