Files
multitls/README.md
huanglinhuan dbb413b49d first commit
2025-10-14 20:06:34 +08:00

311 lines
10 KiB
Markdown
Executable File
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 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以适应更大的消息
- 考虑使用连接池优化资源使用
## 许可证
本项目仅用于学习和测试目的。