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

Posted

技术标签:

【中文标题】如何测量客户端和服务器之间使用的网络带宽?【英文标题】:How to measure the network bandwidth used between client and server? 【发布时间】:2012-08-21 07:54:04 【问题描述】:

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

我如何测量/计算这个?

我假设我只需要测量一次,因为消息的长度和格式是一致的。

我可以控制客户端/服务器/网络。所有人都可以独特地专注于这项任务。客户端是 ios 应用程序,服务器是 php REST Web 服务(在 Windows 上)。两者都在我的局域网上。

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

【问题讨论】:

Firebug Net 选项卡可以为您提供数据包大小。 阅读这些答案后,我意识到我的问题并不清楚。不涉及 html。我在 IOS 设备上有一个(objective-c)应用程序查询 PHP Restful Web 服务。我会更新这个问题。但我认为我可以为此调整答案。我现在就试试。 使用 Charles 代理获取该信息 谢谢@Till。很棒的工具。安装、学习如何使用和完成这项工作需要几分钟的时间。将您的评论作为答案,我会接受。 【参考方案1】:

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

不幸的是,它不适用于大多数 android 设备,因为它们并不真正支持配置系统范围的 HTTP 代理。对于这些情况和非基于 HTTP 的通信,我建议使用WireShark。

在极少数情况下,由于我仍不清楚的原因,Charles 在 iOS 设备上很少会因基于 HTTP 的连接而失败 - 一个典型的例子是 GoogleAnalytics。对于那些,我再次推荐 WireShark。

【讨论】:

【参考方案2】:

JSON 字符串的长度只为您提供传输的网络数据包中有效负载字段的大小。该数据域可以封装在一个HTTP包中,HTTP包在传输前需要放入IP包中。这些数据包中的每一个都具有决定总传输长度的标头字段。

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

【讨论】:

【参考方案3】:

您的 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> ....

【讨论】:

以上是关于如何测量客户端和服务器之间使用的网络带宽?的主要内容,如果未能解决你的问题,请参考以下文章

树莓派使用iperf3测量网络带宽

iperf3 在底层使用啥算法来测量网络基础设施中端到端之间的带宽和延迟?

如何测量带宽使用情况

性能工具之网络 Benchmark iperf3 快速入门

网络性能测试工具iperf详细使用图文教程zz

使用Node.js理解和测量Http时序