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