【问题标题】:how to count bytes sent and received per TCP connection (system-wide)?如何计算每个 TCP 连接(系统范围)发送和接收的字节数?
【发布时间】:2011-06-09 23:16:37
【问题描述】:

例如TCPView 的最新版本具有这样的功能:显示每个 TCP 连接发送/接收的字节数(启动 TCPView 时开始计数)。是否有可能没有数据包嗅探? Windows 是否为此提供任何 API?我还没有找到这样的性能计数器

如何枚举所有连接描述here

编辑:TDI 是否有助于接收每个套接字的传输统计信息?网络BIOS?有什么链接可以挖吗?

【问题讨论】:

  • 我最喜欢这个问题,我不会提供这个答案,只是一个评论来指导,但是你看过msdn.microsoft.com/en-us/library/aa394291%28v=vs.85%29.aspx吗?
  • @Anders:据我所知,这是系统范围的信息,而不是每个 TCP 连接,对吧?
  • 好像是这样。你还有什么发现吗?
  • 我用谷歌搜索并找到了这个问题,因为 TCPView 没有显示在 64 位 Win7 中发送/接收的字节。其他几个人报告了此问题,但从未发布任何解决方案。既然你们在内部深陷其中,有什么想法会发生这种情况吗?
  • 我没有找到这个功能,你能告诉我是哪个版本吗?

标签: windows winapi network-programming


【解决方案1】:

http://connect.microsoft.com/WNDP/Downloads查看 WinSock LSP 示例项目

您将在 nonifslsp\sockinfo.cpp 中找到一个示例,该示例“说明了如何开发能够计算通过 TCP/IP 套接字传输的所有字节的分层服务提供程序。"

【讨论】:

  • +1:tnx,有趣的信息,还在寻找更简单的东西
【解决方案2】:

我最好的选择是挂钩“发送”API 调用并记录每次发送的金额。虽然这看起来真的不值得,但我很确定它会起作用。祝你好运!

【讨论】:

  • SetWindowsHookEx() 无法挂钩 send()
  • 啊,是的,我说得太早了,抱歉。无论如何,也许您必须查看内核模式代码,因为这就是所有 send() 的最终结果.. 只是一个想法。
  • 不,你不应该在内核中弄脏你的手:你可以使用分层协议作为 Windows 套接字中的服务提供者来挂钩 send(),正如 Maxim 的回答所提到的那样。跨度>
【解决方案3】:

netstat (netstatp) 的 sysinternals 版本执行此操作。 IIRC,它使用 SNMP 收集其信息。搜索网络并找到您喜欢的版本。文件名为 netstatp.c 和 netstatp.h
Sysinternals 不再发布我知道的 netstatp。

您也可以转到here 并获取 tcpview 和/或 tcpconv,其中之一以源代码形式提供。

【讨论】:

  • +1。 tnx 的信息。我没有找到任何与netstatp.c 中发送/接收的每个连接字节相关的代码。 tcpview 在源代码中不可用,并且 tcpconv 不提供此类功能。任何其他信息要在 SNMP 中挖掘什么?
  • @robin hood:对不起,我找不到 sysinternals 过去发布的旧代码。下次我去我的实体办公室时,我会看看它是否在那里。我知道您可以从 SNMP 获取信息,但我不知道 OID。
【解决方案4】:

我也想实现这个功能,所以我倒转tcpview 3.0.2。

我发现,tcpview 使用了一个 WMI 性能计数器 MSNT_TcpIpInformation。

但是xp和2003官方不支持MSNT_TcpIpInformation。

这里是描述,你可以参考。 http://www.scriptinternals.com/new/us/support/Internal/WMI_MSNT_TcpIpInformation.htm

顺便说一句,MSNT_TcpIpInformation 没有关于数据包的信息,所以 tcpview 只是每次都增加发送的数据包和 revd 数据包。 这是反汇编:

