Files
markbase/data/phase3_large_file_test_report.md
Warren e221f86031
Some checks failed
Test / test (push) Has been cancelled
Test / build (push) Has been cancelled
Phase 3: Large file test report - Critical issue discovered
- 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
2026-06-17 20:05:18 +08:00

141 lines
3.8 KiB
Markdown
Raw 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.
# 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.3SSH_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 立即修复(最高优先级)