# <span id="iperf3"/>iperf3

iperf3 是用于执行网络吞吐量测量的工具。 它可以测试 TCP、UDP 或 SCTP 吞吐量。 要执行 iperf3 测试，用户必须建立服务器和客户端。测试完成后提供详细的测试报告。

## 语法说明

```
Usage: iperf3 [-s|-c host] [options]
       iperf3 [-h|--help] [-v|--version]
```

## 常用参数选项介绍

- `-s, --server`：启动iperf3服务器。
- `-c, --client <host>`：运行iperf3客户端，并连接到指定的服务器。
- `-p, --port <端口号>`：指定服务器端口。
- `-t, --time <数字>`：指定传输测试的持续时间（以秒为单位），`iperf3`在指定的时间内，重复的发送指定长度的数据包，（默认 10 秒）。
- `-i, --interval <数字>`： 设置每次报告之间的时间间隔，单位为秒，如果设置为非零值，就会按照此时间间隔输出测试报告，默认值为零。
- `-f, --format <报告格式>`：设置报告的格式，可选值包括Kbits、Mbits、Gbits、Tbits等。
- `-u, --udp`：使用 UDP 而不是 TCP。
- `-w, --window <size>`： 设置套接字缓冲区为指定大小，对于TCP方式，此设置为TCP窗口大小，对于UDP方式，此设置为接受UDP数据包的缓冲区大小，限制可以接受数据包的最大值。
- `--logfile`：将输出的测试结果储存至文件中
- `-J, --json`：输出JSON格式测试结果。
- `-R, --reverse`：反向测试，客户端作为接收端，服务器作为发送端。如果需要测试下载速度，则在Client侧使用-R参数即可。
- `-h, --help`：显示帮助信息。

可以执行 `iperf3 -h` 命令，了解更多参数选项。

## <span id="iperf_result"/>测试结果分析

客户端连接服务端成功后，会自动开始进行测试，两端都会输出相应的测试结果信息。

服务端输出结果包含：**[ ID] Interval           Transfer     Bandwidth**

**各字段含义：**

- **[ ID]**：标识测试的流ID。每个测试流都被分配一个唯一的ID，用于区分不同的数据流。通过这个ID，你可以跟踪特定流的性能表现。
- **Interval**：指示`iperf3`报告的时间间隔。`iperf3`的`-i`选项设置报告间隔，而Interval字段表示每个报告的时间间隔。
- **Transfer**：传输的数据量。这是指在特定的时间间隔内通过测试流传输的数据量，以字节（KBytes，MBytes等）为单位。
- **Bandwidth/Bitrate**：带宽，表示在特定的时间间隔内的平均传输速率。通常以Kbits/s或Mbits/s为单位，表示每秒传输的比特数。这个值用于衡量网络连接的速度和性能。

例如：

```
iperf3 -s -p 5002
-----------------------------------------------------------
Server listening on 5002
-----------------------------------------------------------
Accepted connection from 192.168.1.10, port 44764
[  5] local 192.168.1.195 port 5002 connected to 192.168.1.10 port 44766
[ ID] Interval           Transfer     Bandwidth
[  5]   0.00-1.00   sec   109 MBytes   917 Mbits/sec
[  5]   1.00-2.00   sec   112 MBytes   942 Mbits/sec
[  5]   2.00-3.00   sec   113 MBytes   949 Mbits/sec
```

客户端输出结果包含：**[ ID] Interval           Transfer     Bitrate         Retr  Cwnd**

**各字段含义：**

- **[ ID]**：标识测试的流ID。每个测试流都被赋予一个唯一的ID，用于区分不同的数据流。
- **Interval**：测试的时间间隔。`iperf3`的`-i`选项设置报告间隔，Interval字段指示这些结果的时间间隔。
- **Transfer**：传输的数据量。以字节（Bytes）为单位，表示在测试期间通过网络传输的数据量。
- **Bitrate**：比特率，表示在测试期间的平均传输速率。通常以Kbits/s或Mbits/s为单位，表示每秒传输的比特数。
- **Retr**：重传次数。表示在传输过程中发生的数据包重传的次数。较高的重传次数可能表明网络有问题或存在拥塞。
- **Cwnd**：拥塞窗口大小。表示TCP拥塞控制算法中的窗口大小，即在不收到确认时允许发送的数据量。这个值的变化可以反映网络拥塞的情况。

例如：

```
iperf3 -c 192.168.1.195 -i 1 -t 600 -p 5002
Connecting to host 192.168.1.195, port 5002
[  5] local 192.168.1.10 port 44766 connected to 192.168.1.195 port 5002
[ ID] Interval           Transfer     Bitrate         Retr  Cwnd
[  5]   0.00-1.00   sec   113 MBytes   946 Mbits/sec    0    227 KBytes       
[  5]   1.00-2.00   sec   113 MBytes   948 Mbits/sec    0    227 KBytes       
[  5]   2.00-3.00   sec   113 MBytes   948 Mbits/sec    0    227 KBytes
```

## 使用示例

- 启动iperf3服务器：

```
iperf3 -s
```

- 连接到iperf3服务器：

```
iperf3 -c <host>
iperf3 -c <host> -p 5002
```

- 指定测试时间为30秒：

```
iperf3 -c <host> -t 30
```

- 执行UDP模式测试，设置带宽为10Mbits/s：

```
iperf3 -c <host> -u -b 10M
```

- 以反向模式进行测试：

```
iperf3 -c <host> -R
```
