18. 使用JPerf工具测试网速

您所在的位置:网站首页 网络怎么测试速度 18. 使用JPerf工具测试网速

18. 使用JPerf工具测试网速

2024-03-14 02:44| 来源: 网络整理| 查看: 265

18. 使用JPerf工具测试网速¶ 18.1. iPerf与JPerf¶

在讲解网络测速之前,我们先来了解一下测速的工具:iPerf是一个跨平台的网络性能测试工具,它支持Win/Linux/Mac/Android/iOS等平台,iPerf可以测试TCP和UDP(我们一般不对UDP进行测速)带宽质量,iPerf可以测量最大TCP带宽,可以具有多种参数进行测试,同时iPerf还可以报告带宽,延迟抖动和数据包丢失的情况,我们可以利用iPerf的这些特性来测试一些网络设备如路由器,防火墙,交换机等的性能。

虽然iPerf很好用,但是它却是命令行格式的软件,对使用测试的人员并不友好,使用者需要记下他繁琐的命令,不过它还有一个图形界面程序叫做JPerf,使用JPerf程序能简化了复杂命令行参数的构造,而且 它还保存测试结果,并且将测试结果实时图形化出来,更加一目了然,当然,JPerf也肯定拥有iPerf的所有功能。

18.2. 测试网络速度¶ 18.2.1. 获取JPerf网络测速工具¶

在测速之前,我们需要得到网络测速工具,在我们的论坛上有这个工具,然后,我们直接下载即可:http://www.firebbs.cn/forum.php?mod=viewthread&tid=26274&fromuid=37393。

下载后解压,双击jperf.bat运行,稍等一会就出现JPerf的界面,具体见 图18_1。

图 18‑1JPerf界面

我们来讲解一下这个界面的一些内容:

图 18‑1(1):客户端设置,电脑作为客户端,连接到服务器中(即我们的开发板作为服务器), 服务器地址需要填写正确,端口号默认是5001,并发流默认是1个。

图 18‑1(2):服务器设置,电脑作为服务器,我们的开发板作为客户端,client limit选项表示仅允许指定客户端连接,Num Connections指定最大允许连接的数量,为0不限制。

图 18‑1(3):开始和停止JPerf的运行。

图 18‑1(4):兼容旧版本(当server端和client端版本不一样时使用),默认不勾选,Transmit设置测试模式, 我们一般指定发送的时间,以秒为单位,当然也可以指定发送的数据大小,以字节为单位。

图 18‑1(5):如果勾选Dual表示同时进行双向传输测试,如果勾选Trade表示单独进行双向传输测试,默认不勾选。

图 18‑1(6):指定需要传输的文件以及显示最大TCP报文段。

图 18‑1(7):传输层设置,我们一般用来测试TCP连接的速度,Buffer Length选项用于设置缓冲区大小,TCP Window Size用于指定TCP窗口大小,Max Segment Size用于设定最大MTU值,TCP No Delay用于设定TCP不延时。

图 18‑1(8):网速显示窗口,以折线图的形式显示出来。

图 18‑1(9):网速相关数据输出窗口,以文本的形式。

18.2.2. 测试开发板接收速度(NETCONN API)¶

首先,我们肯定需在开发板上开发程序的,那么我们就单独创建一个iPerf测速线程,在开发板上运行,开发板作为客户端,不断监听客户端(JPerf上位机)的连接。

代码实现部分:我们首先拷贝一个移植好的工程,并且在工程中添加两个文件,分别为ipref.c和ipref.h, 然后在ipref.c文件下添加 代码清单18_1 中的代码,其实这个代码跟TCP服务器实验的代码都是差不多的, 只不过接收到数据不进行处理而已,在ipref.h文件下添加 代码清单18_2 中的代码。

代码清单 18‑1ipref.c文件内容

