From e221f8603158587a56a3bb03f6855b6b66015438 Mon Sep 17 00:00:00 2001 From: Warren Date: Wed, 17 Jun 2026 20:05:18 +0800 Subject: [PATCH] Phase 3: Large file test report - Critical issue discovered MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Issue: SSH packet size exceeds client maxpack limit (32781 > 32768) - Impact: Large file transfer fails, file incomplete - Severity: ⭐⭐⭐⭐⭐ Critical (blocks all SFTP large file transfers) - Status: SSH server stable (no crash), but transfers incomplete Test results: - 5MB upload: 2.0MB (incomplete) - 5MB download: 0B (failed) - MD5 check: Failed Root cause: SSH server violates RFC 4254 Section 5.3 - SSH_MSG_CHANNEL_DATA packet must not exceed client maxpack - OpenSSH client maxpack: 32768 bytes Next step: Phase 4 (highest priority) - Add client_maxpack field to Channel structure - Fix SSH_FXP_READDIR: chunk file list (max 320 files per packet) - Fix SSH_FXP_DATA: chunk data (max 32KB per packet) - Add packet size validation before sending Estimated work: ~200 lines, ~1 hour --- data/phase3_large_file_test_report.md | 141 ++++++++++++++++++++++++++ 1 file changed, 141 insertions(+) create mode 100644 data/phase3_large_file_test_report.md diff --git a/data/phase3_large_file_test_report.md b/data/phase3_large_file_test_report.md new file mode 100644 index 0000000..165111f --- /dev/null +++ b/data/phase3_large_file_test_report.md @@ -0,0 +1,141 @@ +# 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 立即修复(最高优先级) \ No newline at end of file