如何查看 Windows 上的 TCP 发送和接收队列大小?

如何查看 Windows 上的 TCP 发送和接收队列大小?

Linux netstat 显示发送和接收队列大小。

如何在 Windows(特别是 Server 2003)下获取此信息?

答案1

这个问题很老了,但我想添加一些信息。它在 Google 上的搜索结果相当高。

据我所知,没有办法做到这一点,但如果有人可以进行更多的挖掘并找出一个有效的替代方案,我们将非常感激!

正如@Fencepost 在他的回答中指出的那样,您可以尝试查询 NDIS OID。我发现最相关的 NDIS OID 是OID_GEN_TRANSMIT_QUEUE_LENGTH

大多数 NDIS OID 都映射到 WMI 类,你可以在 powershell 中使用以下命令列出它们

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

但似乎没有针对传输队列长度的。

@Chris J 提到了网络接口\输出队列长度。您可以在命令行中使用以下命令获取此值类型性能

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

但该值始终为 0:http://support.microsoft.com/kb/822226

Windows 仅在 NIC 驱动程序软件中跟踪此信息,并且仅跟踪每个 NIC 排队的数据包,而不区分每个插槽排队的内容。

如果你确实想在命令行上进行网络调试,那么在性能监视器可以使用以下方式查询类型性能或者洛格曼

答案2

(这有点像脑力倾泻)

通过查看 netstat 源代码的几个版本,似乎您要查找的信息是直接从内核 (/proc/net/...) 查询的,而不是通过具有 Windows 等效项的套接字相关调用。如果您真的决心要这样做,我会看看如何在 netstat 中检索它,看看您能找到什么来提供等效的东西。

你应该看看ndis.com(网络驱动程序接口规范)和PCAUSA网站获取驱动程序级别的信息,因为这可能是在 Windows 上检索此信息的最佳位置。

我不相信 getsockopt() 或大多数 Winsock 工具能给你带来任何帮助,但如果你想朝这个方向努力,请查看 MSDN Winsock 信息,并查看Winsock 程序员常见问题解答

对于入站,您可能能够从带有 FIONREAD 的 ioctlsocket() 函数中获取一些有用的信息,以获取套接字的可读数据量;您可能无法跨进程获取此信息,并且根据数据类型,如果有多个项目排队,它可能只返回第一个数据块的信息,而不是整个队列的信息。

您可能会在此上下文中对“积压”进行一些挖掘,但我看到的大部分内容似乎与设置处理 SYN 洪水的最大大小有关,而不是真正了解实际积压的大小。

如果你真的下定决心,你也许可以做点什么分层服务提供商,但这是一条充满危险的奇怪丑陋的道路,我建议远离它。

更新:经过一番探索,我绝对认为您应该考虑查询 NDIS OID。查找与您最相关的信息将作为您、MSDN 和 TechNet 之间的练习。

答案3

您想要的可能是 WinSock API 函数调用的结果getsockopt

  • SO_RCVBUF 为接收保留的每个套接字缓冲区空间总量。这与 TCP 接收窗口的大小无关SO_MAX_MSG_SIZE,也不一定与其相对应。

  • SO_SNDBUF 为发送保留的每个套接字缓冲区空间总量。这与 TCP 发送窗口的大小无关SO_MAX_MSG_SIZE,也不一定与其相对应。

问题是,可以请求您知道其句柄的套接字。从外部查询似乎很困难,请查看 sysinternalsTCP查看器工具。Mark Russinovich 确实是一个高手,甚至他都没有在他的工具中提供信息。我很确定如果他有办法轻松获得这些值,他会添加一个列...

我猜想某些内核驱动程序可以帮助深入研究系统,但没有找到任何可用的工具。大小可以基于每个插槽设置,因此全局值没有意义...

答案4

现在,每个套接字的窗口大小都不同!每个接口的设置仅代表默认值。

我不知道如何查看每个套接字的窗口大小。在 Solaris 中,可以使用“netstat”查看。

相关内容