TCP Three-Way-Handshake and TIME_WAIT

Hallo zusammen,

Vor einiger Zeit hatte ich auf einem Server ein Problem, weil zuviele Connections im Status TIME_WAIT waren. Deshalb musste ich mich mal wieder ein bisschen mit dem Netzwerkgrundlagen beschäftigen.

Zu diesem Zweck habe ich ein VBS Script geschrieben, welches eine Verbindung zum SQL Server herstellt, ein Query macht und dann die Verbindung wieder schliesst.

Verbindungsaufbau

Der Verbinungsaufbau geschieht über einen 3-way TCP Handshake (SYN, SYN / ACK, ACK)

Der Client sendet ein SYN Packet an den Server

Der Server antwortet mit einem SYN und ACK

Der Client sendet nun ein ACK - die Verbindung ist damit aufgabaut und hat einen Status von ESTABLISHED

Das kann man auch mit dem Sysinternals TCPView anschauen.

Verbindungsabbau

Nach dem Query wird die Verbindung wieder abgebaut. Dies passiert von jeder Seite über ein (FIN, ACK)

Der Client sendet ein FIN Packet an den Server

Der Server sendet ein ACK für das empfangene FIN Packet.

Nun sendet der Server ein FIN Packet an den Client.

Der Client bestätigt das empfagene FIN Packet mit einem ACK

Die Verbindung ist nun eigentlich abgebaut verbleibt aber im Status TIME_WAIT. Man sieht auch gut, dass nun nicht mehr Wscript.exe der eigentümer der Connection ist, sondern der System Prozess.

Unter Windows7 wo ich getestet habe, bleibt die Verbindung volle 2 Minuten im Status TIME_WAIT danach wird die Verbinung endgültig geschlossen.

Das ganze kann auch ohne TCPView im Command Promt mit dem netstat Befehl angeschaut werden.

netstat -an | findstr 1433

Wie lange die Zeit des TIME_WAIT ist kann über die Registry gesteuert werden. Ich habe mal 30 Sekunden eingetragen. Nach dem Reboot, werden die Connections nach 30 Sekunden geschlossen.

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\Tcpip\Parameters]
"TcpTimedWaitDelay"=dword:0000001e

Weitere Information

Explaining Close_Wait
http://blogs.technet.com/b/janelewis/archive/2010/03/09/explaining-close-wait.aspx

TCP Connection States and Netstat Output
http://support.microsoft.com/kb/137984

Difference between close_wait and time_wait
http://j2eedebug.blogspot.ch/2008/12/difference-between-closewait-and.html

TcpTimedWaitDelay
http://technet.microsoft.com/en-us/library/cc938217.aspx

Grüsse
Andres Bohren