Wie kann ich ein Zeitlimit für die TCP-Verbindung verhindern, wenn große Dateien per FTP übertragen werden?

8

Ich kann keine große Datei aus dem Internet per FTP auf meine Linux-VM übertragen. Nach einer Weile läuft es ab.

Der eigentliche Fehler lautet " Antwort von Steuerverbindung konnte nicht gelesen werden - Zeitüberschreitung ". Dieser Fehler tritt nach einigen Minuten auf, nachdem ein guter Teil der Datei bereits übertragen wurde.

Das Setup ist:

FTP-Client: ncftpget wird unter Linux unter VMWare Player 3.0 ausgeführt
FTP-Server: Computer eines anderen im Internet, Konfiguration unbekannt
Gastbetriebssystem: Ubuntu 8.10 Linux 32-Bit mit installierten vmxnet- und vmware-Tools.
Host-Betriebssystem: Vista 64-Bit
Netzwerk: Linux VM stellt über Bridged NIC eine Verbindung zum Internet her (auch NAT ausprobiert).
FTP-Modus: PASV
Ich habe einige Forenbeiträge gefunden, in denen irgendwo eine Zeitüberschreitung von 2 Minuten erwähnt wurde. Aber genau, wo und wie man es behebt, war nicht klar. Einige Schritte zur Fehlerbehebung wurden bereits versucht:

  • Ich habe von VMWare Player 3.0 auf VirtualBox 3.0.x umgestellt, aber kein Glück.
  • Ich habe auch von NAT zu Bridged Virtual NICs gewechselt, aber kein Glück

UPDATE Netstat auf der Linux-VM und die entsprechende Administrationsseite auf dem DIR-655-Router zeigen beide an, dass die Verbindung aktiv und in Ordnung ist (TCP-Status 'ESTABLISHED'). Vista sieht die Verbindung überhaupt nicht, was meiner Meinung nach normal ist, wenn der Verbindungsstatus nur innerhalb der VM verwaltet wird.

Hier ist die Ausgabe von netsh interface tcp show global unter Vista, falls es nützlich ist:

C: \ Users \ alex> netsh interface tcp show global
Aktiven Status abfragen ...

Globale TCP-Parameter
----------------------------------------------
Empfangsseitiger Skalierungsstatus: aktiviert
Schornsteinentladestatus: deaktiviert
Auto-Tuning-Pegel des Empfangsfensters: stark eingeschränkt
Add-On-Überlastungskontrollanbieter: keine
ECN-Fähigkeit: deaktiviert
RFC 1323-Zeitstempel: deaktiviert
** Die obige Einstellung für die automatische Abstimmung ist das Ergebnis der Windows-Skalierungsheuristik
Überschreiben einer lokalen / Richtlinienkonfiguration.
Alex R.
quelle
Wie ist das Host-Betriebssystem mit dem Internet verbunden? Ein Router?
Pause
Die Verbindung zum Internet erfolgt über einen DIR-655-WLAN-Router, der an ein Zoom X5-DSL-Modem angeschlossen ist. Während des gesamten Setups ist der Host-Computer brandneu, der DIR-655 wurde kürzlich neu konfiguriert (unter Verwendung von WPA2 und mehreren Zonen) und sowohl das Modem als auch die VM sind bereits vorhanden (die VM wurde von einem älteren Computer kopiert).
Alex R
Ich kann die Verbindungen auf dem DIR-655 überwachen und sie zeigen einen Countdown bis zum Timeout von mehr als 7000 Sekunden (über 2 Stunden). Ich habe gerade IPv6 auf dem WLAN-Adapter deaktiviert.
Alex R
Führen Sie eine zusätzliche Fehlerbehebung mit 'netstat' durch und überprüfen Sie auch den DIR-655 ... Ich stelle fest, dass sowohl Linux als auch der DIR-655 eine 'ESTABLISHED'-Verbindung sehen, die Verbindung von Vista's netstat jedoch GEGANGEN ist! Es ist komplett weg ... Nicht einmal ein TIME_WAIT.
Alex R
Ich versuche auch KeepAliveTime = 60 in HKEY_LOCAL_MACHINE \ SYSTEM \ CurrentControlSet \ Services \ Tcpip \ Parameters
Alex R

Antworten:

2

Versuchen Sie zur Fehlerbehebung, dieselbe Datei über wgetoder herunterzuladen curl. Ich vermute, dass PEra korrekt ist, NOOP-Befehle verhindern dies und möglicherweise werden sie durch wget oder curl gesendet.

