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

3.8 KiB
Raw Blame History

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.hc->local_maxpacket 默认 32768 bytes

可能触发场景

  1. SSH_FXP_READDIR:一次性返回太多文件信息
  2. SSH_FXP_DATA:一次性返回太多数据(超过 32KB

影响

严重性 极高

影响范围

  • 大文件传输失败(>32KB
  • 目录浏览失败(目录包含太多文件)
  • SFTP 功能受限

用户体验

  • 无法上传/下载大文件
  • 无法浏览大目录
  • 文件完整性无法保证

建议修复方案

Phase 4: SSH packet size限制修复

任务 1:添加 maxpack 字段到 Channel 结构

pub struct Channel {
    // ⭐⭐⭐⭐⭐ Phase 4: 添加 client maxpack 限制
    client_maxpacket: u32,  // 来自 SSH_MSG_CHANNEL_OPEN_CONFIRMATION
}

任务 2SSH_FXP_READDIR 分块返回

// 限制每次返回的文件数量,确保 packet 不超过 maxpack
let max_files_per_packet = (client_maxpacket - 50) / 100;  // 约 320 个文件

任务 3SSH_FXP_DATA 分块返回

// 限制每次返回的数据大小,确保 packet 不超过 maxpack
let max_data_per_packet = client_maxpacket - 50;  // 约 32KB

任务 4SSH_MSG_CHANNEL_DATA packet 大小检查

// 在发送 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 4SSH packet size 限制修复(必须立即实施)

  1. 添加 client maxpack 字段
  2. 修复 SSH_FXP_READDIR分块返回
  3. 修复 SSH_FXP_DATA分块返回
  4. 添加 packet 大小检查机制

预计工作量

  • 代码修改:约 200 行
  • 测试验证:约 30 分钟
  • 总时间:约 1 小时

测试清理

# 清理测试文件
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 立即修复(最高优先级)