Während ich an einer Serveranwendung arbeitete, die unter FreeBSD läuft und TCP verwendet, bemerkte ich, dass TCP-Keepalive-Tests gesendet werden, obwohl meine Anwendung SO_KEEPALIVE auf TCP-Sockets ausdrücklich deaktiviert.
EntsprechendRFC1122 Abschnitt 4.2.3.6(TCP-Keepalives):
„Wenn Keep-Alives enthalten sind, MUSS die Anwendung in der Lage sein, sie für jede TCP-Verbindung ein- oder auszuschalten, und sie MÜSSEN standardmäßig deaktiviert sein.“
Ich habe festgestellt, dass der einstellbare Parameternet.inet.tcp.always_keepaliveaktiviert (auf 1 gesetzt) war und dass das Deaktivieren das Senden der Keepalive-Sonden verhindern würde.
Was ist der Grund für die Einbeziehung dieses Verhaltens in FreeBSD? Soweit ich weiß, gibt es unter Linux und Windows keine solche Option, unter FreeBSD und Mac OS X jedoch schon. Sie verstoßen also gegen die RFC.
Um genauer zu sein: Unter welchen Umständen wäre es sinnvoll, die Wünsche der Anwendung zu ignorieren?
In meinem Fall lässt sich das Problem problemlos beheben, da ich die Option deaktivieren kann, aber ich würde gerne verstehen, warum sie da ist.
Diese Fragezeigt, dass sich Linux gemäß RFC verhält.
Antwort1
Die Begründung für die standardmäßige Aktivierung von Keep-Alive lautet wie folgt:https://svnweb.freebsd.org/base?view=revision&revision=47752
Fügen Sie einen Handle hinzu, um globale TCP-Keepalives zu steuern und sie als Standard zu aktivieren.
Trotz ihres Namens hält es TCP-Sitzungen nicht aufrecht, sondern beendet sie, wenn das andere Ende abwesend ist. Dies passiert häufig bei Clients, die NAT oder dynamische IP-Zuweisung verwenden oder deren Betriebszeit eine Obergrenze von 2^32 * 10^-3 Sekunden hat.
Es gibt dadurch keinen erkennbaren Anstieg des Netzwerkverkehrs: zwei minimale TCP-Pakete alle zwei Stunden für eine Live-TCP-Verbindung.
Viele Server aktivieren Keepalives bereits selbst.
Das RFC mit den Host-Anforderungen ist 10 Jahre alt und kennt die abnehmende Zahl an Clients im heutigen Internet nicht.
Trotzdem ist es besser, Keep-Alive auszuschalten, wenn die Anwendung dies verlangt, zum Beispiel (in C):
int val = 0;
setsockopt(s, SOL_SOCKET, SO_KEEPALIVE, &val, sizeof(val));
aber es ist nicht einfach, das zu beheben.
Antwort2
Ich denke, der abstimmbare Knopf sollte vorhanden sein, aber vielleicht wäre es besser, ihn standardmäßig ausgeschaltet zu lassen.
Meine Begründung lautet wie folgt: Ein Anwendungsentwickler kann bei solchen Entscheidungen falsche Entscheidungen treffen, und letzten Endes sollte ein Systemadministrator und nicht der Anwendungsentwickler die Kontrolle über derartige Netzwerkrichtlinien haben.