如何衡量客户端和服务器之间使用的网络带宽?

时间:2012-08-26 16:02:22

标签: php ios networking network-programming

我有一个客户端从服务器获取JSON响应。我想计算有多少请求/回复将从网络托管公司消耗我分配的转账津贴(例如每月100GB)。

如何衡量/计算?

我假设我只需要测量一次因为msgs具有一致的长度和格式。

我可以控制客户端/服务器/网络。所有人都可以独特地完成任务。客户端是IOS应用程序,服务器是PHP REST Web服务(在Windows上)。在我的局域网上。

我对此一无所知,到目前为止只使用strlen()获得了JSON的大小。这是否正朝着正确的方向前进?

3 个答案:

答案 0 :(得分:2)

JSON字符串的长度仅为您提供传输的网络数据包中的有效负载字段的大小。该数据字段可以封装在HTTP分组中,并且HTTP分组应该在传输之前被放入IP分组中。这些数据包中的每一个都具有有助于总传输长度的报头字段。

因此,为了进行精确估计,您应该首先使用Wireshark或等效工具找到响应数据包的实际长度。如果这是您的应用程序的唯一请求类型,您可以将带宽划分为服务器应用程序的响应大小,以获得达到限制的最大请求数。但是,如果您的Web应用程序具有可从客户端访问的多个Web页面,则通常不会出现这种情况,因为任何访问(浏览)都会导致从服务器到客户端的数据传输。

答案 1 :(得分:2)

我建议使用Charles Proxy。它是调试通过HTTP交换的各种信息的宝贵工具。您可以使用它来跟踪与iPhone / iPod / iPad以及模拟器之间的所有HTTP / s通信。

遗憾的是,对于大多数Android设备而言,它并不能很好地工作,因为它们并不真正支持配置系统范围的HTTP代理。对于这些情况和非基于HTTP的通信,我建议使用WireShark

在一些罕见的情况下,由于我仍然不清楚的原因,Charles很少在iOS设备上失败以进行基于HTTP的连接 - 典型的情况是GoogleAnalytics。对于那些人,我再次推荐WireShark。

答案 2 :(得分:1)

您的Apache日志将包含每个请求的字节数,但假设您需要完整的PHP解决方案,请将其添加到脚本的开头:

<?php
    function log_input() {
        # get raw post data
        $length = strlen(file_get_contents('php://input'));

        if (function_exists('apache_request_headers')) {
            # quick, but not accurate
            $length += strlen(serialize(apache_request_headers()));
        } else {
            # add fudge for HTTP/1.1 etc
            $length += strlen($_SERVER['QUERY_STRING']) + 14;
            foreach ($_SERVER as $k => $v) {
                if (preg_match('/^HTTP/i', $k)) {
                    $length += strlen($k) + strlen($v);
                }
            }
        }

        $s = sprintf("%s\t%s\n", date('c'), $length);
        file_put_contents('/tmp/input.log', $s, FILE_APPEND);
    }           

    function log_output() {
        $s = sprintf("%s\t%s\n", date('c'), ob_get_length());
        file_put_contents('/tmp/output.log', $s, FILE_APPEND);
    }

    log_input();
    register_shutdown_function('log_output'); 
    ob_start();

?>
<html> ....