Phase 3: Large file test report - Critical issue discovered
Some checks failed
Test / test (push) Has been cancelled
Test / build (push) Has been cancelled

- 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
This commit is contained in:
Warren
2026-06-17 20:05:18 +08:00
parent 1b0105accf
commit e221f86031

View File

@@ -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.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 立即修复(最高优先级)