iPerf 与JPerf
在讲解网络测速之前,我们先来了解一下测速的工具:iPerf 是一个跨平台的网络性能测试工具,它支持Win/Linux/Mac/Android/iOS 等平台,iPerf 可以测试TCP 和UDP(我们一般不对UDP 进行测速)带宽质量,iPerf 可以测量最大TCP 带宽,可以具有多种参数进行测试,同时iPerf 还可以报告带宽,延迟抖动和数据包丢失的情况,我们可以利用iPerf 的这些特性来测试一些网络设备如路由器,防火墙,交换机等的性能。
虽然iPerf 很好用,但是它却是命令行格式的软件,对使用测试的人员并不友好,使用者需要记下他繁琐的命令,不过它还有一个图形界面程序叫做JPerf,使用JPerf 程序能简化了复杂命令行参数的构造,而且它还保存测试结果,并且将测试结果实时图形化出来,更加一目了然,当然,JPerf 也肯定拥有iPerf 的所有功能。
测试网络速度
获取JPerf 网络测速工具
在测速之前,我们需要得到网络测速工具,在我们的论坛上有这个工具,然后,我们直接下载即可:http://www.firebbs.cn/forum.php?mod=viewthread&tid=26274&fromuid=37393。
下载后解压,双击jperf.bat 运行,稍等一会就出现JPerf 的界面,具体见图。

图JPerf 界面
我们来讲解一下这个界面的一些内容:
- 图(1):客户端设置,电脑作为客户端,连接到服务器中(即我们的开发板作为服务器),服
务器地址需要填写正确,端口号默认是5001,并发流默认是1 个。 - 图(2):服务器设置,电脑作为服务器,我们的开发板作为客户端,client limit 选项表示仅允许指定客户端连接,Num Connections 指定最大允许连接的数量,为0 不限制。
- 图(3):开始和停止JPerf 的运行。
- 图(4):兼容旧版本(当server 端和client 端版本不一样时使用),默认不勾选,Transmit 设置测试模式,我们一般指定发送的时间,以秒为单位,当然也可以指定发送的数据大小,以字节为单位。
- 图(5):如果勾选Dual 表示同时进行双向传输测试,如果勾选Trade 表示单独进行双向传输测试,默认不勾选。
- 图(6):指定需要传输的文件以及显示最大TCP 报文段。
- 图(7):传输层设置,我们一般用来测试TCP 连接的速度,Buffer Length 选项用于设置缓冲区大小,TCP Window Size 用于指定TCP 窗口大小,Max Segment Size 用于设定最大MTU 值,TCP No Delay 用于设定TCP 不延时。
- 图(8):网速显示窗口,以折线图的形式显示出来。
- 图(9):网速相关数据输出窗口,以文本的形式。
测试开发板接收速度(NETCONN API)
首先,我们肯定需在开发板上开发程序的,那么我们就单独创建一个iPerf 测速线程,在开发板上运行,开发板作为客户端,不断监听客户端(JPerf 上位机)的连接。
代码实现部分:我们首先拷贝一个移植好的工程,并且在工程中添加两个文件,分别为ipref.c 和ipref.h,然后在ipref.c 文件下添加代码清单 中的代码,其实这个代码跟TCP 服务器实验的代码都是差不多的,只不过接收到数据不进行处理而已,在ipref.h 文件下添加代码清单 中的代码。
代码清单 ipref.c 文件内容
/* FreeRTOS 头文件*/
#include "FreeRTOS.h"
#include "task.h"
#include "queue.h"
#include "semphr.h"
#include <stdint.h>
#include <stdio.h>
#include <lwip/sockets.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)
{
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);
}
代码清单 ipref.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

文章介绍了iPerf和JPerf这两个网络测速工具,用于测试TCP带宽、延迟和丢包情况。JPerf作为iPerf的图形化界面,简化了命令行操作。文章通过实例演示了如何使用JPerf测试开发板的接收和发送速度,比较了NETCONNAPI和SocketAPI的效率。最后,讨论了如何优化LwIP网络传输速度,包括调整内存堆大小、TCP缓冲区配置等。
4457

被折叠的 条评论
为什么被折叠?



