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

10

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

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

Иззи
источник
Можете ли вы вставить пример вывода, который вы хотели бы видеть?
Иззи
Проверьте эту ссылку. Мне нужны столбцы Recv-Q и Send-Q от netstat. linux-ip.net/html/tools-netstat.html

Ответы:

3

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

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

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

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

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

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

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

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

fencepost
источник
3

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

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

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

Большинство 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 только отслеживает эту информацию в программном обеспечении драйвера NIC, и это только пакеты, поставленные в очередь на NIC, и не различает, что находится в очереди на сокет.

Если вы хотите выполнить сетевую отладку в командной строке, любые счетчики, которые вы найдете в perfmon, могут быть запрошены с помощью typeperf или logman .

hmatt1
источник
1

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

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

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

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

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

jdehaan
источник
1

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

Крис Дж
источник
1

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

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

ASD
источник
0

Посмотрите здесь: http://support.microsoft.com/kb/224829 .

Massimo
источник
1
в частности, что я должен там смотреть?
Windows использует различные алгоритмы для установки размера окна приема TCP; Вы можете переопределить значение по умолчанию, установив ключ реестра. Эта программа также может помочь вам: dslreports.com/drtcp .
Массимо
Массимо - вы путаете размеры окон с данными в очереди. Меня не интересуют размеры окон.
Хорошо извини В любом случае эта информация недоступна в Windows.
Массимо