开源工具iperf源代码以及解析

时间: 2023-10-31 13:52:39 浏览: 47
iPerf是一款基于命令行的网络性能测试工具,可以用于测试TCP和UDP协议的吞吐量、延迟等网络性能指标。iPerf最初是由NLANR/DAST组织开发的,现在已经开源并由开源社区维护。 iPerf的源代码托管在GitHub上,地址为:https://github.com/esnet/iperf。iPerf主要由C语言编写,支持跨平台运行。代码结构比较清晰,主要包括以下几个文件: - iperf.c:iPerf的入口文件,包括主函数和命令行解析等。 - tcp_window_size.c:TCP窗口大小的设置和获取函数实现。 - settings.c:iPerf中各种参数的设置和获取函数实现,包括带宽、连接超时、窗口大小等。 - net.c:网络相关的函数实现,包括socket的创建、连接、发送和接收等。 - timer.c:计时器相关的函数实现,包括开始计时、停止计时等。 iPerf的源代码比较易读,可以通过阅读源代码来了解其实现原理。同时,iPerf也提供了详细的文档和使用说明,方便用户学习和使用。
相关问题

开源工具iperf源代码解析

iperf是一个广泛使用的网络性能测量工具,支持TCP和UDP协议。它可以用于测试网络的吞吐量、带宽、延迟、抖动等性能指标。 整个iperf的源代码主要分为两部分:客户端和服务器端。客户端主要负责向服务器端发送数据并测量网络性能,而服务器端则负责接收客户端发送的数据并计算性能指标。 下面我们来分别分析客户端和服务器端的源代码实现。 ### 客户端 客户端的主要功能是向服务器端发送数据并测量网络性能。下面是客户端的主要实现步骤: 1. 命令行参数解析:客户端通过解析命令行参数来获取需要连接的服务器地址、端口号、测试时间、传输协议等信息。 2. 建立连接:客户端通过socket API建立与服务器端的连接。 3. 发送数据:客户端通过循环发送数据包的方式向服务器端发送数据。 4. 接收数据并计算性能指标:客户端通过循环接收服务器端返回的数据包,并根据接收到的数据包计算网络性能指标,如带宽、延迟等。 5. 输出测试结果:客户端最后将测试结果输出到命令行界面或者日志文件中。 客户端的源代码实现比较简单,主要是通过socket API来实现数据的发送和接收,并通过计算性能指标来实现性能测量。其中,核心代码主要在`iperf_client.cpp`文件中实现。 ### 服务器端 服务器端的主要功能是接收客户端发送的数据并计算性能指标。下面是服务器端的主要实现步骤: 1. 命令行参数解析:服务器端通过解析命令行参数来获取监听的端口号、传输协议等信息。 2. 建立监听:服务器端通过socket API建立监听,并等待客户端的连接请求。 3. 接收数据:服务器端通过循环接收客户端发送的数据包,并将接收到的数据包放入缓存中。 4. 计算性能指标:服务器端通过缓存中的数据包来计算网络性能指标,如带宽、延迟等。 5. 输出测试结果:服务器端最后将测试结果输出到命令行界面或者日志文件中。 服务器端的源代码实现比较简单,主要是通过socket API来实现数据的接收,并通过计算性能指标来实现性能测量。其中,核心代码主要在`iperf_server.cpp`文件中实现。 总体来说,iperf的源代码实现比较简单,主要是通过socket API来实现网络数据传输,并通过计算性能指标来实现性能测量。如果你想深入了解iperf的实现细节,可以通过阅读源代码来进一步了解。

开源工具iperf代码C/C++

