Lokalne podejście jest najszybsze i najbardziej wydajne dla twojego pytania, więc (1).
Wszystko to wiąże się z routingiem pakietu przez sieć.
Różnica, którą mogę natychmiast zidentyfikować na podstawie prostego opisu tutaj, polega na korzystaniu z bramki w porównaniu do bezpośredniego przejścia na komputer. Przechodząc do adresu zewnętrznego, użyjesz routera (brama domyślna) i jego zasobów w celu nawiązania połączenia. Jeśli ten router jest intensywnie wykorzystywany, zauważysz znaczne zmniejszenie przepustowości ruchu.
Najpierw sugeruję sprawdzenie twojej tabeli routingu w systemie lokalnym
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
Z moją konfiguracją widać, że jeśli odwołam się do systemu w sieci lokalnej (tj. 10.11.2.200), przejdzie on bezpośrednio do tego systemu. Jeśli mam dla niego adres NAT (tj. 10.11.2.200 NAT www.somedomain.net), najpierw przejdzie do routera, a następnie NAT z powrotem do sieci.
Możesz to sprawdzić, uruchamiając traceroute na wewnętrzny adres IP, a następnie porównując go z adresem NAT NAT. (Zalecane jest wyłączenie rozpoznawania nazw na traceroute).
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
Powinieneś zauważyć, że idziesz do domyślnej bramy (routera) przed powrotem do sieci.
Porównaj to z bezpośrednim traceroute
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
Powodem, dla którego zauważono małą prędkość przesyłania plików, jest jego wyjątkowo mały rozmiar, który zabrał czas na przydzielenie zasobów na routerze. W przypadku większego transferu plików czas będzie nieistotny statystycznie, ponieważ otwierasz połączenie i pozostawiasz je otwarte. Testem, który dałby różne wyniki, byłoby wysłanie pliku o małym rozmiarze, ale uruchomienie go X razy, aby równać się rozmiarowi pliku 100 MB. Spróbuj tego ze skryptem wykonującym polecenie 20 000 000 razy, a otrzymasz 100 MB.
cmd="ssh ... echo hello"; for ((i=0;i<10000000;i++)); do $cmd;done
(10 000 000 wykonań, ponieważ „echo_hello” zawiera 10 bajtów, chociaż wynik jest większy niż wynik otrzymany z prostego pakietu ACK dla SCP). Ten skrypt to tylko szybki dowód koncepcji.
Mam nadzieję, że to poprawnie rozwiązuje twoje pytanie. Chciałbym dodać, że staje się to bardziej skomplikowane, jeśli system źródłowy i / lub docelowy ma wiele interfejsów w różnych sieciach.