Назад | Перейти на главную страницу

Как просмотреть размеры очереди отправки и получения TCP в Windows?

Linux netstat показывает размеры очереди отправки и получения.

Как мне получить эту информацию в Windows, в частности в Server 2003?

Это старый вопрос, но я хотел добавить некоторую информацию. Это довольно высокий результат поиска в Google.

Насколько я могу судить, способа сделать это невозможно, но если кто-то может еще покопаться и найти действительную альтернативу, это будет очень полезно!

Как отметил @Fencepost в своем ответе, вы можете попытаться запросить OID NDIS. Наиболее подходящий NDIS OID, который я нашел, это OID_GEN_TRANSMIT_QUEUE_LENGTH

Большинство OID NDIS сопоставлены с классами WMI, вы можете перечислить их в PowerShell с помощью

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

но, похоже, нет такой длины очереди передачи.

@Chris J упомянул сетевой интерфейс \ длину очереди вывода. Вы можете получить это значение в командной строке с помощью typeperf.

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

Но значение всегда равно 0: http://support.microsoft.com/kb/822226

Windows отслеживает эту информацию только в программном обеспечении драйвера сетевой карты, и это только пакеты, поставленные в очередь на каждую сетевую карту, и не делает различий между тем, что находится в очереди на сокет.

Если вы действительно хотите выполнить отладку сети в командной строке, любые счетчики, которые вы найдете в перфмон можно запросить, используя typeperf или лесоруб.

(это что-то вроде свалки мозга)

Глядя на пару версий источника netstat, кажется, что информация, которую вы ищете, запрашивается непосредственно из ядра (/ proc / net / ...), а не через связанные с сокетами вызовы, которые имеют эквиваленты Windows. Если вы действительно настроены на это, я бы посмотрел, как он извлекается в netstat, и посмотрю, что вы можете найти, что обеспечивает что-то эквивалентное.

Вам, наверное, стоит посмотреть ndis.com (Спецификация интерфейса сетевого драйвера) и PCAUSA.com для информации на уровне драйвера, потому что это, вероятно, ваше лучшее место для получения этой информации в Windows.

Я не верю, что getsockopt () или большая часть арены Winsock принесут вам что-то полезное, но если вы хотите пойти в этом направлении, посмотрите информацию MSDN Winsock, а также проверьте FAQ программиста Winsock.

Для входящего трафика вы можете получить что-нибудь полезное из функции ioctlsocket () с FIONREAD, чтобы получить количество читаемых данных для сокета; у вас может не получиться получить это между процессами, и в зависимости от типа данных он может возвращать информацию только для первого блока данных, а не для всей очереди, если в очереди находится более одного элемента.

В этом контексте вы могли бы покопаться в «бэклоге», но большая часть того, что я видел, похоже, относилась к установке максимального размера для работы с SYN-потоками, а не к тому, чтобы увидеть, насколько велик был фактический бэклог.

Если вы действительно полны решимости, возможно, вы сможете что-то сделать со своим Многоуровневый поставщик услуг, но это странная и уродливая дорога, полная опасностей, и я собираюсь предложить держаться от нее подальше.

ОБНОВЛЕНИЕ: немного покопавшись, я определенно думаю, что вам стоит взглянуть на запросы OID NDIS. Поиск наиболее актуальной для вас информации остается делом между вами, MSDN и TechNet.

Самое близкое, что я могу найти, - это счетчик производительности. Network Interface\Output Queue Length. Однако это не для каждого соединения - только для каждого интерфейса и охватывает только исходящую очередь (очевидно, по ее имени).

То, что вы хотите, может быть результатом вызовов функций WinSock API. getsockopt:

  • SO_RCVBUF Общее буферное пространство на сокет, зарезервированное для приема. Это не связано с SO_MAX_MSG_SIZE и не обязательно соответствует размеру окна приема TCP.

  • SO_SNDBUF Общее буферное пространство на сокет, зарезервированное для отправки. Это не связано с SO_MAX_MSG_SIZE и не обязательно соответствует размеру окна отправки TCP.

Проблема в том, что у него могут быть запрошены сокеты, дескриптор которых вам известен. Запросы извне кажутся сложными, взгляните на sysinternals TcpView инструмент. Марк Руссинович действительно настоящий крэк, и даже он не предоставляет информацию в своем инструменте. Я почти уверен, что он бы добавил столбец, если бы у него был способ легко получить значения ...

Я предполагаю, что какой-то драйвер ядра может помочь разобраться в системе, но не нашел ни одного доступного инструмента. Размеры могут быть установлены для каждого сокета, так что глобальные значения не имеют значения ...

Теперь размеры окон разные для каждой розетки! Настройки для каждого интерфейса представляют собой только значения по умолчанию.

Я не знаю способа просмотреть размер окна каждого сокета. В Solaris это можно увидеть с помощью netstat.

Взгляните сюда: http://support.microsoft.com/kb/224829.