2010-11-29 10 views
0

für TCP-Verbindung zu senden, ist es eine Möglichkeit, ein ACK-Paket auf die andere Seite, ohne dass andere Daten (nur die ack-Paket) in Solaris 10.Wie ein ACK-Paket in Solaris10

ich, dass wir wissen, senden tun können Dies wird durch TCP Keep Alive-Option, aber es ist in Solaris 10 unterstützt.

+0

Sie aus einer Anwendung bedeutet nicht, oder Sie beziehen sich nur auf den Betrieb des TCP-Stack? – EJP

+0

In der Tat möchte ich die TCP-Trennung erkennen. Da Solaris 10 die Option Tcp keep alive nicht unterstützt, möchte ich einen anderen Weg finden; vielleicht wird eine Funktion wie get_socket_status (kein Systemaufruf) ein Ack-Paket senden und den Verbindungsstatus zurückgeben. –

+0

Das würde nicht helfen. Das Keep Alive ACK funktioniert, weil es für die 'falsche' Sequenznummer ist, also provoziert es eine Antwort mit dem korrekten aktuellen Seqno. Laut meiner Antwort gibt es keinerlei API, die nur ein ACK sendet. Und es gibt keine API, die eine Trennung außer Lesen und Schreiben erkennt. – EJP

Antwort

2

Die zuverlässige Methode zur Erkennung von Verbindungsabbrüchen besteht darin, eine Nachricht vom Typ "null/ping/echo" in das Protokoll auf Anwendungsebene zu schreiben und von Ihrer Anwendung in regelmäßigen Abständen senden zu lassen. Wenn es keine zeitnahe Antwort erhält, kann davon ausgegangen werden, dass die Verbindung unterbrochen wurde. Die meisten Protokolle, die langlebige Verbindungen beinhalten sollen, beinhalten eine solche Nachricht (zum Beispiel IRC, IMAP und SSH).

(Immerhin, auch wenn Sie blank TCP ACK-Nachrichten senden konnten, muss das andere Ende nicht antworten, da es keine Daten mehr an ACK selbst erhalten hat).

+0

Sie letzte Aussage ist zweifelhaft. Der TCP/IP-Keepalive-Mechanismus basiert darauf, dass das andere Ende auf Datenless-Ack-Pakete antwortet. – jlliagre

+0

@jlliagre: [Es scheint, dass] (http://bugs.opensolaris.org/view_bug.do?bug_id=4037313) eine solche Antwort tatsächlich optional ist. Viele TCPs senden Keepalives mit einem Byte doppelter Payload, die eine Antwort erfordern. – caf

+0

Der Link, den Sie gepostet haben, sagt nicht, dass die Antwort optional ist. Auf der anderen Seite wurde das Antworten nicht als Fehler angesehen. Außerdem wurde dieser Bug vor dreizehn Jahren behoben und bezog sich auf "Einige ältere Implementierungen", die dieses Byte doppelter Nutzlast erforderten. Der RFC 1122 gibt an, dass sie falsch sind. Sind Sie sicher, dass es immer noch aktive TCP/IP-Implementierungen gibt, die dies erfordern? – jlliagre

2

Wenn Sie nur empfangen, sendet der TCP-Stack viele ACKs ohne Daten allein. Es gibt jedoch keine Möglichkeit, ein ACK irgendeiner Art aus einer Anwendung zu senden.

+0

Beachten Sie jedoch, dass es mit Solaris 11 Express eine Möglichkeit für die Anwendung gibt, diese ACKs über die TCP/IP-Schicht zu senden. – jlliagre

+0

Eh? Sie können die TCP/IP-Schicht nicht daran hindern, ACKs zu senden. Beziehen Sie sich hier auf TCP Keepalive? – EJP

+0

In der Tat. Darum geht es ja in der Frage, nicht regelmäßig. – jlliagre

1

Sie erste Entsendung Staaten Solaris 10 unterstützt TCP alives halten und später, dass es funktioniert ... nicht

Solaris TCP Keep-Alive-global mit dem Befehl ndd unterstützt Einstellung, zB:

ndd -set /dev/tcp tcp_keepalive_interval 120000 

Open und Solaris 11 Express-Unterstützung pro Socket-Keepalive-Einstellungen. Sie können es mit SO_KEEPALIVE aktivieren und mit TCP_KEEPALIVE_THRESHOLD und TCP_KEEPALIVE_ABORT_THRESHOLD optimieren.

http://docs.oracle.com/cd/E19082-01/819-2254/6n4iaov75/index.html