Jak wyświetlić rozmiary kolejki wysyłania i odbierania TCP w systemie Windows?

10

Linux netstat pokazuje rozmiary kolejek wysyłania i odbierania.

Jak uzyskać te informacje w systemie Windows, a konkretnie Server 2003?

Izzy
źródło
Czy możesz wkleić przykładowy wynik, który chcesz zobaczyć?
Izzy
Sprawdź ten link. Potrzebuję kolumn Recv-Q i Send-Q z netstat. linux-ip.net/html/tools-netstat.html

Odpowiedzi:

3

(to trochę zrzut mózgu)

Patrząc na kilka wersji źródła netstat, wydaje się, że informacje, których szukasz, są wyszukiwane bezpośrednio z jądra (/ proc / net / ...), a nie za pośrednictwem wywołań związanych z gniazdami, które mają odpowiedniki w systemie Windows. Jeśli jesteś naprawdę zdeterminowany, aby to mieć, spojrzę na to, jak jest pobierane w netstat i zobaczę, co możesz znaleźć, co zapewnia coś równoważnego.

Prawdopodobnie powinieneś spojrzeć na ndis.com (specyfikację interfejsu sterownika sieciowego) i PCAUSA.com w celu uzyskania informacji na poziomie sterownika, ponieważ prawdopodobnie jest to najlepsze miejsce do uzyskania tych informacji w systemie Windows.

Nie wierzę, że getsockopt () lub większość areny Winsock przyniesie Ci wszędzie przydatne, ale jeśli chcesz iść w tym kierunku, spójrz na informacje MSDN Winsock, a także sprawdź FAQ Winsock Programmer .

W przypadku ruchu przychodzącego możesz uzyskać coś przydatnego z funkcji ioctlsocket () z FIONREAD, aby uzyskać ilość czytelnych danych dla gniazda; możesz nie być w stanie uzyskać tego między procesami i w zależności od rodzaju danych może zwrócić informacje tylko dla pierwszego bloku danych, a nie dla całej kolejki, jeśli w kolejce jest więcej niż jeden element.

W tym kontekście możesz trochę kopać „zaległości”, ale większość tego, co widziałem, wydawało się mieć związek z ustawieniem maksymalnego rozmiaru do radzenia sobie z powodzią SYN, a nie z faktem, jak duże było rzeczywiste zaległości.

Jeśli jesteś naprawdę zdeterminowany, możesz być w stanie zrobić coś ze swoim własnym dostawcą usług warstwowych , ale to dziwna i brzydka droga pełna niebezpieczeństw i proponuję trzymać się od niej z daleka.

AKTUALIZACJA: Po nieco dokładniejszej analizie uważam, że powinieneś przyjrzeć się zapytaniom OID NDIS. Znalezienie najbardziej odpowiednich dla Ciebie informacji jest ćwiczeniem pomiędzy Tobą, MSDN i TechNet.

płot
źródło
3

To pytanie jest stare, ale chciałem dodać trochę informacji. To dość wysoki wynik wyszukiwania w Google.

O ile mogę stwierdzić, nie ma na to sposobu, ale jeśli ktoś może więcej kopać i wymyślić prawidłową alternatywę, byłoby to bardzo mile widziane!

Jak wskazał @Fencepost w swojej odpowiedzi, możesz spróbować wysłać zapytanie do OID NDIS. Najbardziej odpowiedni NDIS OID, jaki znalazłem, to OID_GEN_TRANSMIT_QUEUE_LENGTH

Większość identyfikatorów NDIS OID jest mapowanych na klasy WMI, możesz je wymienić w PowerShell z

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

ale wydaje się, że nie ma jednego dla długości kolejki transmisji.

@Chris J wspomniał Interfejs sieciowy \ Długość kolejki wyjściowej. Możesz uzyskać tę wartość w wierszu poleceń za pomocą typeperf .

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

Ale wartość wynosi zawsze 0: http://support.microsoft.com/kb/822226

System Windows śledzi tylko te informacje w oprogramowaniu sterownika karty sieciowej, i to tylko pakiety umieszczone w kolejce na kartę sieciową, i nie rozróżnia między kolejkami na gniazdo.

Jeśli chcesz przeprowadzić debugowanie sieciowe w wierszu poleceń, możesz zapytać o dowolne liczniki znalezione w perfmon przy użyciu typeperf lub logman .

hmatt1
źródło
1

To, czego oczekujesz, może być wynikiem wywołań funkcji WinSock API getsockopt:

  • SO_RCVBUF Całkowita przestrzeń buforowa na gniazdo zarezerwowana dla odbiorników. Jest to niezwiązane SO_MAX_MSG_SIZEi niekoniecznie odpowiada rozmiarowi okna odbioru TCP.

  • SO_SNDBUF Łączna przestrzeń bufora na gniazdo zarezerwowana dla wysyłek. Jest to niezwiązane SO_MAX_MSG_SIZEi niekoniecznie odpowiada rozmiarowi okna wysyłania TCP.

Problem polega na tym, że można zapytać o gniazda, których uchwyt znasz. Zapytania z zewnątrz wydają się trudne, spójrz na narzędzie TysTcView sysinternals . Mark Russinovich jest naprawdę crack i nawet on nie podaje informacji w swoim narzędziu. Jestem pewien, że dodałby kolumnę, gdyby miał sposób na łatwe uzyskanie wartości ...

Wydaje mi się, że jakiś sterownik jądra mógłby pomóc w wierceniu w systemie, ale nie znalazł żadnego dostępnego narzędzia. Rozmiary można ustawić dla podstawy gniazda, aby wartości globalne nie miały znaczenia ...

Jdehaan
źródło
1

Najbliższą rzeczą, jaką mogę znaleźć, jest licznik wydajności Network Interface\Output Queue Length. Nie dotyczy to jednak połączenia - dotyczy tylko interfejsu i obejmuje tylko kolejkę wychodzącą (oczywiście według nazwy).

Chris J
źródło
1

Teraz rozmiary okien są różne dla poszczególnych gniazd! Ustawienia dla interfejsu reprezentują tylko wartości domyślne.

Nie wiem, jak wyświetlić rozmiar okna każdego gniazda. W Solarisie można to zaobserwować za pomocą „netstat”.

asd
źródło
0

Zajrzyj tutaj: http://support.microsoft.com/kb/224829 .

Massimo
źródło
1
konkretnie, na co mam tam patrzeć?
System Windows używa różnych algorytmów, aby ustawić rozmiar okna odbierania protokołu TCP; możesz zastąpić wartość domyślną, ustawiając klucz rejestru. Ten program może również pomóc: dslreports.com/drtcp .
Massimo,
Massimo- mylisz rozmiary okien z kolejkowanymi danymi. Nie interesują mnie rozmiary okien.
Ok przepraszam. Te informacje i tak nie są dostępne w systemie Windows.
Massimo,