Josh
quelle
Vielen Dank für den tollen Vorschlag ... Anscheinend wurde Curl speziell für diesen Zweck gepatcht ( sourceforge.net/tracker/… ) ... Ich werde es jetzt versuchen.
Alex R
OK. Erfolgreich mit 6 großen Dateien getestet. Dies ist das Update, das es endlich geschafft hat. Curl hat eine Keepalive-Option, die ncftpget fehlt. Ich habe nicht genug Zeit, um meine anderen Änderungen zurückzusetzen und erneut zu testen. Daher weiß ich nicht, ob dieses Update isoliert oder nur in Verbindung mit dem / proc / sys / net / ipv4 / tcp_keepalive_ * -Stoff von funktioniert Michael Graff.
Alex R
Mir war nie in den Sinn gekommen, dass Curl FTP-Funktionen hat oder dass es vollständiger sein könnte als ncftpget (ncftpget gibt es schon seit 15 bis 20 Jahren?). Ich werde dies als beste Antwort genehmigen, da es das Problem behoben hat, obwohl ich nicht 100% weiß, ob dies das ist, was es selbst getan hat.
Alex R
Ich bin froh, dass das für dich funktioniert hat!
Josh
6

Wenn Sie NAT durchlaufen, werden Sie wahrscheinlich von den NAT-Timern getrennt. Ich sehe das von Hotelzimmern aus, wo ich in eine Maschine ssh und für einige Zeit etwas versäume (manchmal nur 5 Minuten!)

# echo 60 > /proc/sys/net/ipv4/tcp_keepalive_time
# echo 60 > /proc/sys/net/ipv4/tcp_keepalive_intvl
# echo 20 > /proc/sys/net/ipv4/tcp_keepalive_probes

Probieren Sie diese aus. Dadurch wird einmal pro Minute ein Keepalive für alle TCP-Streams gesendet, unabhängig von der Aktivität auf dem Socket.

Beachten Sie, dass der FTP-Client möglicherweise keine Keepalives verwendet. Es ist etwas, das die Anwendung anfordern muss. Wenn dies fehlschlägt, funktioniert die Installation eines anderen FTP-Clients möglicherweise besser. Der NetBSD-FTP-Client (lukemftp) ist möglicherweise verfügbar und der beste Befehlszeilen-FTP-Client, den ich bisher gesehen habe.

Es ist auch möglich, dass das Remote-Ende die Verbindung aufgrund von Inaktivität schließt. Wenn ja, hat es eine ziemlich gebrochene Vorstellung von der Realität. Wenn diese oben genannten TCP-Keepalive-Hacks das Problem nicht beheben, muss der Client entweder regelmäßig einen Befehl senden (NOOP usw.) oder die Administratoren des FTP-Servers müssen ihr Ende ändern.

Michael Graff
quelle
Ich versuche das gerade. In der Zwischenzeit stört mich die Dokumentation ein wenig ... unter tldp.org/HOWTO/TCP-Keepalive-HOWTO/usingkeepalive.html heißt es: "Denken Sie daran, dass die Keepalive-Unterstützung, selbst wenn sie im Kernel konfiguriert ist, nicht das Standardverhalten ist unter Linux. Programme müssen über die setsockopt-Schnittstelle eine Keepalive-Kontrolle für ihre Sockets anfordern. " Bedeutet das, dass ich zusätzlich zu den oben genannten Aufgaben einen modifizierten FTP-Client haben muss? Wie auch immer, unabhängig von der Antwort, ich werde es versuchen.
Alex R
Ich habe 2 Tests durchgeführt und alle waren erfolgreich, nachdem ich diese Änderung angewendet habe. Ich muss es noch ein paar Mal versuchen, um sicherzustellen, dass es kein Zufall ist.
Alex R
Ich glaube, die Dokumentation auf dieser Seite ist ziemlich alt. Beachten Sie, dass ich weder Linux ausführe noch ein NAT habe, das diese Art von Zeitüberschreitung bereitstellt. Dies ist nur eine sehr häufige Situation, und mein Laptop hat sie aus diesem Grund in /etc/sysctl.conf. Diese Datei ist wahrscheinlich NetBSD-spezifisch.
Michael Graff
Übrigens, wenn dies funktioniert, ist es entweder Ihre lokale NAT- "Router" -Box (nicht Ihre Windows-basierte NAT für Ihre VM) oder etwas auf der Remote-Seite, das die Steuerverbindung unterbrochen hat.
Michael Graff
Interessante Ergebnisse. Obwohl es jetzt meistens funktioniert, bekomme ich immer noch gelegentlich den gleichen alten Fehler!
Alex R
3

Möglicherweise handelt es sich um ein Filtergerät auf dem Weg zwischen Ihrer VM und dem FTP-Server. Die meisten Firewalls (einschließlich Heimrouter) verfügen über eine Statustabelle, in der inaktive TCP-Sitzungen nach einer bestimmten Zeitüberschreitung zurückgesetzt werden.