/* FreeRTOS头文件 */ #include "FreeRTOS.h" #include "task.h" #include "queue.h" #include "semphr.h" #include #include #include #include "iperf.h" #include "lwip/opt.h" #include "lwip/sys.h" #include "lwip/api.h" #define IPERF_PORT 5001 #define IPERF_BUFSZ (4 * 1024) void iperf_server(void *thread_param) { struct netconn *conn, *newconn; err_t err; void* recv_data; recv_data = (void *)pvPortMalloc(IPERF_BUFSZ); if (recv_data == NULL) { printf("No memory\n"); } conn = netconn_new(NETCONN_TCP); netconn_bind(conn, IP_ADDR_ANY, 5001); LWIP_ERROR("tcpecho: invalid conn", (conn != NULL), return;); /* Tell connection to go into listening mode. */ netconn_listen(conn); while (1) { /* Grab new connection. */ err = netconn_accept(conn, &newconn); /*printf("accepted new connection %p\n", newconn);*/ /* Process the new connection. */ if (err == ERR_OK) { struct netbuf *buf; // void *data; u16_t len; while ((err = netconn_recv(newconn, &buf)) == ERR_OK) { /*printf("Recved\n");*/ do { netbuf_data(buf, &recv_data, &len); // err = netconn_write(newconn, data, len, NETCONN_COPY); } while (netbuf_next(buf) >= 0); netbuf_delete(buf); } /*printf("Got EOF, looping\n");*/ /* Close connection and discard connection identifier. */ netconn_close(newconn); netconn_delete(newconn); } } } void iperf_server_init(void) { sys_thread_new("iperf_server", iperf_server, NULL, 2048, 4); }

代码清单 18‑2ipref.h文件内容

#ifndef LWIP_IPERF_H #define LWIP_IPERF_H #define TCP_SERVER_THREAD_NAME "iperf_server" #define TCP_SERVER_THREAD_STACKSIZE 1024 #define TCP_SERVER_THREAD_PRIO 4 void iperf_server(void *thread_param); void iperf_server_init(void);

在main.c文件中将iperf_server_init()调用一下即可。并且配置好开发板的IP地址与端口号,我们打开JPerf测速软件, 配置好要连接的服务器IP地址与端口,测试时间设置得长一点,我们使用10000秒,然后点击开始,就得到我们需要的网速数据, 速度高达94Mbps,即11.5M字节/秒,已经是非常高的速度了,而且通过折线图,我们也能看到这速度是很稳定的,具体见 图18_2。

图 18‑2NETCONN API接收速度

18.2.3. 测试开发板接收速度(Socket API)¶

这个实验我们只需要把上一个实验中的ipref.c文件内容替换掉就行了,具体见 代码清单18_3。

代码清单 18‑3ipref.c文件内容

/* FreeRTOS头文件 */ #include "FreeRTOS.h" #include "task.h" #include "queue.h" #include "semphr.h" #include #include //#include #include //#include //#include "netdb.h" #include "iperf.h" #include "lwip/opt.h" #include "lwip/sys.h" #include "lwip/api.h" #define IPERF_PORT 5001 #define IPERF_BUFSZ (4 * 1024) void iperf_server(void *thread_param) { uint8_t *recv_data; socklen_t sin_size; uint32_t tick1, tick2; int sock = -1, connected, bytes_received; uint64_t recvlen; struct sockaddr_in server_addr, client_addr; char speed[32] = { 0 }; fd_set readset; struct timeval timeout; recv_data = (uint8_t *)pvPortMalloc(IPERF_BUFSZ); if (recv_data == NULL) { printf("No memory\n"); goto __exit; } sock = socket(AF_INET, SOCK_STREAM, 0); if (sock = 0) closesocket(connected); connected = -1; } __exit: if (sock >= 0) closesocket(sock); if (recv_data) free(recv_data); } void iperf_server_init(void) { sys_thread_new("iperf_server", iperf_server, NULL, 2048, 4); }

