kcptun-rust 1.1.0

A Rust implementation of kcptun, a fast and reliable tunnel based on KCP protocol
Documentation
# kcptun-rust 测试指南

本文档介绍如何测试 kcptun-rust 客户端和服务端的功能。

## 快速测试

### 1. 基础功能测试(推荐)

运行简单测试脚本,检查二进制文件和基本功能:

```bash
./test_simple.sh
```

这个脚本会检查:
- ✅ 二进制文件是否存在
- ✅ 帮助信息是否正常
- ✅ 版本信息是否正确
- ✅ 配置文件是否存在
- ✅ 错误处理是否正常

### 2. 完整连接测试

运行完整测试脚本,测试客户端和服务端的实际连接:

```bash
./test.sh
```

这个脚本会:
1. 启动一个 HTTP 服务器作为目标(端口 8080)
2. 启动 kcptun 服务端(端口 29900)
3. 启动 kcptun 客户端(端口 12948)
4. 通过隧道发送 HTTP 请求测试连接
5. 检查进程状态和日志

**注意**:测试完成后按 `Ctrl+C` 停止所有进程。

## 手动测试

### 方法 1: 使用三个终端窗口

**终端 1 - 启动目标服务器:**
```bash
# 启动一个简单的 HTTP 服务器
python3 -m http.server 8080
```

**终端 2 - 启动 kcptun 服务端:**
```bash
./target/release/kcptun-server \
  --listen :29900 \
  --target 127.0.0.1:8080 \
  --key "test-key-12345678" \
  --crypt aes
```

**终端 3 - 启动 kcptun 客户端:**
```bash
./target/release/kcptun-client \
  --localaddr :12948 \
  --remoteaddr 127.0.0.1:29900 \
  --key "test-key-12345678" \
  --crypt aes
```

**测试连接:**
```bash
# 在另一个终端测试
curl http://127.0.0.1:12948/
```

如果看到 HTML 内容,说明连接成功!

### 方法 2: 使用配置文件

**创建测试配置:**

`test-server.json`:
```json
{
  "listen": ":29900",
  "target": "127.0.0.1:8080",
  "key": "test-key-12345678",
  "crypt": "aes",
  "mode": "fast",
  "quiet": false
}
```

`test-client.json`:
```json
{
  "localaddr": ":12948",
  "remoteaddr": "127.0.0.1:29900",
  "key": "test-key-12345678",
  "crypt": "aes",
  "mode": "fast",
  "quiet": false
}
```

**启动服务:**
```bash
# 终端 1
python3 -m http.server 8080

# 终端 2
./target/release/kcptun-server -c test-server.json

# 终端 3
./target/release/kcptun-client -c test-client.json
```

## 测试不同加密算法

### 测试 AES-128(默认)
```bash
# 服务端
./target/release/kcptun-server --crypt aes --key "test123"

# 客户端
./target/release/kcptun-client --crypt aes --key "test123"
```

### 测试 SM4 国密算法
```bash
# 服务端
./target/release/kcptun-server --crypt sm4 --key "test123"

# 客户端
./target/release/kcptun-client --crypt sm4 --key "test123"
```

### 测试 Salsa20
```bash
# 服务端
./target/release/kcptun-server --crypt salsa20 --key "test123"

# 客户端
./target/release/kcptun-client --crypt salsa20 --key "test123"
```

### 测试不加密(仅用于测试)
```bash
# 服务端
./target/release/kcptun-server --crypt none --key "test123"

# 客户端
./target/release/kcptun-client --crypt none --key "test123"
```

## 性能测试

### 使用 iperf3 测试带宽

**在目标机器上启动 iperf3 服务端:**
```bash
iperf3 -s -p 5001
```

**通过 kcptun 隧道测试:**
```bash
# 配置 kcptun 客户端连接到 iperf3 服务器
# 然后运行:
iperf3 -c 127.0.0.1 -p 12948
```

### 使用 curl 测试延迟

```bash
# 测试延迟
time curl -o /dev/null -s http://127.0.0.1:12948/

# 测试多次请求
for i in {1..10}; do
  time curl -o /dev/null -s http://127.0.0.1:12948/
done
```

## Rust 单元测试

运行 Rust 单元测试:

```bash
# 运行所有测试
cargo test

# 运行集成测试(需要手动启动服务)
cargo test --test integration_test

# 运行特定测试
cargo test test_binary_exists
```

## 诊断工具

如果遇到连接问题,可以使用诊断脚本:

```bash
./diagnose.sh
```

这个脚本会检查:
- kcptun 进程状态
- 端口监听状态
- 日志文件内容
- 连接测试
- 配置建议

## 常见问题排查

### 1. HTTP 请求被代理拦截

如果看到 Privoxy 或其他代理错误,在 curl 命令中使用 `--noproxy "*"`:

```bash
curl --noproxy "*" http://127.0.0.1:12948/
```

### 2. 端口被占用

如果看到 "address already in use" 错误:

```bash
# 检查端口占用
lsof -i :29900  # 服务端端口
lsof -i :12948  # 客户端端口
lsof -i :8080   # 目标服务器端口

# 杀死占用进程
kill -9 <PID>
```

### 2. 连接失败

检查以下几点:
- ✅ 服务端和客户端使用相同的密钥(`--key`- ✅ 服务端和客户端使用相同的加密算法(`--crypt`- ✅ 客户端 `--remoteaddr` 指向正确的服务端地址
- ✅ 防火墙没有阻止 UDP 连接

### 3. 查看详细日志

去掉 `--quiet` 参数查看详细日志:

```bash
./target/release/kcptun-server --listen :29900 --target 127.0.0.1:8080 --key test123
```

### 4. 测试配置文件

验证配置文件格式是否正确:

```bash
# 检查 JSON 格式
cat client.json | python3 -m json.tool

# 或者使用 jq(如果已安装)
cat client.json | jq .
```

## 测试检查清单

- [ ] 二进制文件可以正常启动
- [ ] 帮助信息显示正常
- [ ] 版本信息正确
- [ ] 服务端可以监听端口
- [ ] 客户端可以连接到服务端
- [ ] 数据可以通过隧道正常传输
- [ ] 不同加密算法都能正常工作
- [ ] 配置文件可以正常加载
- [ ] 错误处理正常(如密钥不匹配)

## 自动化测试

可以创建 CI/CD 测试脚本:

```bash
#!/bin/bash
# ci_test.sh

set -e

echo "Building..."
cargo build --release

echo "Running simple tests..."
./test_simple.sh

echo "All tests passed!"
```

## 性能基准测试

记录性能数据用于对比:

```bash
# 测试脚本
./benchmark.sh > benchmark_results.txt
```

比较不同配置的性能:
- 不同加密算法的影响
- 不同速度模式的影响
- 不同 MTU 设置的影响
- 不同窗口大小的影响

---

**提示**:测试时建议使用 `--quiet` 参数减少日志输出,专注于功能测试。