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