# 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.1,TLS版本: 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 `头文件 - **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以适应更大的消息 - 考虑使用连接池优化资源使用 ## 许可证 本项目仅用于学习和测试目的。