以下是iperf3的C代码,可以在GitHub上找到完整的代码: ```c #include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <signal.h> #include <errno.h> #include <netdb.h> #include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h> #include "iperf.h" #include "iperf_api.h" #include "iperf_locale.h" #include "units.h" #include "net.h" #include "timer.h" #include "tcp_window_size.h" #include "cjson.h" #ifdef HAVE_SSL #include <openssl/ssl.h> #include <openssl/err.h> #endif /* Forwards. */ static int iperf_run(struct iperf_test *test); /**************************************************************************/ int main(int argc, char **argv) { int i; struct iperf_test *test; int result; struct sigaction sa; char client_version[10] = IPERF_VERSION; setlocale(LC_ALL, ""); bindtextdomain("iperf3", LOCALEDIR); textdomain("iperf3"); /* Initialize settings. */ test = iperf_new_test(); /* Register a few signal handlers to make clean exit more likely. */ memset(&sa, 0, sizeof(sa)); sa.sa_handler = &iperf_got_sigint; sigaction(SIGINT, &sa, NULL); sa.sa_handler = &iperf_got_sigpipe; sigaction(SIGPIPE, &sa, NULL); /* Parse command line options, handling some options immediately. */ i = iperf_parse_arguments(test, argc, argv); if (i < 0) { fprintf(stderr, "%s", iperf_strerror(i)); exit(1); } if (test->version) { printf("%s\n", client_version); exit(0); } else if (test->help) { iperf_printf(test, "\n%s\n\n%s\n\n%s\n\n%s\n\n%s\n\n%s\n\n%s\n", "Usage: iperf3 [-options] [-s|-c host] [options]\n", "Client/Server:", " -V, --version show version information and quit.", " -h, --help show this message and quit.", " -i, --interval n seconds between periodic bandwidth reports.", " -f, --format [kmKM] format to report: Kbits, Mbits, KBytes, MBytes", " -P, --parallel n number of parallel client streams to run."); iperf_printf(test, "\n%s\n\n%s\n\n%s\n\n%s\n\n%s\n\n%s\n\n%s\n\n%s\n\n%s\n\n%s\n\n%s\n\n%s\n\n%s\n\n%s\n\n", "Client specific:", " -c, --client <host> run in client mode, connecting to <host>.", " -u, --udp use UDP rather than TCP.", " -b, --bitrate #[KMG][/#] target bitrate in bits/sec (0 for unlimited)", " (default 1 Mbit/sec for UDP, unlimited for TCP)", " -t, --time n time in seconds to transmit for (default 10 secs)", " -n, --bytes n number of bytes to transmit (instead of -t)", " -k, --blockcount #[KMG] number of blocks (packets) to transmit (instead of -t or -n)", " -l, --length #[KMG] length of buffer to read or write", " (default 128 KB for TCP, dynamic or 8 KB for UDP)", " -R, --reverse reverse the direction of a test (client sends, server receives)."); iperf_printf(test, "\n%s\n\n%s\n\n%s\n\n%s\n\n%s\n\n", "Server specific:", " -s, --server run in server mode.", " -D, --daemon run the server as a daemon", " -I, --pidfile file write PID file (default /var/run/iperf3.pid)", " -1, --one-off handle one client connection then exit.", " -B, --bind <host> bind to a specific interface, e.g. eth0"); iperf_printf(test, "\n%s\n\n%s\n\n%s\n\n%s\n\n%s\n\n%s\n\n%s\n\n%s\n\n", "JSON options:", " -J, --json output in JSON format", " --logfile f send output to a log file", "", "For more information and tuning options, see iperf3's man page.", "", "Please report bugs to https://github.com/esnet/iperf", ""); exit(0); } /* Check for version number consistency. */ if (test->protocol->id == Ptcp && test->version == 3 && test->tcp.omit_version) { i = 2; } else { i = 3; } if (strncmp(client_version, test->version_string, i) != 0) { iperf_printf(test, "warning: version number mismatch (client %s, server %s)\n", client_version, test->version_string); } /* Initialize IP protocol */ if (test->cookiefile) { test->cookie = iperf_load_cookie(test->cookiefile); if (test->cookie == NULL) { iperf_errexit(test, "unable to load cookie from file '%s'", test->cookiefile); } } if (test->reverse) test->settings->reverse = 1; if (test->protocol->id == Pudp) { if (test->settings->mss || test->settings->socket_bufsize) { iperf_printf(test, "warning: MSS and socket buffer size settings are not used in UDP mode.\n"); } if (test->settings->no_delay) { iperf_printf(test, "warning: the TCP_NODELAY option is not used in UDP mode.\n"); } if (test->settings->pmtu != -1) { iperf_printf(test, "warning: the PMTU option is not used in UDP mode.\n"); } } #ifdef HAVE_SSL /* Initialize SSL library */ if (test->protocol->id == Ptcp && test->settings->ssl) { SSL_load_error_strings(); SSL_library_init(); test->sslctx = SSL_CTX_new(TLS_client_method()); if (test->sslctx == NULL) { iperf_errexit(test, "failed to create SSL context\n"); } if (test->settings->ssl_cafile) { if (SSL_CTX_load_verify_locations(test->sslctx, test->settings->ssl_cafile, NULL) != 1) { SSL_CTX_free(test->sslctx); iperf_errexit(test, "failed to load CA certificates from %s\n", test->settings->ssl_cafile); } } if (test->settings->ssl_cert) { if (SSL_CTX_use_certificate_chain_file(test->sslctx, test->settings->ssl_cert) != 1) { SSL_CTX_free(test->sslctx); iperf_errexit(test, "failed to load SSL certificate from %s\n", test->settings->ssl_cert); } } if (test->settings->ssl_key) { if (SSL_CTX_use_PrivateKey_file(test->sslctx, test->settings->ssl_key, SSL_FILETYPE_PEM) != 1) { SSL_CTX_free(test->sslctx); iperf_errexit(test, "failed to load SSL key from %s\n", test->settings->ssl_key); } } SSL_CTX_set_verify(test->sslctx, SSL_VERIFY_PEER, NULL); } #endif /* Daemon mode. */ if (test->daemon) { if (daemon(0, 0) != 0) { iperf_errexit(test, "error - failed to become a daemon: %s\n", strerror(errno)); } if (test->pidfile) { FILE *f; f = fopen(test->pidfile, "w"); if (f == NULL) { iperf_errexit(test, "error - unable to write PID file '%s': %s\n", test->pidfile, strerror(errno)); } fprintf(f, "%d\n", getpid()); fclose(f); } } /* Ignore SIGPIPE to simplify error handling */ sa.sa_handler = SIG_IGN; sigaction(SIGPIPE, &sa, NULL); /* If we are doing a single client (-1) and it is a daemon, don't do -D again */ if (test->daemon && test->num_ostreams == 1) test->daemon = 0; /* Defer daemon mode until after the above check for single client + daemon */ if (test->daemon) { if (daemon(0, 0) != 0) { iperf_errexit(test, "error - failed to become a daemon: %s\n", strerror(errno)); } if (test->pidfile) { FILE *f; f = fopen(test->pidfile, "w"); if (f == NULL) { iperf_errexit(test, "error - unable to write PID file '%s': %s\n", test->pidfile, strerror(errno)); } fprintf(f, "%d\n", getpid()); fclose(f); } } /* Ignore SIGPIPE to simplify error handling */ sa.sa_handler = SIG_IGN; sigaction(SIGPIPE, &sa, NULL); /* Set up the output stream */ if (test->json_output) { test->outfile = json_get_output_stream(test->json_output_file); } else if (test->logfile) { test->outfile = fopen(test->logfile, "w"); if (test->outfile == NULL) { iperf_errexit(test, "error - unable to write log to file '%s': %s\n", test->logfile, strerror(errno)); } } else { test->outfile = stdout; } /* Start the client or server */ if (test->server) { if (test->daemon) { iperf_printf(test, "Server listening on port %d\n", test->server_port); } else { iperf_printf(test, "-----------------------------------------------------------\n"); iperf_printf(test, "Server listening on %s port %d\n", test->settings->domain == AF_INET6 ? "[::]" : "0.0.0.0", test->server_port); iperf_printf(test, "-----------------------------------------------------------\n"); } result = iperf_run_server(test); } else { if (test->daemon) { iperf_printf(test, "Client connecting to %s, TCP port %d\n", test->server_hostname, test->server_port); } else { if (test->reverse) iperf_printf(test, "-----------------------------------------------------------\n"); iperf_printf(test, "Client connecting to %s, %s port %d\n", test->server_hostname, test->protocol->name, test->server_port); if (test->reverse) iperf_printf(test, "-----------------------------------------------------------\n"); } result = iperf_run_client(test); } if (test->cookie) iperf_delete_cookie(test->cookie); #ifdef HAVE_SSL if (test->protocol->id == Ptcp && test->settings->ssl) { SSL_CTX_free(test->sslctx); } ERR_free_strings(); #endif iperf_free_test(test); return result; } static int iperf_run(struct iperf_test *test) { test->start_time = milliseconds(); test->next_time = test->start_time; test->bytes_sent = 0; test->blocks_sent = 0; test->retransmits = 0; if (test->server_hostname) { test->server_hostname_len = strlen(test->server_hostname); } if (test->bind_address) { test->bind_address_len = strlen(test->bind_address); } if (test->json_output) { cJSON *json_output = cJSON_CreateObject(); if (json_output == NULL) { iperf_errexit(test, "error - cJSON_CreateObject failed: %s\n", strerror(errno)); } cJSON_AddItemToObject(json_output, "start", cJSON_CreateNumber((double) test->start_time / 1000)); if (test->verbose) { cJSON_AddItemToObject(json_output, "verbose", cJSON_CreateNumber(1)); } cJSON_AddItemToObject(json_output, "system_info", cJSON_CreateObject()); iperf_json_printf(json_output, "version", "%s", test->version); iperf_json_printf(json_output, "system_info", "%s", get_system_info()); if (test->title) { iperf_json_printf(json_output, "title", "%s", test->title); } if (test->extra_data) { cJSON_AddItemToObject(json_output, "extra_data", cJSON_Parse(test->extra_data)); } test->json_start_time = milliseconds(); test->json_output_string = cJSON_Print(json_output); cJSON_Delete(json_output); if (test->json_output_string == NULL) { iperf_errexit(test, "error - cJSON_Print failed: %s\n", strerror(errno)); } } if (test->protocol->id == Ptcp) { if (test->settings->socket_bufsize) { if (iperf_set_tcp_windowsize(test) != 0) { iperf_errexit(test, "error - %s\n", strerror(errno)); } } } if (test->reverse) { if (test->protocol->id == Ptcp) { if (iperf_create_streams(test, test->reverse) < 0) { iperf_errexit(test, "error - %s\n", strerror(errno)); } } if (iperf_connect(test, test->reverse) < 0) { iperf_errexit(test, "error - %s\n", strerror(errno)); } } else { if (iperf_create_streams(test, test->reverse) < 0) { iperf_errexit(test, "error - %s\n", strerror(errno)); } if (iperf_connect(test, test->reverse) < 0) { iperf_errexit(test, "error - %s\n", strerror(errno)); } } if (test->json_output) { cJSON *json_output = cJSON_CreateObject(); if (json_output == NULL) { iperf_errexit(test, "error - cJSON_CreateObject failed: %s\n", strerror(errno)); } cJSON_AddItemToObject(json_output, "start", cJSON_CreateNumber((double) test->start_time / 1000)); if (test->verbose) { cJSON_AddItemToObject(json_output, "verbose", cJSON_CreateNumber(1)); } iperf_json_printf(json_output, "interval", "%d", test->settings->stats_interval); if (test->title) { iperf_json_printf(json_output, "title", "%s", test->title); } if (test->extra_data) { cJSON_AddItemToObject(json_output, "extra_data", cJSON_Parse(test->extra_data)); } iperf_json_printf(json_output, "start_connected", "%d", test->connected); cJSON_AddItemToObject(json_output, "intervals", cJSON_CreateArray()); test->json_output_string = cJSON_Print(json_output); cJSON_Delete(json_output); if (test->json_output_string == NULL) { iperf_errexit(test, "error - cJSON_Print failed: %s\n", strerror(errno)); } } if (test->protocol->id == Pudp) { if (iperf_udp_connect(test) < 0) { iperf_errexit(test, "error - %s\n", strerror(errno)); } } if (test->reverse) { if (test->protocol->id == Ptcp) { if (iperf_listen(test) < 0) { iperf_errexit(test, "error - %s\n", strerror(errno)); } } if (test->protocol->id == Pudp || test->protocol->id == Psctp) { if (iperf_run_server_udp(test) < 0) { iperf_errexit(test, "error - %s\n", strerror(errno)); } } else { if (iperf_run_server_tcp(test) < 0) { iperf_errexit(test, "error - %s\n", strerror(errno)); } } } else { if (test->protocol->id == Ptcp) { if (iperf_run_client_tcp(test) < 0) { iperf_errexit(test, "error - %s\n", strerror(errno)); } } else { if (iperf_run_client_udp(test) < 0) { iperf_errexit(test, "error - %s\n", strerror(errno)); } } } if (test->json_output) { cJSON *json_output = cJSON_CreateObject(); if (json_output == NULL) { iperf_errexit(test, "error - cJSON_CreateObject failed: %s\n", strerror(errno)); } cJSON_AddItemToObject(json_output, "start", cJSON_CreateNumber((double) test->start_time / 1000)); if (test->verbose) { cJSON_AddItemToObject(json_output, "verbose", cJSON_CreateNumber(1)); } iperf_json_printf(json_output, "interval", "%d", test->settings->stats_interval); if (test->title) { iperf_json_printf(json_output, "title", "%s", test->title); } if (test

相关推荐

最新推荐

recommend-type

安装aarch64交叉编译工具并交叉编译iperf3.1.3.docx

文档包含完整的例子,交叉编译还提供了下载链接,保证有用,不成功可...centos7下进行aarch64(arm64)交叉编译工具安装 iperf3交叉编译并在Android下运行 iperf3带宽TCP、UDP性能测试 怎么5分变6分了,不知道为什么
recommend-type

iperf手册及实例解析

iperf 工具实例解析 下面是一个使用 iperf 工具进行 10M 以上带宽测速的操作手册: 1. 使用 iperf 工具进行 10M 以上带宽测速的操作和使用 iperf 工具测速的步骤基本相同,就是在最后输入的命令需要更换为“iperf ...
recommend-type

iperf3灌包方法.doc

iPerf3 是一种用于主动侦测 IP 网络上最大可实现带宽的工具。它支持时序、缓冲区、协议(TCP,UDP,SCTP 与 IPv4 和 IPv6)有关的各种参数。 iPerf3 的特点: 1. 支持多种协议,包括 TCP,UDP,SCTP 等。 2. 可以...
recommend-type

iperf使用工具说明文档

iperf 使用工具说明文档 本文档主要介绍了iperf 测速工具的使用方法,并对比了 HTTP 下载、FTP 下载和iperf 测速工具的宽带测速操作方法。下面是本文档中所涉及到的知识点: 1. 宽带测速操作方法:本文档主要介绍...
recommend-type

window和linux系统iperf网络测速工具使用

在 Linux 系统中,我们可以通过下载 iPerf 的源代码,使用交叉编译器编译生成可执行文件,最后将其 copy 到板子上去。使用 iPerf 工具,我们可以测量网络性能,定位网络瓶颈。 iPerf 工具的使用非常简单,首先我们...
recommend-type

GO婚礼设计创业计划:技术驱动的婚庆服务

"婚礼GO网站创业计划书" 在创建婚礼GO网站的创业计划书中,创业者首先阐述了企业的核心业务——GO婚礼设计,专注于提供计算机软件销售和技术开发、技术服务,以及与婚礼相关的各种服务,如APP制作、网页设计、弱电工程安装等。企业类型被定义为服务类,涵盖了一系列与信息技术和婚礼策划相关的业务。 创业者的个人经历显示了他对行业的理解和投入。他曾在北京某科技公司工作,积累了吃苦耐劳的精神和实践经验。此外,他在大学期间担任班长,锻炼了团队管理和领导能力。他还参加了SYB创业培训班,系统地学习了创业意识、计划制定等关键技能。 市场评估部分,目标顾客定位为本地的结婚人群,特别是中等和中上收入者。根据数据显示,广州市内有14家婚庆公司,该企业预计能占据7%的市场份额。广州每年约有1万对新人结婚,公司目标接待200对新人,显示出明确的市场切入点和增长潜力。 市场营销计划是创业成功的关键。尽管文档中没有详细列出具体的营销策略,但可以推断,企业可能通过线上线下结合的方式,利用社交媒体、网络广告和本地推广活动来吸引目标客户。此外,提供高质量的技术解决方案和服务,以区别于竞争对手,可能是其市场差异化策略的一部分。 在组织结构方面,未详细说明,但可以预期包括了技术开发团队、销售与市场部门、客户服务和支持团队,以及可能的行政和财务部门。 在财务规划上,文档提到了固定资产和折旧、流动资金需求、销售收入预测、销售和成本计划以及现金流量计划。这表明创业者已经考虑了启动和运营的初期成本,以及未来12个月的收入预测,旨在确保企业的现金流稳定,并有可能享受政府对大学生初创企业的税收优惠政策。 总结来说,婚礼GO网站的创业计划书详尽地涵盖了企业概述、创业者背景、市场分析、营销策略、组织结构和财务规划等方面,为初创企业的成功奠定了坚实的基础。这份计划书显示了创业者对市场的深刻理解,以及对技术和婚礼行业的专业认识,有望在竞争激烈的婚庆市场中找到一席之地。
recommend-type

管理建模和仿真的文件

管理Boualem Benatallah引用此版本:布阿利姆·贝纳塔拉。管理建模和仿真。约瑟夫-傅立叶大学-格勒诺布尔第一大学,1996年。法语。NNT:电话:00345357HAL ID:电话:00345357https://theses.hal.science/tel-003453572008年12月9日提交HAL是一个多学科的开放存取档案馆,用于存放和传播科学研究论文,无论它们是否被公开。论文可以来自法国或国外的教学和研究机构,也可以来自公共或私人研究中心。L’archive ouverte pluridisciplinaire
recommend-type

【基础】PostgreSQL的安装和配置步骤

![【基础】PostgreSQL的安装和配置步骤](https://img-blog.csdnimg.cn/direct/8e80154f78dd45e4b061508286f9d090.png) # 2.1 安装前的准备工作 ### 2.1.1 系统要求 PostgreSQL 对系统硬件和软件环境有一定要求,具体如下: - 操作系统:支持 Linux、Windows、macOS 等主流操作系统。 - CPU:推荐使用多核 CPU,以提高数据库处理性能。 - 内存:根据数据库规模和并发量确定,一般建议 8GB 以上。 - 硬盘:数据库文件和临时文件需要占用一定空间,建议预留足够的空间。
recommend-type

字节跳动面试题java

字节跳动作为一家知名的互联网公司,在面试Java开发者时可能会关注以下几个方面的问题: 1. **基础技能**:Java语言的核心语法、异常处理、内存管理、集合框架、IO操作等是否熟练掌握。 2. **面向对象编程**:多态、封装、继承的理解和应用,可能会涉及设计模式的提问。 3. **并发编程**:Java并发API(synchronized、volatile、Future、ExecutorService等)的使用,以及对并发模型(线程池、并发容器等)的理解。 4. **框架知识**:Spring Boot、MyBatis、Redis等常用框架的原理和使用经验。 5. **数据库相
recommend-type

微信行业发展现状及未来发展趋势分析

微信行业发展现状及未来行业发展趋势分析 微信作为移动互联网的基础设施,已经成为流量枢纽,月活跃账户达到10.4亿,同增10.9%,是全国用户量最多的手机App。微信的活跃账户从2012年起步月活用户仅为5900万人左右,伴随中国移动互联网进程的不断推进,微信的活跃账户一直维持稳步增长,在2014-2017年年末分别达到5亿月活、6.97亿月活、8.89亿月活和9.89亿月活。 微信月活发展历程显示,微信的用户数量增长已经开始呈现乏力趋势。微信在2018年3月日活达到6.89亿人,同比增长5.5%,环比上个月增长1.7%。微信的日活同比增速下滑至20%以下,并在2017年年底下滑至7.7%左右。微信DAU/MAU的比例也一直较为稳定,从2016年以来一直维持75%-80%左右的比例,用户的粘性极强,继续提升的空间并不大。 微信作为流量枢纽,已经成为移动互联网的基础设施,月活跃账户达到10.4亿,同增10.9%,是全国用户量最多的手机App。微信的活跃账户从2012年起步月活用户仅为5900万人左右,伴随中国移动互联网进程的不断推进,微信的活跃账户一直维持稳步增长,在2014-2017年年末分别达到5亿月活、6.97亿月活、8.89亿月活和9.89亿月活。 微信的用户数量增长已经开始呈现乏力趋势,这是因为微信自身也在重新寻求新的增长点。微信日活发展历程显示,微信的用户数量增长已经开始呈现乏力趋势。微信在2018年3月日活达到6.89亿人,同比增长5.5%,环比上个月增长1.7%。微信的日活同比增速下滑至20%以下,并在2017年年底下滑至7.7%左右。 微信DAU/MAU的比例也一直较为稳定,从2016年以来一直维持75%-80%左右的比例,用户的粘性极强,继续提升的空间并不大。因此,在整体用户数量开始触达天花板的时候,微信自身也在重新寻求新的增长点。 中国的整体移动互联网人均单日使用时长已经较高水平。18Q1中国移动互联网的月度总时长达到了77千亿分钟,环比17Q4增长了14%,单人日均使用时长达到了273分钟,环比17Q4增长了15%。而根据抽样统计,社交始终占据用户时长的最大一部分。2018年3月份,社交软件占据移动互联网35%左右的时长,相比2015年减少了约10pct,但仍然是移动互联网当中最大的时长占据者。 争夺社交软件份额的主要系娱乐类App,目前占比达到约32%左右。移动端的流量时长分布远比PC端更加集中,通常认为“搜索下載”和“网站导航”为PC时代的流量枢纽,但根据统计,搜索的用户量约为4.5亿,为各类应用最高,但其时长占比约为5%左右,落后于网络视频的13%左右位于第二名。PC时代的网络社交时长占比约为4%-5%,基本与搜索相当,但其流量分发能力远弱于搜索。 微信作为移动互联网的基础设施,已经成为流量枢纽,月活跃账户达到10.4亿,同增10.9%,是全国用户量最多的手机App。微信的活跃账户从2012年起步月活用户仅为5900万人左右,伴随中国移动互联网进程的不断推进,微信的活跃账户一直维持稳步增长,在2014-2017年年末分别达到5亿月活、6.97亿月活、8.89亿月活和9.89亿月活。 微信的用户数量增长已经开始呈现乏力趋势,这是因为微信自身也在重新寻求新的增长点。微信日活发展历程显示,微信的用户数量增长已经开始呈现乏力趋势。微信在2018年3月日活达到6.89亿人,同比增长5.5%,环比上个月增长1.7%。微信的日活同比增速下滑至20%以下,并在2017年年底下滑至7.7%左右。 微信DAU/MAU的比例也一直较为稳定,从2016年以来一直维持75%-80%左右的比例,用户的粘性极强,继续提升的空间并不大。因此,在整体用户数量开始触达天花板的时候,微信自身也在重新寻求新的增长点。 微信作为移动互联网的基础设施,已经成为流量枢纽,月活跃账户达到10.4亿,同增10.9%,是全国用户量最多的手机App。微信的活跃账户从2012年起步月活用户仅为5900万人左右,伴随中国移动互联网进程的不断推进,微信的活跃账户一直维持稳步增长,在2014-2017年年末分别达到5亿月活、6.97亿月活、8.89亿月活和9.89亿月活。 微信的用户数量增长已经开始呈现乏力趋势,这是因为微信自身也在重新寻求新的增长点。微信日活发展历程显示,微信的用户数量增长已经开始呈现乏力趋势。微信在2018年3月日活达到6.89亿人,同比增长5.5%,环比上个月增长1.7%。微信的日活同比增速下滑至20%以下,并在2017年年底下滑至7.7%左右。 微信DAU/MAU的比例也一直较为稳定,从2016年以来一直维持75%-80%左右的比例,用户的粘性极强,继续提升的空间并不大。因此,在整体用户数量开始触达天花板的时候,微信自身也在重新寻求新的增长点。 微信作为移动互联网的基础设施,已经成为流量枢纽,月活跃账户达到10.4亿,同增10.9%,是全国用户量最多的手机App。微信的活跃账户从2012年起步月活用户仅为5900万人左右,伴随中国移动互联网进程的不断推进,微信的活跃账户一直维持稳步增长,在2014-2017年年末分别达到5亿月活、6.97亿月活、8.89亿月活和9.89亿月活。 微信的用户数量增长已经开始呈现乏力趋势,这是因为微信自身也在重新寻求新的增长点。微信日活发展历程显示,微信的用户数量增长已经开始呈现乏力趋势。微信在2018年3月日活达到6.89亿人,同比增长5.5%,环比上个月增长1.7%。微信的日活同比增速下滑至20%以下,并在2017年年底下滑至7.7%左右。 微信DAU/MAU的比例也一直较为稳定,从2016年以来一直维持75%-80%左右的比例,用户的粘性极强,继续提升的空间并不大。因此,在整体用户数量开始触达天花板的时候,微信自身也在重新寻求新的增长点。