奇怪的 SSH/SCP 进度表行为

奇怪的 SSH/SCP 进度表行为

我的 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

相关内容