手动强制 TCP 连接重试

手动强制 TCP 连接重试
  1. 我有一个 TCP 连接(例如与某台计算机的 SSH 会话)
  2. 网络突然断线并丢失所有数据包(电缆断开、超出范围)。
  3. TCP 一次又一次地重新发送数据包,并以增加的延迟进行重试。
  4. 我发现了问题并重新插入电缆(或以某种方式恢复网络)。
  5. 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 超时配置。

干杯克里斯

相关内容