# Phase 3 大文件测试报告 **测试时间**:2026-06-17 20:03 **测试工具**:OpenSSH sftp client **测试环境**:MarkBaseSSH server (port 2024) **测试用户**:demo (password: demo123) --- ## ⚠️ 发现严重问题:SSH packet 大小超过 client maxpack 限制 ### 问题症状 **测试 5MB 文件上传**: - ✅ SSH server 稳定运行(没有崩溃) - ❌ 上传文件大小:2.0MB(应该是 5.0MB) - ❌ 下载文件大小:0B - ❌ MD5 校验失败 **OpenSSH client 报告**: ``` channel 0: rcvd big packet 32781, maxpack 32768 ``` **SSH server 日志**: ``` [2026-06-17T12:03:32Z INFO] Building SSH_MSG_CHANNEL_DATA: channel=0, data_len=32781 [2026-06-17T12:03:32Z INFO] Sent SSH_MSG_CHANNEL_DATA (SFTP response) ``` --- ### 根本原因分析 ⭐⭐⭐⭐⭐ **问题**:SSH server 发送的 packet 大小超过了 client 的 maxpack 限制(32768 bytes) **违反协议**: - RFC 4254 Section 5.3:SSH_MSG_CHANNEL_DATA packet 大小不应超过 client 的 maximum packet size - OpenSSH channels.h:`c->local_maxpacket` 默认 32768 bytes **可能触发场景**: 1. **SSH_FXP_READDIR**:一次性返回太多文件信息 2. **SSH_FXP_DATA**:一次性返回太多数据(超过 32KB) --- ### 影响 ⭐⭐⭐⭐⭐ **严重性**:⭐⭐⭐⭐⭐ **极高** **影响范围**: - ❌ 大文件传输失败(>32KB) - ❌ 目录浏览失败(目录包含太多文件) - ❌ SFTP 功能受限 **用户体验**: - ❌ 无法上传/下载大文件 - ❌ 无法浏览大目录 - ❌ 文件完整性无法保证 --- ### 建议修复方案 ⭐⭐⭐⭐⭐ #### Phase 4: SSH packet size限制修复 **任务 1**:添加 maxpack 字段到 Channel 结构 ```rust pub struct Channel { // ⭐⭐⭐⭐⭐ Phase 4: 添加 client maxpack 限制 client_maxpacket: u32, // 来自 SSH_MSG_CHANNEL_OPEN_CONFIRMATION } ``` **任务 2**:SSH_FXP_READDIR 分块返回 ```rust // 限制每次返回的文件数量,确保 packet 不超过 maxpack let max_files_per_packet = (client_maxpacket - 50) / 100; // 约 320 个文件 ``` **任务 3**:SSH_FXP_DATA 分块返回 ```rust // 限制每次返回的数据大小,确保 packet 不超过 maxpack let max_data_per_packet = client_maxpacket - 50; // 约 32KB ``` **任务 4**:SSH_MSG_CHANNEL_DATA packet 大小检查 ```rust // 在发送 SSH_MSG_CHANNEL_DATA 前,检查 packet 大小 if packet_size > client_maxpacket { warn!("Packet size {} exceeds client maxpack {}", packet_size, client_maxpacket); // 分块发送或拒绝 } ``` --- ### 测试结果记录 ⚠️⚠️⚠️⚠️⚠️ | 文件大小 | 上传结果 | 下载结果 | MD5校验 | SSH server 状态 | |---------|---------|---------|---------|----------------| | **5MB** | ❌ 2.0MB (不完整) | ❌ 0B | ❌ 失败 | ✅ 稳定 | | **10MB** | ⏳ 未测试 | ⏳ 未测试 | ⏳ 未测试 | ✅ 稳定 | | **50MB** | ⏳ 未测试 | ⏳ 未测试 | ⏳ 未测试 | ✅ 稳定 | | **100MB** | ⏳ 未测试 | ⏳ 未测试 | ⏳ 未测试 | ✅ 稳定 | --- ### 下一步行动 ⭐⭐⭐⭐⭐ **优先级**:⭐⭐⭐⭐⭐ **最高优先级** **Phase 4**:SSH packet size 限制修复(必须立即实施) 1. 添加 client maxpack 字段 2. 修复 SSH_FXP_READDIR(分块返回) 3. 修复 SSH_FXP_DATA(分块返回) 4. 添加 packet 大小检查机制 **预计工作量**: - 代码修改:约 200 行 - 测试验证:约 30 分钟 - 总时间:约 1 小时 --- ## 测试清理 ```bash # 清理测试文件 rm -f /tmp/test_5mb.bin /tmp/upload_5mb.bin /tmp/download_5mb.bin rm -f /tmp/test_10mb.bin /tmp/test_50mb.bin /tmp/test_100mb.bin # 停止 SSH server pkill -9 -f "markbase-core ssh-start" ``` --- **最后更新**:2026-06-17 20:03 **发现问题**:SSH packet 大小超过 client maxpack 限制 ⭐⭐⭐⭐⭐ **下一步**:Phase 4 立即修复(最高优先级)