在不稳定的 LAN 上传输文件的最佳方法是什么?

在不稳定的 LAN 上传输文件的最佳方法是什么?

这非常类似于问题 326211但这种情况下,LAN是一个不稳定的Wi-Fi连接。

我需要在两台运行 Linux 的计算机之间传输大约 11 GiB 的文件(尽管其中一台可以重新启动到 Windows)。它们的连接既慢又不稳定(由于 Linux 对 Wi-Fi 支持很差),但可移动媒体(如闪存驱动器或外部硬盘驱动器)目前不是一种选择。

现在,我正在通过 SFTP 缓慢地逐个传输文件,但我必须每大约 90 秒重新连接每台计算机,而且计算机彼此之间距离不太近,所以这是不可行的。

这不是问题 30186 的重复;那个问题特别涉及 Windows 7,并且所有提出的解决方案都涉及闭源的、仅适用于 Windows 的程序(在我看来,它们都是间谍软件,即使我信任它们,也不可能使用它们 - 其中一台计算机仅适用于 Linux。)

答案1

如何使用 7zip 或 winrar 之类的程序创建分割存档,例如每个存档 50MB。这样,您可以传输文件,直到连接断开,但不必每次都从头开始。

# -mx0 indicates no compression to be used (quickest method)
7z a -mx0 -v50m video.7z myVideo.mp4

一旦传输完所有文件(使用scp或等效)只需重新组合并提取?一次传输多个文件可能还会获得更快的速度。

--

编辑:我知道您说过可移动媒体是不可能的,但您可以从计算机 1 中取出硬盘,然后直接插入计算机 2 来执行传输吗?

答案2

首先,我会尝试看看是否有可能使连接更稳定。除了文件传输之外,我认为每 90 秒断开一次的连接对工作健康不利。

一个简单的 USB WiFi 加密狗就可以创造奇迹(首先,调查哪个设备实际上导致了断开连接:主机 A、主机 B 还是接入点?

可能 Linux 与信号丢失完全无关,而是 WiFi 不稳定的问题本身尝试将接入点锁定到较低的速度。即使是微不足道的 11 Mbps,如果非常稳定,也会比不稳定的 54 Mbps 连接表现更好。而且很多时候,卡会尝试更高的速度即使在这种情况下他们不可能实现

如果您遇到每 90 秒断开并重新协商一次的连接,最好的办法可能是rsync将文件分成足够小的块,以便在重新协商之间进行过滤:

split -b 10000000 file.mp4

会将文件分割成 N 个块,每个块(比如说)10 MiB,称为xaaxabxac... 复制完成后,您可以使用 在另一端重新组装块cat

另一种可能性是完全放弃 TCP,使用基于 UDP 的协议,例如自定义测试类型或者通用FTP

最后,您可以在一台机器上设置一个简单的 Web 服务器,并使用wget或任何支持检索完整性、字节范围和自动重试的 HTTP 客户端来下载整套文件(如果尚未下载,最好进行压缩)。

这需要更长的时间来设置,但它应该自动运行并使用可用且经过测试和验证的软件(apache,wget)。

再来一次 - 再去一次 - 芬尼根

如果你需要确保脚本同步,否则你会浪费大量的连接时间,你可以尝试一下任何一个 iwconfig或者ifup/ifdown为了强制接入点采取以下行为:

while true; do ifdown wlan0; ifup wlan0; sleep 90; done

或者如果您想将其作为脚本运行(无论如何都需要 root 访问权限才能运行 if* 命令):

#!/bin/sh
while true; do
    echo "Going down..."
    ifdown wlan0
    echo "Coming up..."
    ifup wlan0
    echo "Ready"
    sleep 90
done

(希望)更好的方法

“90 秒睡眠”的问题在于,除非发生什么事情真的奇怪的是,路由器出现故障,其保持运行的时间不会正好是 90 秒。因此,我们要么在 WiFi 运营商关闭时保持运行,要么在 WiFi 运营商本应保持运行时关闭,从而浪费了大量时间。

假设路由器的 IP 为 192.168.0.1,在两个 Linux 主机上我们都运行

#!/bin/sh

IP=192.168.0.1

while true; do
    if ( ping -f -c 3 -w 1 $IP | grep "0 received" > /dev/null ); then
        ifdown wlan0
        ifup wlan0
        # Extra time: we MUST be sure the network is up!
        sleep 5
    fi
    sleep 2
done

此脚本将向路由器发送三个数据包。这些数据包非常小,不会对带宽造成很大影响。一个数据包丢失可能是偶然的,两个数据包丢失则可能是巧合——丢弃的数据包会触发 WLAN 电源循环。希望这应该每个周期最多浪费两秒钟的时间(而不是最多 90 秒),并且除非有必要,否则绝不会触发电源循环。

毋庸置疑,必须在路由器上验证 PING 功能 - 如果路由器不响应 ping,或者在 TCP/UDP 负载下丢弃 ICMP(例如由于协议优先级),则脚本的第二个版本可能会弊大于利。

但现在我想起来了,你是否尝试过摆弄iwconfig参数?例如敏感度阈值:

桑斯 设置敏感度阈值。这定义了卡对不良操作条件(低信号、干扰)的敏感度。正值被认为是硬件使用的原始值或百分比,负值被认为是 dBm。

根据硬件实现的不同,该参数可能控制各种功能。

在现代卡上,此参数通常控制切换/漫游阈值,即硬件与当前接入点保持关联的最低信号级别。当信号级别低于此阈值时,卡开始寻找新的/更好的接入点。有些卡可能会使用错过的信标数量来触发此操作。对于高密度的接入点,较高的阈值可确保卡始终与最佳 AP 关联,对于低密度的 AP,较低的阈值可最大限度地减少切换失败的次数。在较旧的卡上,此参数通常控制延迟阈值,即硬件认为通道繁忙的最低信号级别。高于此阈值的信号级别使硬件抑制其自身的传输,而比此阈值更弱的信号将被忽略,硬件可以自由传输。这通常与接收阈值密切相关,即硬件尝试接收数据包的最低信号级别。正确设置这些阈值可防止卡在接收弱传输的同时浪费时间在背景噪音上。现代设计似乎可以自动控制这些阈值。

例子 :

   iwconfig eth0 sens -80
   iwconfig eth0 sens 2

答案3

while ! rsync \
  --bwlimit <KB/s value> \
  -rP \
  /path/to/directory_that_contain_the_data_to_be_transferred \
  [email protected]:/path/to/target_directory ; \
  do sleep 90;
done

取自https://patrick-nagel.net/blog/archives/434

你可能想把它放在 bash shell 脚本中。如下所示

#!/bin/bash

while ! rsync \
  --bwlimit <KB/s value> \
  -rP \
  /path/to/directory_that_contain_the_data_to_be_transferred \
  [email protected]:/path/to/target_directory; \
  do sleep 90;
done

您需要设置 ssh 密钥,如果您不知道如何执行此操作,这是另一个问题,但基本上是:

ssh-keygen -t rsa

这将创建您的公钥/私钥对。将您的公钥复制到目标计算机,这样您就不必在每次连接断开时使用密码凭据。

答案4

Bittorrent 同步跨 LAN 工作。电流要求(每手动的) 是:

ARM/PPC/i386/x86_64 上内核为 2.6.16 (glibs 2.4) 或更新版本的 Linux

相关内容