我可以通过两种方式通过 SSH 连接到本地网络上的机器:
通过本地 IP:
ssh 192.168.1.xxx
通过互联网使用端口转发:
ssh -p xxx mydomain.com
有什么区别?
具体来说,一种方法是否比另一种方法更快?
(ssh ... echo hello
使用方法“1”大约快 10 毫秒。对于 100 MB 的 SCP 传输,我没有检测到任何速度差异。)
答案1
对于您的问题来说,本地化是最快和最有效的,所以(1)。
这一切都涉及到你的数据包如何在网络中路由。
从您此处的简单描述中,我可以立即识别出使用网关与直接访问 PC 的区别。通过访问外部地址,您将使用路由器(默认网关)及其资源来建立连接。如果此路由器的使用率很高,您会注意到流量吞吐量显著减少。
我首先建议检查本地系统上的路由表
user@server:~$ route -n
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
0.0.0.0 10.11.0.1 0.0.0.0 UG 0 0 0 eth0
10.11.0.0 0.0.0.0 255.255.252.0 U 0 0 0 eth0
您可以从我的配置中看到,如果我引用本地网络上的系统(即 10.11.2.200),它将直接转到该系统。如果我有它的 NAT 地址(即 10.11.2.200 NAT www.somedomain.net),它将首先转到路由器,然后再通过 NAT 返回网络。
您可以通过对内部 IP 地址运行跟踪路由,然后将其与 NAT 后的 IP 地址进行比较来测试这一点。(最好在跟踪路由上禁用名称解析)。
user@server:~$ traceroute -n www.xxx.yyy.zzz
traceroute to www.xxx.yyy.zzz (www.xxx.yyy.zzz), 30 hops max, 60 byte packets
1 10.11.0.1 0.598 ms 0.717 ms 0.792 ms
2 10.10.1.3 0.710 ms 0.788 ms 0.896 ms
3 www.xxx.yyy.zzz 0.609 ms 0.496 ms 0.439 ms
您应该注意到,在返回网络之前,您会转到默认网关(路由器)。
将其与您的直接跟踪路由进行比较
user@server:~$ traceroute -n 10.11.0.64
traceroute to 10.11.0.64 (10.11.0.64), 30 hops max, 60 byte packets
1 10.11.0.64 0.349 ms 0.343 ms 0.336 ms
小文件传输速度之所以明显,是因为文件非常小,需要花费时间来分配路由器上的资源。对于较大的文件传输,由于您打开了连接并保持连接打开,因此时间在统计上并不显著。一个会给您不同结果的测试是发送小文件,但运行 X 次以等于您的 100MB 文件大小。尝试使用脚本执行命令 20,000,000 次,您应该会得到 100MB。
cmd="ssh ... echo hello"; for ((i=0;i<10000000;i++)); do $cmd;done
(执行 10,000,000 次,因为“echo_hello”有 10 个字节,尽管输出比从 SCP 的简单 ACK 数据包接收到的要多)。这个脚本只是一个快速的概念证明。
我希望这能正确解决您的问题。我想补充一点,如果源系统和/或目标系统在不同网络上有多个接口,情况会变得更加复杂。