Files
multitls/README.md

311 lines
10 KiB
Markdown
Raw Permalink Normal View History

2025-10-14 20:06:34 +08:00
# TLS多客户端服务器
这是一个支持多客户端连接的TLS服务器使用C语言实现支持TLS 1.2和1.3协议。
## 功能特性
- ✅ 支持多客户端并发连接最多100个
- ✅ 支持TLS 1.2和1.3协议
- ✅ 动态端口指定
- ✅ 接收客户端消息并计算MD5返回
- ✅ 线程安全的客户端处理
- ✅ 优雅的服务器关闭
## 系统要求
- Linux/Unix系统
- GCC编译器
- OpenSSL开发库
- pthread库
## 安装依赖
### Ubuntu/Debian系统
```bash
make install-deps
```
### CentOS/RHEL系统
```bash
make install-deps-centos
```
## 编译和运行
### 1. 编译项目
```bash
# 使用默认gcc编译器
make all
# 使用指定编译器
CC=clang make all # 使用clang编译器
CC=gcc make all # 使用gcc编译器默认
CC=cc make all # 使用系统默认编译器
# 查看编译器信息
make info
```
### 2. 生成自签名证书
```bash
make cert
```
**注意**: 证书将生成在 `cert/` 目录中:
- `cert/server.key` - 服务器私钥
- `cert/server.crt` - 服务器证书
### 3. 运行服务器
#### 使用默认端口8443
```bash
make run
```
#### 指定端口运行
```bash
make run-port
# 然后输入端口号例如9000
```
#### 直接运行
```bash
./tls_server -p 9000 # 指定端口9000
./tls_server # 使用默认端口8443
./tls_server -h # 显示帮助信息
```
### 4. 测试客户端连接
```bash
make test
```
#### 手动测试客户端
```bash
./tls_client -m "Hello World" # 基本测试
./tls_client -s 1500 # 发送1500字节01数据
./tls_client -m "Hello" -c 5 -i 2 # 循环测试5次间隔2秒
./tls_client -s 2048 -c 3 -i 1 # 发送2048字节01数据循环3次
./tls_client -m "Test" -h 192.168.1.100 -p 9000 # 连接到指定服务器
./tls_client -m "TLS1.2" -t 1.2 # 强制使用TLS 1.2
./tls_client -s 512 -t 1.2 -c 2 -i 1 # 字节数+TLS版本测试
./tls_client -m "TLS1.3" -t 1.3 # 强制使用TLS 1.3
./tls_client -m "Auto" -t auto # 自动协商TLS版本
./tls_client -m "Compare" -C -c 5 # TLS版本对比测试循环5轮
./tls_client -s 1024 -C -c 10 # TLS版本对比测试1024字节10轮
```
## 使用说明
### 服务器端
1. 启动服务器后它会监听指定端口的TLS连接
2. 支持最多100个并发客户端连接
3. 每个客户端连接都会在独立线程中处理
4. 服务器会显示连接状态和TLS版本信息
5. 按Ctrl+C可以优雅地关闭服务器
6. **新增功能**: 带时间戳的详细日志记录
7. **新增功能**: 按IP地址统计连接成功率和耗时
### 命令行参数
```bash
./tls_server -p 9000 # 在端口9000运行
./tls_server # 使用默认端口8443
./tls_server -h # 显示帮助信息
```
### 客户端
1. 连接到TLS服务器
2. 发送消息给服务器
3. 接收服务器计算的MD5哈希值
4. 自动断开连接
5. 支持循环测试,可指定测试次数和间隔
6. 提供详细的测试统计报告
### 客户端参数
```bash
./tls_client -m <消息> 或 -s <字节数> [-h 主机] [-p 端口] [-c 次数] [-i 间隔秒数] [-t TLS版本] [-C]
```
**参数说明:**
- `-m 消息`: 要发送的消息内容
- `-s 字节数`: 要发送的字节数发送01数据最大4095字节
- `-h 主机`: 服务器主机地址(默认: localhost
- `-p 端口`: 服务器端口(默认: 8443
- `-c 次数`: 循环测试次数(默认: 1
- `-i 间隔`: 测试间隔秒数(默认: 1
- `-t 版本`: TLS版本: 1.2, 1.3, auto默认: auto
- `-C`: TLS版本对比模式每轮先测试TLS 1.2等待2秒后测试TLS 1.3
### 测试统计报告
客户端测试完成后会输出详细的统计信息:
```
========================================
测试统计报告
========================================
测试开始时间: Mon Jan 15 10:30:00 2024
测试结束时间: Mon Jan 15 10:30:15 2024
总耗时: 15.00 秒
----------------------------------------
总测试次数: 5
成功次数: 5
失败次数: 0
成功率: 100.00%
----------------------------------------
平均每次测试耗时: 3.00 秒
========================================
✅ 所有测试通过!
```
**统计信息包括:**
- 测试开始和结束时间
- 总耗时
- 总测试次数
- 成功和失败次数
- 成功率
- 平均每次测试耗时
- 失败率(如果有失败)
## 项目结构
```
.
├── tls_server.c # 服务器主程序
├── tls_client.c # 客户端测试程序
├── generate_cert.sh # 证书生成脚本
├── Makefile # 编译配置
├── cert/ # 证书目录
│ ├── server.key # 服务器私钥
│ └── server.crt # 服务器证书
└── README.md # 项目说明
```
## 技术实现
### 服务器端特性
- 使用OpenSSL库实现TLS支持
- 多线程处理客户端连接
- 线程安全的客户端管理
- 支持TLS 1.2和1.3协议
- MD5哈希计算和返回
### 安全特性
- TLS加密传输
- 自签名证书(测试用)
- 客户端证书验证(可配置)
## 示例输出
### 服务器端
```
[2024-01-15 10:30:00] 启动TLS服务器端口: 8443
[2024-01-15 10:30:00] 服务器已启动,等待客户端连接...
[2024-01-15 10:30:00] 支持TLS 1.2和1.3
[2024-01-15 10:30:00] 按Ctrl+C停止服务器
[2024-01-15 10:30:05] 新连接来自: 127.0.0.1:12345
[2024-01-15 10:30:05] 当前活跃连接数: 0/100
[2024-01-15 10:30:05] SSL握手成功IP: 127.0.0.1TLS版本: TLSv1.3
[2024-01-15 10:30:05] 客户端处理线程已创建,当前连接数: 1
[2024-01-15 10:30:05] 新客户端连接IP: 127.0.0.1线程ID: 140123456789套接字: 4
[2024-01-15 10:30:05] 收到客户端消息IP: 127.0.0.1,长度: 11内容: Hello World
[2024-01-15 10:30:05] MD5计算完成IP: 127.0.0.1,结果: b10a8db164e0754105b7a99be72e3fe5
[2024-01-15 10:30:05] 已发送MD5结果给客户端IP: 127.0.0.1
[2024-01-15 10:30:05] 开始清理客户端连接IP: 127.0.0.1,套接字: 4
[2024-01-15 10:30:05] 客户端连接已关闭IP: 127.0.0.1,当前连接数: 0
```
### IP统计报告示例
```
[2024-01-15 10:35:00] IP统计 [127.0.0.1]: 总次数=10, 成功次数=10, 成功率=100.00%, 耗时=300秒
[2024-01-15 10:40:00] IP统计 [192.168.1.100]: 总次数=10, 成功次数=8, 成功率=80.00%, 耗时=600秒
```
### 客户端
```
[2024-01-15 10:30:00] 连接到TLS服务器: localhost:8443
[2024-01-15 10:30:00] 发送消息: Hello World
[2024-01-15 10:30:00] 测试次数: 1, 间隔: 1秒
[2024-01-15 10:30:00] TLS版本: 自动协商
[2024-01-15 10:30:00] 测试开始时间: Mon Jan 15 10:30:00 2024
[2024-01-15 10:30:00] === 测试 1/1 ===
[2024-01-15 10:30:00] TCP连接成功
[2024-01-15 10:30:00] SSL握手成功TLS版本: TLSv1.3
[2024-01-15 10:30:00] 消息已发送 (长度: 11)
[2024-01-15 10:30:00] 收到MD5结果: b10a8db164e0754105b7a99be72e3fe5
[2024-01-15 10:30:00] 连接已关闭
[2024-01-15 10:30:01] ========================================
[2024-01-15 10:30:01] 测试统计报告
[2024-01-15 10:30:01] ========================================
[2024-01-15 10:30:01] 测试开始时间: Mon Jan 15 10:30:00 2024
[2024-01-15 10:30:01] 测试结束时间: Mon Jan 15 10:30:01 2024
[2024-01-15 10:30:01] 总耗时: 1.00 秒
[2024-01-15 10:30:01] ----------------------------------------
[2024-01-15 10:30:01] 总测试次数: 1
[2024-01-15 10:30:01] 成功次数: 1
[2024-01-15 10:30:01] 失败次数: 0
[2024-01-15 10:30:01] 总重试次数: 0
[2024-01-15 10:30:01] 成功率: 100.00%
[2024-01-15 10:30:01] ----------------------------------------
[2024-01-15 10:30:01] 平均每次测试耗时: 1.00 秒
[2024-01-15 10:30:01] ========================================
[2024-01-15 10:30:01] ✅ 所有测试通过!
```
## 故障排除
### 编译错误
- 确保已安装OpenSSL开发库
- 检查GCC版本是否支持C99标准
- **struct timeval错误**: 已添加`#include <sys/time.h>`头文件
- **pthread错误**: 确保链接pthread库 (`-lpthread`)
### 编译器支持
- **默认编译器**: gcc
- **支持编译器**: gcc, clang, cc
- **编译器参数**: 使用`CC=编译器名 make all`指定编译器
- **编译器信息**: 使用`make info`查看当前编译器设置
### 连接错误
- 确保端口未被占用
- 检查防火墙设置
- 验证证书文件是否存在
### SSL错误处理
- **SSL读取错误: 1**: 通常是客户端关闭连接导致,已改进错误处理
- **消息截断警告**: 当消息长度接近4KB时会显示警告
- **客户端立即关闭**: 客户端现在会等待服务器响应后再关闭连接
- **SSL系统调用错误**: 改进了SSL_ERROR_SYSCALL错误处理防止服务器异常退出
- **连接清理**: 所有SSL错误都会正确清理连接资源
### 多客户端连接问题
- **服务器卡住**: 已添加线程分离和超时机制
- **连接数统计**: 服务器会显示当前活跃连接数
- **资源清理**: 改进了客户端连接清理逻辑
- **线程管理**: 使用pthread_detach自动回收线程资源
### 日志功能
- **时间戳日志**: 所有日志都带有精确的时间戳
- **IP统计**: 按IP地址统计连接成功率和耗时
- **统计报告**: 每10次连接自动生成统计报告
- **详细记录**: 记录连接、SSL握手、消息处理等全过程
### 客户端日志功能
- **时间戳日志**: 客户端所有操作都带有时间戳
- **测试统计**: 显示测试次数、成功/失败次数、成功率
- **性能监控**: 记录每次测试的耗时和平均耗时
- **详细记录**: 记录连接建立、SSL握手、消息发送/接收等全过程
- **重试机制**: 连接失败时自动重试3次使用指数退避策略2秒、4秒、8秒
- **重试统计**: 统计总重试次数,重试成功不计入失败
- **超时保护**: 套接字读写操作30秒超时防止客户端卡住
### 性能优化
- 调整MAX_CLIENTS常量以支持更多连接
- 修改BUFFER_SIZE以适应更大的消息
- 考虑使用连接池优化资源使用
## 许可证
本项目仅用于学习和测试目的。