代码之家  ›  专栏  ›  技术社区  ›  koo

监控网络使用情况(不包括本地流量)

  •  10
  • koo  · 技术社区  · 14 年前

    我正在开发一个监控网络使用情况的应用程序。然而,我注意到许多这样做的方法不允许排除本地流量(例如,时间机器)。

    我正在寻找一种排除本地流量的方法,并且只监视直接进出互联网的使用情况。

    更新 :谢谢您的回复,现在我知道如何查找流量是否是本地的,但我仍然不知道如何计算总的输入/输出字节(抱歉,如果我之前没有详细说明)。我无法知道在一定时间内或从操作系统启动后本地(或到Internet)发送/接收了多少字节。这个问题由于操作系统运行时进程被启动或终止而更加复杂。

    问题的答案 How to get network adapter stats in linux/Mac OSX? 给出了一种有趣的汇总总使用量的方法,但它没有帮助,因为它汇总的使用量是接口统计数据。

    更新2 :我已经发布了最后的解决方案。请向下滚动一点看。

    8 回复  |  直到 13 年前
        1
  •  2
  •   derobert    13 年前

        2
  •  1
  •   kirtcathey    14 年前

        3
  •  1
  •   rbp    14 年前

    int is_local =
    (src && netmask) == (ifaddr && netmask)
    || (dst && netmask) == (ifaddr && netmask)

    那么你可以确定它是本地的

    http://www.opensource.apple.com/source/network_cmds/network_cmds-307/ifconfig.tproj/ifconfig.c

        4
  •  0
  •   iHS    14 年前

    我认为,一个近似的解决方案:getifaddrs可以用来获取网络使用情况的统计信息。

    它可以分别获得Wi-Fi和WWAN接口的统计数据。

    您可以从以下位置找到更多信息:

    http://www.gsp.com/cgi-bin/man.cgi?section=3&topic=getifaddrs

        5
  •  0
  •   Rolf Rander    14 年前

    这取决于您如何定义“本地”,但常见的定义是查看网络掩码。

    例如,如果您的IP(即您监视的接口的IP

    10.33.52.123
    netmask 255.255.255.0
    

    这意味着每个同时具有源IP和目标IP 10.33.52.xx的IP包都是本地的。

    我不知道cocoa或objective-c,但您可能可以使用以下一些功能帮助您从IP地址提取网络: http://developer.apple.com/library/mac/#documentation/Darwin/Reference/ManPages/man3/inet_network.3.html

        6
  •  0
  •   Michael Myers KitsuneYMG    14 年前

    不知道如何在Objective-C中实现它,但其思想是你得到你所在网络的地址(你可以从基于你的本地IP的网络类(A,B,C)或者从Netmask中的位(如果不是标准的)计算出来),然后检查输出连接的地址。如果目的地不在本地网络中,请计算流量;如果目的地在,则不做任何操作。

        7
  •  0
  •   David Brown    14 年前

    有三个不可路由的IP地址范围,它们通常用作NAT服务的地址范围。任何不在非可路由地址范围内的地址都是外部地址。

    当然,如果你不在一个NAT路由器后面,任务就更难了(从技术上讲,127.0.0.1以下的所有地址都是外部的)。

    不可路由的IP范围是:

    10.0.0.0-10.255.255.255

    172.16.0.0-172.31.255.255

    192.168.0.0-192.168.255.255

        8
  •  0
  •   koo    13 年前

    最后的工作方案是 libpcap 为了达到这个目的。当然,也有一些缺点,包括它需要提升的特权,必须捕获所有过滤后的包来计算统计数据,但至少它工作得很好。

    许多文档和教程 数据包捕获函数库 是相当彻底和清楚的,我建议每一个对这个解决方案感兴趣的人看看那些相对较少的谷歌富努力。

    还有一些人可能会感兴趣的是,我的互联网流量过滤器如下所示-

    - (NSString *)_internetFilterStringForInterface:(AKNetworkInterface *)interface
        inOrOut:(BOOL)inYesOutNo
    {
        if (![interface net] || ![interface mask] || IsEmpty([interface addresses]))
        {
            return nil;
        }
    
        NSString *hostType = inYesOutNo ? @"dst" : @"src";
        NSString *host = nil;
        for (NSString *hostComponent in [interface addresses])
        {
            if (IsEmpty(hostComponent)) continue;
            if (!host)
                host = [NSString stringWithFormat:@"(%@ host %@", hostType, hostComponent];
            else
                host = [host stringByAppendingFormat:@" or %@ host %@", hostType, hostComponent];
        }
        host = [host stringByAppendingString:@")"];
    
        NSString *net = [interface netString];
        net = [net stringByReplacingOccurrencesOfString:@".0" withString:@""];
    
        NSString *filter = [NSString stringWithFormat:
                            @"ip and (not %@ net %@) and %@",
                            inYesOutNo ? @"src" : @"dst",
                            net, host];
        return filter;
    }
    

    这个过滤器是用一些关于“本地流量”的答案设计的,我知道它不包括一些边缘情况,比如双NAT配置等,但是我想看看关于这个的建议。

    我知道 net = [net stringByReplacingOccurrencesOfString:@".0" withString:@""]; 只是一个很快的黑客,在某些特殊情况下很容易失败,但没有人抱怨,至少还没有。