然后得到数据,对比数据,我们发现,NETCONN API的效率是比Socket API的效率更高,这是因为Socket API需要对数据进行拷贝,才能传递到上层应用中,不过71Mbps(8.7M字节/秒)的速度已经是算很高了,具体见 图18_3。

图 18‑3Socket API接收速度

18.2.4. 测试开发板发送速度(NETCONN API)¶

测完两种API的接收速度,那么就来测试一下开发板的发送速度,发送速度其实是更加重要的,比如开发板采集一些图像,想要发送出去,如果发送速度跟不上的话,传输出去的图像就会卡帧,而发送速度足够快,就会很流畅,我们测试发送速度将开发板作为客户端,JPerf软件则作为服务器,我们开发板向服务器发送数据。首先我们也是把移植好的工程拿过来,并且添加两个文件,分别为iperf_client.c和iperf_client.h,然后在对应的文件中添加所示的代码

代码清单 18‑4iperf_client.c文件内容

#include "iperf_client.h" #include "lwip/opt.h" #include "lwip/sys.h" #include "lwip/api.h" #define IPERF_PORT 5001 #define IPERF_BUFSZ (4 * 1024) static void iperf_client(void *thread_param) { struct netconn *conn; int i; int ret; uint8_t *send_buf; uint64_t sentlen; u32_t tick1, tick2; ip4_addr_t ipaddr; send_buf = (uint8_t *) pvPortMalloc(IPERF_BUFSZ); if (!send_buf) return ; for (i = 0; i = configTICK_RATE_HZ * 5) { float f; f = (float)(sentlen*configTICK_RATE_HZ/125/(tick2 - tick1)); f /= 1000.0f; printf("send speed = %.4f Mbps!\n", f); tick1 = tick2; sentlen = 0; } ret = netconn_write(conn,send_buf,IPERF_BUFSZ,0); if (ret == ERR_OK) { sentlen += IPERF_BUFSZ; } } // netconn_close(conn); // netconn_delete(conn); } } void iperf_client_init(void) { sys_thread_new("iperf_client", iperf_client, NULL, 2048, 4); }

代码清单 18‑5iperf_client.h文件内容

#ifndef IPERF_CLIENT_H #define IPERF_CLIENT_H void iperf_client_init(void); #endif /* IPERF_CLIENT_H */

在main.c文件中调用iperf_client_init()函数即可,然后配置JPerf软件成为客户端,让开发板进行连接, 开发板连接的客户端IP地址与端口号根据实际情况去配置即可,具体见 图18_4,从实验现象可以看出, 发送的速度还是很快的(94Mbps,即11.5M字节/秒)而且还很稳定。

图 18‑4NETCONN API发送速度

18.2.5. 测试开发板发送速度(Socket API)¶

本实验基于是一个实验,我们将测试开发板发送速度(NETCONN API)的工程拿过来,将iperf_client.c的内容替换代码清单 18‑6所示的代码即可。

代码清单 18‑6iperf_client.c文件内容

#include "iperf_client.h" #include "lwip/opt.h" #include "lwip/sys.h" #include "lwip/api.h" #include #define PORT 5001 #define IP_ADDR "192.168.0.181" #define IPERF_BUFSZ (4 * 1024) static void iperf_client(void *thread_param) { int sock = -1,i; struct sockaddr_in client_addr; uint8_t* send_buf; u32_t tick1, tick2; uint64_t sentlen; send_buf = (uint8_t *) pvPortMalloc(IPERF_BUFSZ); if (!send_buf) return ; for (i = 0; i = configTICK_RATE_HZ * 5) { float f; f = (float)(sentlen*configTICK_RATE_HZ/125/(tick2 - tick1)); f /= 1000.0f; printf("send speed = %.4f Mbps!\n", f); tick1 = tick2; sentlen = 0; } if (write(sock,send_buf,IPERF_BUFSZ)


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3