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
This commit is contained in:
141
data/phase3_large_file_test_report.md
Normal file
141
data/phase3_large_file_test_report.md
Normal 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.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 立即修复(最高优先级)
|
||||
Reference in New Issue
Block a user