- 我有一个 TCP 连接(例如与某台计算机的 SSH 会话)
- 网络突然断线并丢失所有数据包(电缆断开、超出范围)。
- TCP 一次又一次地重新发送数据包,并以增加的延迟进行重试。
- 我发现了问题并重新插入电缆(或以某种方式恢复网络)。
- TCP 连接最终成功重新发送一些数据包并继续。
问题是我需要等待第 5 点的超时。我现在想使用我打开的 SSH 会话,而不是等待 5-10 秒直到它发现连接再次正常工作。
如何在 GNU/Linux 中强制所有 TCP 连接无延迟地重新发送数据?
答案1
您是否知道 IP 连接已在时间 (4) 建立?使用 DHCP / WiFi / WPA / ARP / Zeroconf 时,数据链路重新协商很容易在载波开启和传递一个 IP 数据包之间花费 5 秒钟。
如果是这样,SSH 会话可能不是限制,强制 TCP 重新发送根本无济于事。
更新:
不知道,我无法重现它。我在机器 .2 和 .3 之间建立了一个开放的 SSH 连接,.3 每秒将时间打印到标准输出。这两台机器运行的是原始的 Ubuntu Lucid,并通过无聊的 WAP/交换机/路由器连接。机器配置了 DHCP。我从机器 .3 上拔下电缆,等待了科学准确(看时钟)的 60 秒间隔。这是数据包跟踪:
No. Time Source Destination Protocol Info
18 8.479990 192.168.2.3 192.168.2.2 SSH Encrypted response packet len=48
19 8.480024 192.168.2.2 192.168.2.3 TCP 56670 > ssh [ACK] Seq=1 Ack=433 Win=1002 Len=0 TSV=2804876 TSER=44100246
20 87.619215 AsustekC_f1:59:70 Broadcast ARP Who has 192.168.2.2? Tell 192.168.2.3
21 87.619221 AsustekC_24:9c:85 AsustekC_f1:59:70 ARP 192.168.2.2 is at 00:1a:92:24:9c:85
22 87.619527 192.168.2.3 192.168.2.2 SSH Encrypted response packet len=48
23 87.619545 192.168.2.2 192.168.2.3 TCP 56670 > ssh [ACK] Seq=1 Ack=481 Win=1002 Len=0 TSV=2824661 TSER=44120031
会话恢复大约需要 200 微秒。我使用了标准Wireshark用于数据包嗅探。
答案2
看看下面的 proc 条目
/proc/sys/net/ipv4/
tcp_keepalive
tcp_retries
tcp_keepalive(TCP保持连接):
TCP 开始发送保持活动探测之前连接需要空闲的秒数。可以通过执行以下命令来更改此设置
echo 20 > /proc/sys/net/ipv4/tcp_keepalive_time。
默认值为 7200 秒(2 小时)。
tcp_重试:
关闭 TCP 连接前的重试次数
回显 45 > /proc/sys/net/ipv4/tcp_retries2
不确定这在 SSH 连接时是否真的有帮助,因为这实际上取决于链接速度和 SSH 超时配置。
干杯克里斯