https verweilende TIME_WAIT-Verbindungen

7

Von meinem Client-PC aus verbinde ich mich mit einem Webserver. Er verwendet nur HTTPS.

Wenn ich eine Verbindung herstelle, werden in TCPView (sysinternals tool alternative zu netstat) viele TIME_WAIT-Verbindungen zum https-Endpunkt angezeigt. In TIME_WAIT sehe ich oft 11 Verbindungen, die 2 Minuten lang verweilen. Und das ist jedes Mal, wenn ich eine Anfrage mache. 2-4 Verbindungen bleiben in ESTABLISHED so lange offen, wie ich die Server eingestellt habeKeep-Alive: timeout=xx

Die letzteren Verbindungen sind in Ordnung und werden entsprechend wiederverwendet. Die früheren Verbindungen bauen sich auf und dauern die vollen 2 Minuten.

Ich habe den Datenverkehr mit WireShark erfasst und die normalen FIN-, ACK- usw. Passby-Vorgänge an den Quellports der verbleibenden Verbindung gesehen. Ich habe häufig gesehen, dass Chrome und IE (beide verwenden den Windows-HTTP-Stack) 6 TCP-Anforderungen ausgeben, bevor eine Anforderung mit echten Daten eingeht. Die Nutzlast ist klein (ca. 2000 Bytes).

Firefox gibt diese Anfragen überhaupt nicht aus ...

Es ist auch erwähnenswert, dass das Zertifikat selbstsigniert ist und nicht im Browser überprüft wird (Firefox hat eine völlig andere Art, damit umzugehen als Chrome).

Warum gibt mein Browser diese Anfragen aus? Warum gibt Firefox diese TCP-Verbindungen nicht aus?

BEARBEITEN, dies ist ein Dump von der ersten Verbindung, die Chrome herstellt (erfasst mit Wireshark):

    "https","0.000000",local-ip,dest-ip,"443","TCP","53890 > https [SYN] Seq=0 Win=8192 Len=0 MSS=1460 WS=8 SACK_PERM=1"
    "53890","0.012749",dest-ip,local-ip,"53890","TCP","https > 53890 [SYN, ACK] Seq=0 Ack=1 Win=65535 Len=0 MSS=1400 WS=1 SACK_PERM=1"
    "https","0.012828",local-ip,dest-ip,"443","TCP","53890 > https [ACK] Seq=1 Ack=1 Win=65792 Len=0"
    "53890","0.025979",dest-ip,local-ip,"53890","TCP","https > 53890 [ACK] Seq=1 Ack=222 Win=128578 Len=0"
    "53890","0.026099",dest-ip,local-ip,"53890","TLSv1.1","Server Hello, Certificate, Server Hello Done"
    "53890","0.038848",dest-ip,local-ip,"53890","TCP","https > 53890 [ACK] Seq=1093 Ack=436 Win=128364 Len=0"
    "53890","0.040474",dest-ip,local-ip,"53890","TLSv1.1","Change Cipher Spec, Encrypted Handshake Message"
    "https","0.041191",local-ip,dest-ip,"443","TCP","53890 > https [FIN, ACK] Seq=436 Ack=1168 Win=64512 Len=0"
    "53890","0.053312",dest-ip,local-ip,"53890","TCP","https > 53890 [ACK] Seq=1168 Ack=437 Win=128364 Len=0"
    "53890","0.053313",dest-ip,local-ip,"53890","TCP","https > 53890 [FIN, PSH, ACK] Seq=1168 Ack=437 Win=128364 Len=0"
    "https","0.053345",local-ip,dest-ip,"443","TCP","53890 > https [ACK] Seq=437 Ack=1169 Win=64512 Len=0"
Jaap
quelle
Was genau ist deine Frage? Wenn Sie eine Frage zum Datenverkehr haben, den ein Browser generiert, fügen Sie bitte ein Beispiel für diesen Datenverkehr bei. In Ihrem Titel wird jedoch TIME_WAIT erwähnt, was etwas ganz anderes ist. Bitte versuchen Sie, Ihre Frage zu klären. Wenn Sie zwei Fragen haben, stellen Sie diese separat.
Michael Hampton
Dies hat mit HTTPS zu tun. Es werden Verbindungen vom Windows-TCP-Stapel hergestellt, die in TIME_WAIT (netstat) verbleiben. Firefox gibt diese Anforderungen nicht aus. Wenn es einfach wäre, einen TCP-Dump einzuschließen, würde ich, aber da es SSL ist, kann man nicht wirklich sagen ...
Jaap
1
TIME_WAIT ist völlig normal und es gibt ungefähr 10.000 Websites, die erklären, was es ist und warum es dort ist.
Michael Hampton
Ich weiß, dass es so ist, lesen Sie wie 0,1% von ihnen (was viel ist!), Aber ich versuche, den Unterschied zwischen dem TCP-Stack von Firefox und Windows (das von IE und Chrome gemeinsam genutzt wird) zu verstehen.
Jaap
1
Alle Windows-Programme verwenden den Windows IP-Stapel (TCP). Chrome und IE teilen nichts außerhalb von Windows-API-Aufrufen, ihre HTTP-Protokollstapel sind unabhängig. Chrome verwendet WebKit tatsächlich für sein Backend, das es mit Safari und einem Dutzend anderer Browser teilt. In ähnlicher Weise verwendet Firefox Gecko, IE Trident und die Liste geht weiter.
Chris S

Antworten:

3

Das ist völlig normal.

Jede neue Anfrage Ihres Browsers an den Webserver ist eine TCP-Verbindung, die einen neuen Socket verwendet.

Nach dem Handshake, der Datenübertragung und dem ordnungsgemäßen Schließen befinden sich die Sockets in TIME_WAIT, bis der Timer des Kernels abläuft.

Der TIME_WAIT-Timer ist im TCP-RFC (RFC 793) als 2x die maximale Segmentlebensdauer definiert. Die MSL wird willkürlich als 2 Minuten definiert.

Abhängig von der Implementierung von TCP im Betriebssystem kann dieser Timer eingehalten werden oder nicht. Beispielsweise variierten ältere BSDs TIME_WAIT zwischen 1 Minute und 4 Minuten.

suprjami
quelle
Wird dadurch ein Socket auf dem Server geöffnet bleiben? Oder ist es nur eine Frage der Ressourcen auf meinem lokalen Computer?
Jaap
Die TCP-Verbindung selbst wurde mit einem ordnungsgemäßen FIN / ACK geschlossen. Auf diesem Socket sollten keine Daten mehr gesendet oder empfangen werden. Sobald die Serveranwendung close () für ihren Socket aufruft, wechselt der Server-Socket von CLOSE_WAIT zu "away" und der Server hat keinen Speicher mehr für den Socket. Ein TIME_WAIT-Socket verbraucht keinen Dateideskriptor auf dem Client und verbraucht nur wenig Speicher (nur ein paar hundert Bytes).
Suprjami