树莓派Zero低速率网络下SCP传输无数据、间歇性需输密码问题求助
这不是树莓派Zero的已知bug,问题根源是SCP默认参数和Raspbian默认TCP配置不适配高延迟、高抖动的弱3G网络,笔记本传输正常是因为x86平台的默认网络缓冲区、SSH客户端超时阈值比ARM架构的Raspbian更高。
异常原因
- 间歇性要求输入密码:弱网下SSH公钥协商阶段超时,服务端未收到公钥校验包就回落为密码认证,SSH交互模式默认超时阈值远高于SCP非交互模式,所以直连SSH无该问题。
- 空文件、传输卡0%:SCP默认会先在服务端创建空文件再启动内容传输,弱网下TCP窗口过小、连接超时断开就会出现空文件,树莓派Zero通过USB连接SIM7600模块,默认USB网卡的TCP缓冲区远小于笔记本的PCIe网卡,高延迟链路下带宽延迟乘积超过缓冲区上限,就会出现传输卡住无进度的问题。
修复方案
1. 优化SCP/SSH传输参数
在原有scp命令中新增超时、保活、压缩参数,适配弱网环境:
# 参数说明 # -C:开启传输压缩,300KB图片压缩后可减少一半传输耗时 # -o ConnectTimeout=60:连接阶段超时设为60秒,远高于默认值 # -o ServerAliveInterval=10:每10秒发送一次心跳包保活 # -o ServerAliveCountMax=30:累计30次心跳无响应才判定断开,最多等待5分钟足够完成传输 scp -C -o ConnectTimeout=60 -o ServerAliveInterval=10 -o ServerAliveCountMax=30 foo.jpg <username>@webserver:dir/to/folder/default.jpg FILENAME=`date +"%Y-%m-%d_%H-%M-%S"` scp -C -o ConnectTimeout=60 -o ServerAliveInterval=10 -o ServerAliveCountMax=30 foo.jpg <username>@webserver:dir/to/archive_folder/${FILENAME}.jpg
2. 调整系统TCP弱网配置
编辑/etc/sysctl.conf文件,新增如下配置:
# 增大TCP读写缓冲区,适配高延迟链路 net.core.rmem_max = 16777216 net.core.wmem_max = 16777216 net.ipv4.tcp_rmem = 4096 87380 16777216 net.ipv4.tcp_wmem = 4096 65536 16777216 # 开启BBR拥塞控制,比默认的Cubic算法更适合弱网环境 net.core.default_qdisc = fq net.ipv4.tcp_congestion_control = bbr
修改完成后执行sudo sysctl -p即可生效,无需重启。
3. 新增传输容错逻辑
避免传输失败导致有效文件被覆盖、生成无效空归档文件:
- 先把文件传输为服务端的临时文件名,传输成功后再重命名覆盖目标文件
- 可增加重试逻辑,单次传输失败后间隔30秒重试,最多重试3次
示例脚本片段:
SCP_PARAM="-C -o ConnectTimeout=60 -o ServerAliveInterval=10 -o ServerAliveCountMax=30" # 传输default.jpg scp $SCP_PARAM foo.jpg <username>@webserver:dir/to/folder/default_tmp.jpg # 传输成功再重命名覆盖 if [ $? -eq 0 ];then ssh $SCP_PARAM <username>@webserver "mv -f dir/to/folder/default_tmp.jpg dir/to/folder/default.jpg" fi # 传输归档文件 FILENAME=`date +"%Y-%m-%d_%H-%M-%S"` scp $SCP_PARAM foo.jpg <username>@webserver:dir/to/archive_folder/${FILENAME}_tmp.jpg if [ $? -eq 0 ];then ssh $SCP_PARAM <username>@webserver "mv -f dir/to/archive_folder/${FILENAME}_tmp.jpg dir/to/archive_folder/${FILENAME}.jpg" fi
内容的提问来源于stack exchange,提问作者Kadlu
相关产品推荐
相关产品推荐

