【问题标题】:android TrafficStats getUidRxBytes inaccurateandroid TrafficStats getUidRxBytes 不准确
【发布时间】:2014-08-22 06:25:55
【问题描述】:

我写了一个小安卓应用程序,发送 Http 请求,从服务器接收响应,并计算发送和接收的字节数。 代码如下

long receivedBytes = TrafficStats.getUidRxBytes(uid)-lastNumer

我发现receivedBytes总是比http Header+http Body大,例如 我在服务器中捕获的实际http帧的大小(使用wireshark)是1645字节(header+body),但是android API返回receivedBytes是1912,所以传输。

TrafficStats getUidRxBytes 本身不准确(可能这个问题是特定于我的平台 samsung i9300 和 cynogenmod 10.3)

最后,我找到了计算数据使用量的正确方法,我找到了其他方法来计算数据使用量,这似乎比 TrafficStats API 更准确。(非常感谢here

private long[] getStat() {
    String line, line2;
    long[] stats = new long[2];
    try {
        File fileSnd = new File("/proc/uid_stat/"+uid+"/tcp_snd");
        File fileRcv = new File ("/proc/uid_stat/"+uid+"/tcp_rcv");
        BufferedReader br1 = new BufferedReader(new FileReader(fileSnd));
        BufferedReader br2 = new BufferedReader(new FileReader(fileRcv));
        while ((line = br1.readLine()) != null&& (line2 = br2.readLine()) != null) {
            stats[0] = Long.parseLong(line);
            stats[1] = Long.parseLong(line2);
        }
        br1.close();
        br2.close();
    } catch (Exception e) {
        e.printStackTrace();
    }
    return stats;
}

【问题讨论】:

    标签: android http frame


    【解决方案1】:

    我看到您已经找到了解决方案,但我会就您的问题添加我的想法,因为它可能对其他人有用(在谷歌搜索如何使用 TrafficStats API 后我自己最终来到这里)。

    API documentation 声明:

    统计数据是在网络层测量的,因此它们包括 TCP 和 UDP 使用情况。

    文档确实可以更详尽,但我倾向于假设返回的字节数还包括构成传输层标头和网络层标头的字节

    HTTP is an application layer protocol。当您将预期字节计算为 HTTP 标头字节加上 HTTP 主体字节时,您只处理应用层字节,因此不考虑传输层和网络层标头字节。我假设 TCP 用于下载。 This adds a header ranging from 20 to 60 bytes。此外,假设您使用 IPv4 进行下载。 This also adds a header ranging from 20 to 60 bytes.

    显然这不会占整个 1912 - 1645 = 267 个字节,但它可能会给你/其他人一些线索。


    有点离题,但仍然相关。尚不清楚 TrafficStats API 是否实际计算标头字节。根据this answer,API 确实计算标头字节数。但是,鉴于上面列出的 API 文档,链接的答案可能规定了一些不正确的东西(至少对于 API 级别 21 而言不是)。此外,this question 还暗示 TrafficStats 实际计算网络和传输层标头字节数(检查 cmets)。


    TrafficStats 实际上计算网络和传输层标头字节数。请参阅kernel sourceTrafficStatsTest

    【讨论】:

      【解决方案2】:

      据我了解,您应该将 getUidRxBytes 与 getUidRxPackets 结合使用。

      你应该有类似的东西:getUidRxBytes = getUidRxPackets * (tcp/ip header size)

      【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-09-14
      • 1970-01-01
      • 1970-01-01
      • 2016-10-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多