【问题标题】:C - Tracing network event - Lib pcapC - 跟踪网络事件 - Lib pcap
【发布时间】:2016-02-26 07:27:15
【问题描述】:

我想编写一段能够在计算机上监控网络事件的代码。我希望能够随时知道 TX 缓冲区中包含的数据包数量。 由于我的计算机将扮演路由器的角色(准确地说是 WiFi 接入点),因此它不会自行生成数据包。因此,我只需计算计算机接收和发送的数据包数量即可获得所需的信息。

所以,我正在寻找一种能够跟踪此类网络事件的 API。我知道内核跟踪点,但我想找到一些更简单的东西,跟踪点看起来不容易使用,我必须知道发送或接收数据包时调用的确切内核函数...... 难道没有像API这样的信号能够做到这一点吗?

感谢您的帮助:)

编辑:我找到了 libpcap 库,通过它我可以轻松地计算到达接口的数据包。但是有没有办法计算另一个接口上的传出数据包?

【问题讨论】:

  • 这个怎么样,使用system()读取“ifconfig ”的输出,然后解析需要的数据?
  • 感谢您的想法,但我认为 ifconfig 不够快。我刚刚测试过用一个简单的脚本转储 ifconfig 的输出。并且无法跟踪信息,每次发送或接收的数据包返回值都不会改变
  • 那么“netstat -s”怎么样?
  • 它看起来更具反应性,但仍然不够。我想我会尝试使用 pcap 库。我看到它现在可以将数据包放在链接上。我会尝试拦截传入的数据包,然后将它们放在另一个接口中
  •  import os,sys import subprocess flag = 0 def main(): global flag command = ['ifconfig', 'wlan0'] p = subprocess.Popen(command, stdout=subprocess. PIPE) text = p.stdout.read() temp = text.split(' ') for x in temp: if "packets" in x: if flag == 0: print "RX",x flag = 1 else: print "TX",x main()  我知道你想要在 C 中使用它,但作为概念证明,我在 Python 中尝试过它并且它有效。

标签: c networking network-programming


【解决方案1】:

我前段时间回答了一个问题 (What do I need to build to directly access the Ethernet frame bits in the kernel level?),该回答与您的问题相关: 在内核中,您必须查看文件:http://lxr.free-electrons.com/source/net/core/dev.c,在那里您会发现 netif_rx 用于从设备驱动程序接收帧。在那里您还可以归档传输函数(后缀为“xmit”)。

除了转到内核之外,您还有以下选择:pcap、数据包套接字、netfilter、ebtables。

【讨论】:

    【解决方案2】:

    快速回答:

    如果您的 AP 运行 Linux,您可能需要查看以下文件中的各种文件:

    /sys/class/net/<some interface>/statistics/
    

    但是:您的问题不清楚。

    由于我的电脑将扮演路由器的角色(WiFi 访问指向 准确地说)它不会自己生成数据包。

    错误:您的计算机和它的接口会自行生成大量数据包 - 尽管不仅仅是 TCP/IP。首先,“信标帧”(通常每 100 毫秒一个)表示您的 AP 的存在。无论 STA(tion) 是否连接,这些都将被发送。

    您的 AP 还会发送“管理”数据包作为对 STA 要求的响应:

    • 您将作为对“探测请求”的回复发送的“探测响应”发送 由对您的 AP 感兴趣的潜在 STA 提供。
    • 然后在之间交换连接和身份验证帧(前 WPA2) 您的 AP(可能是 hostapd?)和 STA。

    然后然后我们进入TCP/IP数据包的世界。但是我们还没有完成管道:在那之后,因为你是一个路由器,我猜它也运行一个 DHCP 服务器,所以会有 DHCP 提供作为对 DHCP 请求的响应。

    然后,是的,在 STA 之间实际会携带“应用程序”数据包(全部通过您的路由器 AP)。

    如果这是您真正感兴趣的这些数据包,那么您的第一个问题是将它们与所有其他“基础设施”数据包区分开来(不仅在 802.11 基础设施模式的含义中)我上面提到的术语)由接口携带。 因此,您的要求在低级别信息(“任何时间包含在 TX 缓冲区中的数据包数”)和高级别错误预设(“因为我的计算机将扮演路由器的角色”)之间存在内在矛盾(准确地说是WiFi接入点)它不会自己生成数据包”)。

    这是一个完全不同的问题,然后只是每个接口的数据包记帐,您需要某种 DPI(深度数据包检查),可以在这里使用 pcap,或者在每个接口或 IP 的 TCP/IP 级别进行排序和计算(子)网络,netfilter/iptables 可以提供帮助。但我希望我明确表示,您越深入(在内核/接口/接口驱动程序中),您似乎不感兴趣的数据包的“噪音”就会越多。

    【讨论】:

    • 感谢您的回答!事实上,当我说我的计算机作为 AP 运行时,我正在谈论 TPC/IP 数据包。我确实已经开始编写这个 pcap 的东西了,我认为这是我需要的工具。但我还需要重新考虑处理控制框架的问题。非常感谢:)
    • @ThierryArrabal:只要您不在监控模式下运行 pcap,您就不会看到 802.11 管理帧,所以这不是问题。请参阅有关正常、混杂和监控模式的说明here。在 AP(不是 STA)上,即使是正常模式也可能没问题,减去(非常低的)DHCP 流量。
    • 但是如果我想让我的接口继续发送数据包,我不能在监控模式下运行 pcap,可以吗?
    • @ThierryArrabal 不,在监控模式下,您不能成为网络的一部分,既不能作为 STA 也不能作为 AP。这就是为什么你打算做什么对你来说不是问题。
    • 好的,谢谢。我将在不考虑控制框架的情况下测试我的程序,只是为了看看。然后我会谈谈那些框架的问题:)
    猜你喜欢
    • 2015-04-23
    • 2015-01-17
    • 2011-09-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多