自从将办公室路由器升级到 Buffalo WZR-HP-G300NH 后,我注意到了一些奇怪的事情。当我使用 SSH 隧道进行远程连接时,隧道经常会“冻结”。每次冻结持续 1-2 分钟,之后所有受阻的流量都会赶上。使用 VNC 并且会话每隔几分钟就会暂停,这非常烦人。
我在本地计算机上使用以下命令:
ssh -D 9000 [email protected]
我知道整个路由器没有冻结,因为我可以打开另一个 SSH 会话,一切都很好 - 直到它也冻结。冻结会话是相互独立的。两者都会定期冻结,但不会同时冻结。
我可以在两个会话中启动 ping,并且都不会丢失单个数据包,甚至不会显示任何延迟,即使两者都冻结了几次。
如果我将 VNC 端口直接转发到远程计算机,问题会有所好转,让我相信这更有可能是 TCP 问题而不是 SSH。但我并不排除任何可能性。
尽管将固件升级到最新的 dd-wrt,包括几周前撤回的版本,但这种行为仍然存在。
难道是dropbear的问题?还是用MTU?服务质量?
答案1
两种猜测:
数据包丢失。不要相信您并行运行的“ping”,因为无论出于何种原因,数据包丢失可能只影响那些 TCP 流。检测它的一种简单方法是
$ netstat -s -p|grep "segments retransmited"
在 SSH 会话期间在双方(ssh 客户端和服务器)上频繁运行。查看计数器是否增加,在这种情况下,您在该计算机中的 TCP 会话上遇到了数据包丢失。也就是说,最好的方法是使用tcpdump 或wireshark记录正在发生的情况并确认是否发生重新传输(wireshark 通常将它们标记为红色,但 YMMV)。MTU 问题。例如,如果您尝试通过 SSH 列出大型目录的内容,则可能会出现传输的数据量需要将其分段的情况。端点将使用路径MTU检测以确定一次发送的数据量。但在某些情况下,一个路径中的防火墙可能会阻止所有 ICMP 数据包因此破坏了路径 MTU 检测,导致明显的冻结。这可能很难确认和诊断。最简单且始终有效的解决方法是将任一侧网络接口的 MTU 更改为较低值,例如 1200 或 1000。这可能会损害您的性能,因此您最好不要永远使用此方法。
答案2
您是否尝试过仅转发 VNC 端口(5900 是什么?)
ssh -L 5900:127.0.0.1:5900 [email protected]
然后您在使用 VNC 客户端时只需使用 127.0.0.1 即可。