Wenn eine TCP-Verbindung als im Leerlauf?
Habe ich eine Anforderung zum aktivieren der TCP-keepalive auf alle Anschlüsse und jetzt Kämpfe ich mit den Ergebnissen aus unserem test-Fall. Ich denke, das ist, weil ich nicht wirklich verstehen, wenn die ersten keepalive-probe gesendet wird. Ich Lesen Sie die folgenden in der Dokumentation für tcp_keepalive_time
auf Linux:
den Intervall zwischen dem letzten Datenpaket gesendet (einfach ACKs werden nicht als Daten) und den ersten keepalive-Sonde; nach der
Verbindung markiert ist, müssen Sie keepalive, wird dieser Zähler nicht
weitere
Einige andere Quellen besagen, dass dies ist die Zeit, die eine Verbindung im Leerlauf ist, aber Sie nicht weiter zu definieren, was das bedeutet. Ich schaute auch in Stevens zu finden, eine formale definition dazu, weil ich mich Frage, was "das Letzte Datenpaket gesendet" bedeutet eigentlich, wenn man bedenkt Weiterverbreitung.
In meinem test-Fall habe ich eine Verbindung, bei der Daten nur dann gesendet werden, von einem server zu einem client zu einem Recht hohen Preisen. Um zu testen, keepalive, wir unplugged die Kabel auf der client-NIC. Ich kann jetzt sehen, dass der Netzwerk-stack versucht, Daten zu senden und in die Weiterverbreitung Zustand, aber keine keep-alive-probe gesendet wird. Ist es korrekt, dass keep-alive Sonden werden nicht gesendet, während Weiterverbreitung?
- Wenn Sie 'senden zu einem Recht hohen Preisen "Ihre" Anforderung zum aktivieren der TCP-keepalive' nicht sinnvoll in den ersten Platz.
- Wir haben andere verbindungen, die z.B. keine Daten gesendet werden, und andere, die senden nur bei niedrigen Preisen. Darüber hinaus ist es eine Anforderung direkt auferlegt, die uns von unseren Kunden. Sie nutzen es weltweit.
- Ich nehme an, Sie beziehen sich auf Einstellung, SO_KEEPALIVE, auf alle Ihre verbindungen (der Standardwert ist "off")? Wenn Sie sehen nur ein keepalive-Paket nach (der Standard auf linux ist 2 Stunden), aber dann das entfernen trick funktionieren sollte (wenn es sendet keine weiteren Daten).
- Ja, wir hatten zu aktivieren, lebendig zu halten, die auf alle verbindungen standardmäßig als obligatorische Anforderung der Kunden. Die Zeit, bis der erste keep-alive Paket gesendet wird, beinhaltet auch die TCP-retry Zeit. cnicutar die Antwort liefert die details.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Dann wirst du nie sehen keepalives. Keepalives gesendet werden, wenn es "silence on the wire". RFC1122 hat eine Erklärung Rück-keepalives.
Zurück zu deiner Frage:
Dies ist, wie lange die TCP wartet, bevor Stossen die peer - "hoy! noch am Leben?".
In anderen Worten, Sie ' ve wurde mit einer TCP-Verbindung, und es war großartig. Allerdings, für die letzten 2 Stunden gibt es nichts zu senden. Ist es vernünftig, davon auszugehen, die Verbindung ist noch am Leben? Ist es vernünftig, anzunehmen, dass alle die middleboxes in der Mitte noch Staat über Ihre Verbindung? Meinungen sind unterschiedlich und keepalives sind nicht Teil der RFC793.
Dies ist nicht keepalive-Tests. Dies ist die Prüfung Ihres TCPs erneut die Strategie, d.h. wie oft und wie oft TCP versucht, Ihre Botschaft zu vermitteln. Auf einer Linux-box das (wahrscheinlich) landet Prüfung
net.ipv4.tcp_retries2
:Aber RFC5482 - Benutzer TCP-Timeout-Option bietet mehr Möglichkeiten, es zu beeinflussen.
Zurück zu der Frage:
Macht es Sinn: TCP versucht schon zu entlocken eine Antwort von der anderen peer, eine leere keepalive wäre überflüssig.
Linux-spezifische (2.4+) Optionen zu beeinflussen, keepalive -
Linux-spezifische (2.6.37+) option zu beeinflussen Benutzer TCP-Timeout
So zum Beispiel könnte Ihre Anwendung verwenden Sie diese option, um festzulegen, wie lange die Verbindung überlebt, wenn es keine Verbindung (ähnlich wie die NIC-ausstecken Beispiel). E. g. wenn Sie Grund haben zu glauben, die Kunden kommen wieder (vielleicht schlossen Sie den laptop-Deckel? fleckige wireless access?) Sie können geben Sie ein Zeitlimit von 12 Stunden und wenn Sie wieder kommen, die Verbindung wird immer noch funktionieren.
TCP_KEEPIDLE
,TCP_KEEPINTVL
undTCP_KEEPCNT
Optionen fürsetsockopt()
zum einstellen der Leerlaufzeit vor dem Sondieren beginnt, das Zeitintervall zwischen den Sonden und der max Anzahl der Sonden zu senden, bzw.