Sie können die Netzwerkkarte der VMs in den Bridged-Modus (anstelle von NAT) ändern, um das Host-Betriebssystem zu sortieren. Stellen Sie dann sicher, dass Ihr FTP-Client regelmäßig NOOP-Befehle sendet , um den Befehlskanal offen zu halten. Es gibt Firewalls, um die die Datenverbindung geschlossen wird, wenn sie sehen, dass die Befehlssitzung geschlossen ist. Unabhängig davon, ob die Datenverbindung inaktiv ist oder Datenverkehr führt ...

HTH,
PEra

PEra
quelle
Danke für die Vorschläge. Ich habe von NAT zu Bridged gewechselt, aber die gleichen Ergebnisse erzielt. Können Sie mir mehr über diese NOOP-Befehle erzählen? Muss ich einen FTP-Client von Grund auf neu codieren (mit Perl oder etwas anderem), um diese zu erhalten? Ich habe das ncftpget-Handbuch überprüft und dort nichts gesehen.
Alex R
1
Der NOOP-Befehl ist genau das, er macht nichts. Es wird regelmäßig vom FTP-Client gesendet, um zu verhindern, dass der Befehlskanal eine Zeitüberschreitung aufweist. Normalerweise wird es in jeder Client-Software als "Keepalive" bezeichnet.
PEra
+1, NOOP ist der richtige Weg. Es ist möglich, dass ncftpget sie nicht macht.
Josh
Danke für die Idee; Ein anderer Antwortender schlug das eigentliche Werkzeug (Curl) vor, das dies implementiert.
Alex R
2

Wenn Sie dies über die Befehlszeile tun, versuchen Sie, 'Hash' zu aktivieren ('Binär' ist eine andere, die ich immer einschalte). Dies kann zu genügend Datenverkehr auf dem Steuerport führen, um eine Zeitüberschreitung zu vermeiden.

Peter
quelle
1
Werden die Hash-Markierungen vom Server über die Steuerverbindung gesendet? Das ist eine clevere Problemumgehung! Ich muss von ncftpget zu normalem ftp konvertieren, um dies zu versuchen.
Alex R
Ich habe mir gerade die Quelle für den GNU-FTP-Client angesehen (von Inetutils ftp.gnu.org/gnu/inetutils ). Leider scheinen die Hashes lokal vom Client gedruckt zu werden, sodass sie nichts tun, um die Steuerungsverbindung aufrechtzuerhalten im Leerlauf gehen :(
Alex R
1
Dies kann ein Fehler des FTP-Clients sein, der keine ordnungsgemäßen Keep-Alives an den Befehlsport sendet. Versuchen Sie es vielleicht mit verschiedenen Clients? Und / oder verwenden Sie Wireshark, um zu sehen, was auf dem Draht passiert.
Peter
clevere, hinterhältige Lösung
Tim Williscroft
Diese "Lösung" ist nur Wunschdenken ... es funktioniert nicht, und eine kurze Überprüfung des FTP-Quellcodes zeigt, warum.
Alex R
1

FTP verwendet zwei Sockets - einen zur Steuerung und einen für Daten.

Es ist wahrscheinlich, dass es die NAT-Statustabellen auf der VM sind, die das Zeitlimit für die Steuerverbindung aufgrund von Inaktivität auf diesem Socket verursachen.

Möglicherweise können Sie dies umgehen, indem Sie "Active FTP" auf dem VM-System aktivieren, was hoffentlich dazu führt, dass VMware FTP-Sitzungen aktiv überwacht und den Control Socket am Leben hält, solange noch Daten fließen.

Alnitak
quelle
1
Ungewöhnlicher Rat? Aktives FTP ist viel schwieriger mit NAT zu arbeiten.
Alex R
Ja, möglicherweise ungewöhnlich, aber es ist möglicherweise die einzige Möglichkeit, VMware dazu zu bringen, tatsächlich mit FTP zusammenzuarbeiten.
Alnitak
Ich habe es gerade versucht (mit ncftpget -E, um den aktiven Modus zu erzwingen). Das Verhalten bleibt unverändert ... die Übertragung dauert einige Minuten und endet am Ende mit demselben Fehler.
Alex R
Na ja, es war einen Versuch wert. Eine andere Methode, um die TCP-Verbindung aktiv zu halten (z. B. der NOOP-Befehl), ist erforderlich.
Alnitak
0

Wenn der FTP-Server Vista ist, rufen Sie die Eigenschaften der FTP-Site auf und erhöhen Sie das Zeitlimit von 15 Minuten (Standard). Wie groß ist die Datei, die Sie übertragen möchten?

NASA
quelle
1
Es ist der Kunde, der das Zeitlimit überschreitet. Ich bin nicht sicher, ob er Zugriff auf die Serverseite hat. Wenn er das tat, könnte er etwas anderes als FTP verwenden und einfach das Chaos vermeiden.
Michael Graff
Richtig, Michael. Wenn es mein Server wäre, würde es sshd ausführen.
Alex R