我的 SSH 行为非常奇怪,这让我有点紧张。基本上,进度表完全是假的:假得几乎毫无用处。我担心可能还会发生其他事情(更多内容见下文)。
基本上我只有 60 KB/s 左右的上传链接,但我启动的每个 scp 都开始说它的速度为 2 MB/s。
然后它总是试图“修复”这个数字,慢慢地向真实值收敛。
然后,对于“大”文件(几 MB 或更多),它总是在 100% 处停滞很多秒(最终成功,我回到提示符)。
输出如下所示:
...
test.tgz 16% 2112KB 2.1MB/s 00:04 ETA
test.tgz 17% 2208KB 1.7MB/s 00:06 ETA
test.tgz 18% 2320KB 1.2MB/s 00:08 ETA
test.tgz 19% 2448KB 1.1MB/s 00:08 ETA
test.tgz 20% 2576KB 942.2KB/s 00:10 ETA
test.tgz 21% 2704KB 697.3KB/s 00:14 ETA
test.tgz 22% 2832KB 576.3KB/s 00:16 ETA
test.tgz 23% 2960KB 478.3KB/s 00:20 ETA
test.tgz 24% 3088KB 399.0KB/s 00:23 ETA
test.tgz 25% 3216KB 334.7KB/s 00:27 ETA
test.tgz 26% 3344KB 282.6KB/s 00:32 ETA
test.tgz 27% 3472KB 240.4KB/s 00:37 ETA
test.tgz 28% 3600KB 185.6KB/s 00:48 ETA
test.tgz 29% 3728KB 161.9KB/s 00:54 ETA
test.tgz 30% 3856KB 142.7KB/s 01:01 ETA
...
(它在一行上:我确实在此处粘贴了多行,我用它scp -vvv
来更好地解释我的问题)。
最后,当输出总是卡在 100% 时,实际上丢失了很多数据:我已经在另一端检查了这一点,文件肯定还没有完整存在。
所有百分比测量基本上都是毫无意义的:当它说 12 MB 文件的 80% 都存在时,服务器上只有大约 65%。
这能用什么解释呢?
我在这里发帖是因为我想知道如果中间人攻击发生在我的系统附近(可能是在受感染的路由器或其他东西上),这些数字会是什么样子。
我使用 Linux 和 SSH / SCP 已经很多年了,但我不记得这些数字是多少那离开。
编辑
下载按预期进行:如果我从远程主机 scp 到我的计算机,则 %、ETA 和 KB/s 都是正确的。
答案1
通过输出缓冲区大小和 TCP 窗口设置可以轻松解释此行为。
首先,当接收数据,你要么有这些位,要么没有。您的本地scp
知道预计的金额以及到目前为止已收到的金额,因此它可以为您提供进度和预计剩余时间的准确评估。
当你是发送数据,您还没有任何关于有多少数据实际到达接收器的信息。您的本地计算机将有一个输出缓冲区,用于在应用程序 (scp)“发送”数据之后和实际在网络上传输数据之前保存数据。此外,TCP 允许一定量的数据在发送方和接收方之间“传输”。
发送数据时,scp
仅查看已将多少数据移交给操作系统以进行最终传输。输出缓冲区的填满速度非常快,因此这就是scp
最初测量高传输速率的原因。随着传输的进行,该值向实际传输速率收敛。将所有数据交给操作系统后,它仍然必须到达另一端,这就是为什么它最后似乎“卡在”100% 几秒钟。
现代操作系统和 TCP 网络增加了 TCP 窗口大小(请参阅TCP 窗口缩放选项)来解释具有高带宽和高延迟的“长胖网络”。这就是为什么您可能比过去更频繁地看到这种行为。
答案2
我最近遇到了一个非常类似的问题,每当我尝试通过 ssh 推送数据超过一定速率时,WireShark 都会显示 TCP ZeroWindow 错误。我最终将其追溯到我的路线中某些与 IP 服务质量处理搞砸的事情。将此配置添加到我的 sshd_config 和 ssh_config 修复了它:
IPQoS=af21 cs1
这些设置将成为比我当前版本更新的 SSH 版本中的默认设置:https://www.openssh.com/txt/release-7.8