为什么 ssh 的延迟能有 ping 的 3 倍?

2023-05-28 22:38:08 +08:00
 nyxsonsleep

甲骨云圣何塞的服务器。ssh 打字有延迟,快要到 0.7s 的程度。基本上都是在盲打了。

ssh 192.*.*.*@username 用的 rsa 验证登录的。

ping 出来的延迟在 200ms 左右,丢包 2%。

在 powershell 中登录,然后录屏,利用一个屏幕显示按键的软件结合进行计算延迟,延迟大概在 0.6s 的样子。

用 xshell 连接之后,延迟相同,根据右下的上传下载标志符号进行录像,延迟大致在 0.5s 的样子。

试了用代理登录,延迟基本不变,甚至可能变高了。查看 ssh 日志,登录 ip 已经发生变化。

然后用了 python 的 paramiko 模块进行 ssh 登录,计算延迟,每条指令大概在 0.5-0.7s 之间的样子。都是几乎不消耗资源的指令。

import paramiko
import time
key = paramiko.RSAKey.from_private_key_file(r'C:\Users\username\.ssh\id_rsa')
ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
ssh.connect('hostname', username='username', pkey=key)

t1=time.time()
# ssh.exec_command('cd ..')
stdin, stdout, stderr = ssh.exec_command('ls -l')
t2=time.time()
print(t2-t1)
print(stdout.readlines())

ssh.close()

usedns no #GSSAPIAuthentication no

6661 次点击
所在节点    程序员
78 条回复
1423
2023-05-29 17:44:43 +08:00
似乎猜到原因了。。OP 自己证实下吧
exec_command 太重了,想低延迟应该考虑 invoke_shell ,自己在 channel 做读写
ljsh093
2023-05-29 18:06:01 +08:00
@proxychains #7 你这个叹号是认真的吗
nyxsonsleep
2023-05-29 18:16:20 +08:00
@nothingistrue #57 了解一下 tcping 和 ping 的区别行吗?还有 udp 的 ping 呢。。。
nyxsonsleep
2023-05-29 18:20:19 +08:00
@Pantheoon #59 我认为我贴文很清楚了。
但似乎有人还是没搞懂:
1. ssh 是 tcp ,ping 是 icmp 。 [我说 ping 是 tcp 是错的]
2. 有一些工具通过一些方法实现了 tcp 或者 udp 连接的 ping 工具,比如 tcping 、hping3 。
nyxsonsleep
2023-05-29 18:23:02 +08:00
@zhangsanfeng2012 #56 这是我没有考虑到的问题,有相关的资料吗。非常感谢。
1423
2023-05-29 18:25:01 +08:00


测了下猜想正确,是一个 rtt
nyxsonsleep
2023-05-29 18:26:20 +08:00
@lambdaq #55
1. 我特意做了 hping3 、tcping 、WinMTR 的测试,这三个软件都是可以用 tcp 协议进行延迟测试的,所以我将其称之为了 [tcp 的 ping 延迟] ,但以 tcp 协议和 icmp 协议来说他们的延迟差距不大。 [但是确实有可能是因为回显导致的延迟问题。]
nyxsonsleep
2023-05-29 18:27:50 +08:00
@SingeeKing #52 已上传 base64:aHR0cHM6Ly93d3cud2Vuc2h1c2h1LmNuL2YvYmJyNGV4MGpzbGY=
cnbatch
2023-05-29 18:31:53 +08:00
想要准确测试 SSH 的 RTT 带来的延时,最好在无干扰的情况下测试,比如纯内网。
哪怕是跨国内网也行(专线更佳),都比公网直接测好得多。
nyxsonsleep
2023-05-29 18:31:59 +08:00
@1423 #66 能给完整代码吗?谢谢。
nyxsonsleep
2023-05-29 18:36:18 +08:00
@lambdaq #55 3. 关于 mosh 我想问一下,如果打一连串指令再删除的时候,有时候会删掉命令提示符(类似: username@machinename$这部分)的部分内容,然后再回显重新回显显示出来,这个是 mosh 的特性吗?还是配置不对,或者是网络原因。
Greatshu
2023-05-29 18:38:53 +08:00
谢希仁的《计算机网络》,点击章节目录可以下载 PPT
https://yx.51zhy.cn/net.jsp

Windows 下更推荐 psping ,udp ,tcp ,icmp 都支持
https://learn.microsoft.com/zh-cn/sysinternals/downloads/psping
lambdaq
2023-05-29 18:39:22 +08:00
@nyxsonsleep 我没仔细研究。它号称有优化,那么肯定相比 ssh 有它的独到之处。用就完事了。
nyxsonsleep
2023-05-29 18:39:40 +08:00
@cnbatch #54 非常感谢,提到这么多信息之后,我想确实有可能是被 gfw 干扰了。
lambdaq
2023-05-29 18:43:07 +08:00
@nyxsonsleep 它提到一个优化点。比如你 cat xxx 结果是一个 10G 的日志,发现一直不停输出,你按下 Ctrl+C 没反应。ssh 得等到 10G 文本传输展示完毕了,才会响应你的 Ctrl+C 。

mosh 的处理方式不同,它可以立刻响应。
ncepuzs
2023-05-29 19:05:48 +08:00
居然这么多楼了……
1. 本地代理
2. 跳板机
3. Cloudflare Access https://developers.cloudflare.com/cloudflare-one/identity/users/short-lived-certificates/
zhangsanfeng2012
2023-05-29 19:19:36 +08:00
@nyxsonsleep

```python
import paramiko
import time

ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
ssh.connect('hostip', username='user', password="passwd")

# get shell
shell= ssh.invoke_shell()
# read all banner
time.sleep(2)
shell.recv(9999)

t1=time.time()
shell.send("l")
print(shell.recv(1))
t2 = time.time()
print(t2-t1)
ssh.close()
```
weiqk
2023-05-29 19:24:52 +08:00
@AreYou0k

>> 顺便问一嘴, 怎么模拟 2%丢包啊.
放狗:Linux 模拟丢包

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/943686

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX