Frage

Nehmen wir an, es ist ein Client, der viel kurzlebiger Verbindungen zu einem Server macht.

Wenn der Client die Verbindung schließt, wird es auf der Client-Seite viele Ports in TIME_WAIT Zustand sein. Da der Client aus lokalen Ports ausgeführt wird, wird es unmöglich, einen neuen Verbindungsversuch schnell zu machen.

Wenn der Server die Verbindung schließt, werde ich viele TIME_WAITs auf der Server-Seite sehen. Allerdings macht dies keinen Schaden? Der Client (oder andere Clients) halten Verbindungsversuche zu machen, da sie nie aus der lokalen Ports ausgeführt wird, und die Anzahl der TIME_WAIT Zustand wird auf der Serverseite erhöhen. Was passiert, schließlich? Geschieht etwas Schlechtes? (Verlangsamung, crash, unterbrochene Verbindungen usw.)

Bitte beachten Sie, dass meine Frage ist nicht „Was ist der Zweck von TIME_WAIT ist?“ sondern „Was passiert, wenn es so viele TIME_WAIT Zustände auf dem Server sind?“ Ich weiß schon, was passiert, wenn eine Verbindung im TCP / IP geschlossen ist und warum TIME_WAIT Zustand erforderlich ist. Ich versuche, nicht zu Fehlern zu suchen es aber will nur wissen, was mit ihr das potenziellen Problem ist.

einfach auszudrücken, lassen Sie uns netstat -nat | grep :8080 | grep TIME_WAIT | wc -l druckt 100000 sagen. Was würde passieren? Hat das O / S Netzwerk-Stack verlangsamen? „Zu viele offene Dateien“ Fehler? Oder einfach nichts zu befürchten?

War es hilfreich?

Lösung

Jeder Sockel in TIME_WAIT verbraucht wenig Speicher im Kernel, in der Regel etwas weniger als eine ESTABLISHED Buchse noch immer noch signifikant. Eine ausreichend große Zahl könnte Kernel-Speicher erschöpft oder zumindest Leistung verschlechtern, da die Speicher für andere Zwecke verwendet werden könnten. TIME_WAIT Steckdosen nicht halten Deskriptoren für offene Dateien (vorausgesetzt, sie ordnungsgemäß geschlossen wurden), so sollten Sie nicht über ein „zu viele offene Dateien“ Fehler zu kümmern.

Die Fassung entspricht auch auf, dass insbesondere src / dst IP-Adresse und Port, so dass es nicht für die Dauer des TIME_WAIT Intervalls wiederverwendet werden können. (Dies ist der Verwendungszweck des TIME_WAIT Zustandes.) Binden Sie den Port nach oben ist nicht in der Regel ein Problem, wenn Sie einen mit dem gleichen Port-Paar wieder müssen. Meistens eine Seite wird einen temporären Port verwenden, mit nur einer Seite verankert zu einem gut bekannt Port. Allerdings kann eine sehr große Anzahl von TIME_WAIT Steckdosen des ephemeren Port Raum erschöpfen, wenn Sie wiederholen und häufig zwischen den gleichen zwei IP-Adressen zu verbinden. Hinweis: Dies gilt nur für dieses bestimmte IP-Adresspaar, und wirkt sich nicht auf Aufbau von Verbindungen mit anderen Hosts.

Andere Tipps

bisherige Ergebnisse:

Auch wenn der Server der Buchse mit Systemaufruf geschlossen, wird nicht sein Dateideskriptors freigegeben werden, wenn sie den Status TIME_WAIT eintritt. Der Dateideskriptor freigegeben wird später, wenn der TIME_WAIT Zustand (d nach 2 * MSL Sekunden) verschwunden ist. Daher zu viele TIME_WAITs möglicherweise zu ‚zu viele offene Dateien‘ Fehler in der Server-Prozess führen wird.

Ich glaube, O / S TCP / IP-Stack hat mit dem richtigen Datenstruktur (z Hash-Tabelle) implementiert, so dass die Gesamtzahl der TIME_WAITs nicht die Leistung des OS / S TCP / IP-Stack beeinflussen sollte. Nur der Prozess (Server), die die Steckdosen in TIME_WAIT Zustand besitzt leiden.

Jede Verbindung durch ein Tupel identifiziert wird (Server IP, Server-Port, Client-IP-Client-Port). Entscheidend ist, dass die TIME_WAIT Verbindungen (ob sie auf der Serverseite oder auf der Client-Seite) nehmen jeweils eine dieser Tupel.

Mit dem TIME_WAITs auf der Client-Seite, dann ist es leicht einzusehen, warum Sie keine Verbindungen mehr machen - Sie haben keine weiteren lokalen Ports. Doch das gleiche Problem auf der Serverseite gilt - wenn es 64k Verbindungen in TIME_WAIT Zustand für einen einzelnen Client hat , kann es keine Verbindungen mehr akzeptieren von diesem Client , weil es keine Möglichkeit zu sagen, den Unterschied zwischen der alten Verbindung und die neuen Verbindung hat - werden beide Verbindungen mit dem gleichen Tupel identifiziert. Der Server sollte gerade RSTs von diesem Client in diesem Fall neue Verbindungsversuche senden.

Wenn Sie eine Menge von Verbindungen aus vielen verschiedenen Client IPs müssen den Server-IPs Sie in Einschränkungen der Verbindung Nachverfolgungstabelle laufen könnten.

Check:

sysctl net.ipv4.netfilter.ip_conntrack_count
sysctl net.ipv4.netfilter.ip_conntrack_max

Über alle src IP / Port und Ziel-IP / Port-Tupel können Sie nur net.ipv4.netfilter.ip_conntrack_max haben in der Verfolgungstabelle. Wenn diese Grenze erreicht ist, wird eine Meldung in Ihren Protokollen finden Sie unter „nf_conntrack. Tabelle voll ist, fällt Paket“ und der Server wird nicht neu eingehende Verbindungen akzeptieren, bis es Platz in der Verfolgungstabelle wieder.

Diese Einschränkung könnte man lange schlagen, bevor die temporären Ports ausgeführt werden.

In meinem Szenario lief ich ein Skript, das Zeitpläne immer wieder Dateien, mein Produkt einige Berechnungen tun und sendet Antwort auf Client dh Client ist eine sich wiederholende http Anruf die Antwort jedes file.When bekommen rund 150 Dateien Socket-Ports in geplant mein Server geht in TIME_WAIT-Zustand und eine Ausnahme in Client geworfen, die eine hTTP-Verbindung, dh

öffnen
 Error : [Errno 10048] Only one usage of each socket address (protocol/network address/port) is normally permitted

Das Ergebnis war, dass meine Bewerbung hanged.I weiß nicht threadshave in Wartezustand gegangen sein kann, oder was passiert ist, aber ich muß alle Prozesse töten oder meine Anwendung neu starten, um es wieder zu arbeiten.

Ich habe versucht, Wartezeit auf 30 Sekunden reduziert, da es 240 Sekunden standardmäßig ist, aber es hat nicht funktioniert.

Also im Grunde Gesamtwirkung war entscheidend, da es meine Anwendung nicht reagierende

gemacht

es sieht aus wie der Server kann nur aus Ports laufen für eingehende Verbindungen zuweisen (für die Dauer der bestehenden TIMED_WAITs.) - ein Fall für einen DoS-Angriff

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top