CPU Disasm
Address   Hex dump          Command                                           Comments
0040B41B  |.  83E8 02       SUB EAX,2                                         ; Switch (cases 2..3, 3 exits)
0040B41E  |.  74 29         JE SHORT 0040B449
0040B420  |.  83E8 01       SUB EAX,1
0040B423  |.  75 40         JNE SHORT 0040B465
0040B425  |.  8B57 1C       MOV EDX,DWORD PTR DS:[EDI+1C]                     ; Case 3 of switch Tcpview.40B41B
0040B428  |.  0196 90060000 ADD DWORD PTR DS:[ESI+690],EDX
0040B42E  |.  119E 94060000 ADC DWORD PTR DS:[ESI+694],EBX
0040B434  |.  8386 C0060000 ADD DWORD PTR DS:[ESI+6C0],1
0040B43B  |.  119E C4060000 ADC DWORD PTR DS:[ESI+6C4],EBX
0040B441  |.  5E            POP ESI
0040B442  |.  5F            POP EDI
0040B443  |.  5D            POP EBP
0040B444  |.  5B            POP EBX
0040B445  |.  83C4 3C       ADD ESP,3C
0040B448  |.  C3            RETN
0040B449  |>  8B47 1C       MOV EAX,DWORD PTR DS:[EDI+1C]                     ; Case 2 of switch Tcpview.40B41B
0040B44C  |.  0186 78060000 ADD DWORD PTR DS:[ESI+678],EAX
0040B452  |.  119E 7C060000 ADC DWORD PTR DS:[ESI+67C],EBX
0040B458  |.  8386 A8060000 ADD DWORD PTR DS:[ESI+6A8],1
0040B45F  |.  119E AC060000 ADC DWORD PTR DS:[ESI+6AC],EBX
0040B465  |>  5E            POP ESI                                           ; Default case of switch Tcpview.40B41B
0040B466  |.  5F            POP EDI

【讨论】:

  • 有趣。 “在 xp 和 2003 中正式不支持”。但它是支持的,对吧? vista/w7 呢?
  • 来自 vista,windows 提供了一些 API 来获取每个连接的统计信息。如GetPerTcpConnectionEStats、GetUdpTcpConnectionEStats,可以从MSDN获取更多信息。
  • @xjdrew:据我所知,没有GetPerUdpConnectionEStats()。另见:stackoverflow.com/q/49588029/385513
【解决方案5】:

查看BitMeterOS 的源代码,它适用于 xp+。你们很多人也想看看TCPDump/Libpcap。这两个都监控网络网络流量,但 libpcap 可能会是你所追求的

还有Winpcap,一个更面向windows的“版本”,一个关于网络流量统计的简单教程可以找到here,你也会对this感兴趣,用于基于连接的过滤和@987654326 @ 表示原始数据包的大小。

【讨论】:

  • 检查了 BitMetereOS,看起来像它的系统范围的统计信息,而不是每个套接字/连接。 Winpcap:我记得它不会捕获环回流量。请纠正我
  • @Andy T:根据常见问题解答,它没有,但那是 Windows 问题:winpcap.org/misc/faq.htm 然而,使用 winpcap 的wireshark 有一个方法:@987654328 @虽然我只是使用工作中的物理循环插头:P
【解决方案6】:

所有,我已经基本上完全反转了 tcpview 3.0.2 并根据我所学到的实现了与它相同的功能。

tcpview 使用ETW 监控网络活动。

关键 API 是 StartTrace、OpenTrace、ProcessTrace。

使用 KERNEL_LOGGER_NAME 并启用 EVENT_TRACE_FLAG_NETWORK_TCPIP 标志。

然后就可以从EventCallback检索网络活动数据,然后解析为TcpIp_TypeGroup1等结构。根据该文件,这些结构仅受 vista 支持。但是,您可以在 xp(反向猜测)和 2003(我的环境是 2003,xp 上没有测试)中调用和使用它。当然,您必须自己定义所有这些结构。

从 vista 中,win 提供了一些用于检索每个连接统计信息的 API。如GetPerTcpConnectionEStats、GetPerUdpConnectionEStats,您可以从MSDN 获得更多详细信息。

另外,从 vista 中,您可以使用 RAW Socket 来完成相同的工作(我认为更准确)。在 vista 之前,RAW Socket 无法检索 SEND 数据包,很可惜。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-07-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多