Come posso visualizzare le dimensioni della coda di invio e ricezione TCP su Windows?


10

Linux netstat mostra le dimensioni della coda di invio e ricezione.

Come posso ottenere queste informazioni su Windows, in particolare Server 2003?


Riesci a incollare un esempio dell'output che vorresti vedere?
Izzy,

Dai un'occhiata a questo link. Ho bisogno delle colonne Recv-Q e Send-Q di netstat. linux-ip.net/html/tools-netstat.html

Risposte:


3

(questo è un po 'una scarica di cervello)

Osservando un paio di versioni del sorgente netstat, sembra che le informazioni che stai cercando vengano interrogate direttamente dal kernel (/ proc / net / ...) non tramite chiamate relative al socket che hanno equivalenti di Windows. Se sei davvero determinato ad avere questo, guarderei come viene recuperato in netstat e vedo cosa puoi trovare che fornisce qualcosa di equivalente.

Probabilmente dovresti guardare ndis.com (Network Interface Interface Specification) e PCAUSA.com per informazioni a livello di driver, perché è probabilmente il posto migliore dove recuperare queste informazioni su Windows.

Non credo che getsockopt () o la maggior parte dell'arena di Winsock ti porterà ovunque utile, ma se vuoi andare in quella direzione guarda le informazioni di WDN su MSDN e controlla anche le FAQ di Winsock Programmer .

Per inbound, potresti essere in grado di ottenere qualcosa di utile dalla funzione ioctlsocket () con FIONREAD per ottenere la quantità di dati leggibili per un socket; potresti non essere in grado di ottenere questo attraverso i processi e, a seconda del tipo di dati, potrebbe restituire informazioni per il primo blocco di dati e non per l'intera coda se è presente più di un elemento in coda.

In questo contesto potresti fare qualche ricerca sul "backlog", ma la maggior parte di ciò che ho visto sembra riguardare l'impostazione della dimensione massima per gestire le inondazioni di SYN, non con la reale entità del backlog effettivo.

Se sei davvero determinato, potresti essere in grado di fare qualcosa con il tuo Layered Service Provider , ma questa è una strada strana e brutta piena di pericoli e suggerirò di starne alla larga.

AGGIORNAMENTO: Dopo aver cercato un po 'di più, penso sicuramente che dovresti cercare di interrogare gli OID NDIS. Trovare le informazioni più rilevanti per te è lasciato come un esercizio tra te, MSDN e TechNet.


3

Questa domanda è vecchia ma volevo aggiungere alcune informazioni. È un risultato di ricerca abbastanza alto su Google.

Per quanto ne so non c'è un modo per farlo, ma se qualcuno può fare di più scavando e capire una valida alternativa che sarebbe molto apprezzata!

Come ha sottolineato @Fencepost nella sua risposta, puoi provare a interrogare gli OID NDIS. L'OID NDIS più pertinente che ho trovato è OID_GEN_TRANSMIT_QUEUE_LENGTH

La maggior parte degli OID NDIS sono associati a classi WMI, con cui è possibile elencarli in PowerShell

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

ma non sembra essercene uno per Lunghezza coda di trasmissione.

@Chris J ha menzionato Interfaccia di rete \ Lunghezza coda di emissione. È possibile ottenere questo valore dalla riga di comando con typeperf .

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

Ma il valore è sempre 0: http://support.microsoft.com/kb/822226

Windows tiene traccia di queste informazioni solo nel software del driver NIC, ed è solo pacchetti in coda per NIC e non distingue tra ciò che è in coda per socket.

Se si desidera eseguire il debug della rete sulla riga di comando, è possibile eseguire query su qualsiasi contatore trovato in perfmon utilizzando typeperf o logman .


1

Quello che vuoi potrebbero essere i risultati delle chiamate alla funzione API WinSock getsockopt:

  • SO_RCVBUF Lo spazio buffer totale per socket riservato per riceve. Ciò non è correlato SO_MAX_MSG_SIZEe non corrisponde necessariamente alla dimensione della finestra di ricezione TCP.

  • SO_SNDBUF Lo spazio totale per buffer del socket riservato per gli invii. Questo non è correlato SO_MAX_MSG_SIZEe non corrisponde necessariamente alla dimensione di una finestra di invio TCP.

Il problema è che possono essere richiesti socket di cui conosci la maniglia. Interrogare dall'esterno sembra essere difficile, dai un'occhiata allo strumento TcpView sysinternals . Mark Russinovich è davvero una crepa e anche lui non fornisce le informazioni nel suo strumento. Sono abbastanza sicuro che avrebbe aggiunto una colonna se avesse avuto un mezzo per ottenere facilmente i valori ...

Immagino che alcuni driver del kernel potrebbero aiutare a scavare nel sistema ma non hanno trovato nessuno strumento disponibile. Le dimensioni possono essere impostate su una base socket in modo che i valori globali non abbiano alcun significato ...


1

La cosa più vicina che posso trovare è il contatore delle prestazioni Network Interface\Output Queue Length. Questo non è per connessione, tuttavia, solo per interfaccia e copre solo la coda in uscita (ovviamente, con il suo nome).


1

Ora, le dimensioni della finestra sono diverse per socket! Le impostazioni per interfaccia rappresentano solo i valori predefiniti.

Non conosco alcun modo per visualizzare le dimensioni della finestra di ciascun socket. In Solaris, questo può essere visto con "netstat".


0

1
in particolare, cosa dovrei guardare lì?

Windows utilizza vari algoritmi per impostare la dimensione della finestra di ricezione TCP; è possibile ignorare l'impostazione predefinita impostando una chiave di registro. Questo programma può anche aiutarti: dslreports.com/drtcp .
Massimo,

Massimo: stai confondendo le dimensioni della finestra con i dati in coda. Non mi interessano le dimensioni della finestra.

Ok scusa. Queste informazioni non sono comunque disponibili in Windows.
Massimo,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.