Какой по умолчанию тайм-аут TCP-соединения в Windows? Есть ключ реестра для настройки или он задается динамически?
В Windows значение является динамическим для установлен соединения, хотя по умолчанию для начальные связи 72 секунды. Настройки реестра определены в этой статье:
http://technet.microsoft.com/en-us/library/cc739819(WS.10).aspx
HKEY_LOCAL_MACHINE \ SYSTEM \ CurrentControlSet \ Services: \ Tcpip \ Parameters
TcpInitialRTT: Определяет начальные настройки тайм-аута для новых подключений. Это число в секундах удваивается при каждой повторной передаче перед тем, как установить соединение. По умолчанию 3.
TcpMaxConnectRetransmissions: Определяет количество повторных передач перед тем, как установить соединение. По умолчанию 5.
Обычно «таймаут подключения» относится к тайм-ауту для создания начального соединения с хостом. Во многих системах (включая Windows 7) это значение настраивается отдельно от тайм-аутов для продолжающейся связи после установления соединения. В этом ответе рассматривается сценарий «начального подключения» для Windows 7, который отличается от XP.
Для Windows 7 требуются два исправления для поддержки настройки параметров тайм-аута подключения. Новые параметры можно настроить с помощью команды netsh.
Из статьи об исправлении 2786464:
Примечание. В Windows 7 и Windows Server 2008 R2 максимальное значение повторной передачи SYN TCP (JH: MaxSynRetransmissions) установлено равным 2 и не настраивается. Из-за 3-секундного ограничения начального значения тайм-аута (JH: InitialRTO) трехстороннее квитирование TCP ограничено 21-секундным таймфреймом (3 секунды + 2 * 3 секунды + 4 * 3 секунды = 21 секунда. ).
Первое исправление добавляет параметр «MaxSynRetransmissions», который позволяет изменить параметр повторной попытки со значения по умолчанию, равного 2. Второе добавляет параметр «InitialRto», который позволяет изменять значение исходного RTO по умолчанию, равное 3000 мс (да, миллисекунды), но только на что-то короче 3000 мс; его нельзя увеличить. В зависимости от вашей ситуации вам может понадобиться только исправление MaxSynRetransmissions.
Установите оба исправления, перезагрузитесь, затем откройте командное окно от имени администратора. Дальнейшие перезагрузки не требуются для последующих вызовов команды netsh.
C:\Windows\system32>NET SESSION >nul 2>&1
C:\Windows\system32>IF %ERRORLEVEL% EQU 0 (ECHO Administrator PRIVILEGES Detected!) ELSE ( ECHO NOT AN ADMIN! )
Administrator PRIVILEGES Detected!
C:\Windows\system32>netsh interface tcp show global
Querying active state...
TCP Global Parameters
----------------------------------------------
Receive-Side Scaling State : enabled
Chimney Offload State : automatic
NetDMA State : enabled
Direct Cache Acess (DCA) : disabled
Receive Window Auto-Tuning Level : normal
Add-On Congestion Control Provider : none
ECN Capability : disabled
RFC 1323 Timestamps : disabled
Initial RTO : 3000
Non Sack Rtt Resiliency : disabled
Max SYN Retransmissions : 2
** The above autotuninglevel setting is the result of Windows Scaling heuristics
overriding any local/policy configuration on at least one profile.
C:\Windows\system32>cmd /v:on /c "echo !TIME! & telnet 192.168.1.254 & echo !TIME!"
14:10:30.53
Connecting To 192.168.1.254...Could not open connection to the host, on port 23: Connect failed
14:10:51.60
C:\Windows\system32>netsh interface tcp set global MaxSynRetransmissions=3
Ok.
C:\Windows\system32>netsh interface tcp show global
Querying active state...
TCP Global Parameters
----------------------------------------------
Receive-Side Scaling State : enabled
Chimney Offload State : automatic
NetDMA State : enabled
Direct Cache Acess (DCA) : disabled
Receive Window Auto-Tuning Level : normal
Add-On Congestion Control Provider : none
ECN Capability : disabled
RFC 1323 Timestamps : disabled
Initial RTO : 3000
Non Sack Rtt Resiliency : disabled
Max SYN Retransmissions : 3
** The above autotuninglevel setting is the result of Windows Scaling heuristics
overriding any local/policy configuration on at least one profile.
C:\Windows\system32>cmd /v:on /c "echo !TIME! & telnet 192.168.1.254 & echo !TIME!"
14:27:02.33
Connecting To 192.168.1.254...Could not open connection to the host, on port 23:
Connect failed
14:27:47.41
C:\Windows\system32>netsh interface tcp set global MaxSynRetransmissions=2
Ok.
C:\Windows\system32>netsh interface tcp set global InitialRto=1000
Ok.
C:\Windows\system32>netsh interface tcp show global
Querying active state...
TCP Global Parameters
----------------------------------------------
Receive-Side Scaling State : enabled
Chimney Offload State : automatic
NetDMA State : enabled
Direct Cache Acess (DCA) : disabled
Receive Window Auto-Tuning Level : normal
Add-On Congestion Control Provider : none
ECN Capability : disabled
RFC 1323 Timestamps : disabled
Initial RTO : 1000
Non Sack Rtt Resiliency : disabled
Max SYN Retransmissions : 2
** The above autotuninglevel setting is the result of Windows Scaling heuristics
overriding any local/policy configuration on at least one profile.
C:\Windows\system32>cmd /v:on /c "echo !TIME! & telnet 192.168.1.254 & echo !TIME!"
14:29:06.13
Connecting To 192.168.1.254...Could not open connection to the host, on port 23:
Connect failed
14:29:13.20
Примечание. Телнет Windows используется в качестве справки для определения фактического тайм-аута соединения. Его нужно устанавливать отдельно, но это несложно.
Дополнительные ссылки / похвалы:
TcpInitialRTT и TcpMaxConnectRetransmissions могут отсутствовать в Vista и Windows 2008. Этот документ Microsoft не включает их. http://download.microsoft.com/download/c/2/6/c26893a6-46c7-4b5c-b287-830216597340/TCPIP_Reg.doc
И это говорит о том, что по крайней мере TcpInitialRTT исчез, хотя я не знаю, насколько он надежен. http://pul.se/Blog-Post-TCP-IP-Stack-harpting-in-Operating-Systems-starting-with-Windows-Vista_SharePoint-kHPTTCP0WJ5,7zq00hH0wINE
Если я правильно понял ваш вопрос, вы имеете в виду:
TcpTimedWaitDelay
Этот ключ определяет время, которое должно пройти, прежде чем TCP / IP сможет освободить закрытое соединение и повторно использовать его ресурсы. Этот интервал между закрытием и освобождением известен как состояние TIME_WAIT или состояние, в два раза превышающее максимальное время жизни сегмента (2MSL). В течение этого времени повторное открытие соединения с клиентом и сервером стоит меньше, чем установка нового соединения. Уменьшая значение этой записи, TCP / IP может быстрее освобождать закрытые соединения и предоставлять больше ресурсов для новых соединений. Отрегулируйте этот параметр, если для работающего приложения требуется быстрое освобождение, создание новых соединений или корректировка из-за низкой пропускной способности, вызванной множественными соединениями в состоянии TIME_WAIT.
Точный ключ: HKEY_LOCAL_MACHINE \ SYSTEM \ CurrentControlSet \ Tcpip \ Parameters \ TcpTimedWaitDelay
У вас может не быть этого параметра, если вы используете Win2008 или более позднюю версию, но по умолчанию используется десятичное значение 240 (240 секунд или 4 минуты). Вы можете добавить ключ в реестр с другим значением, и он вступит в силу после перезагрузки (проверено на Windows Server 2008R2 в производственной среде). Это абсурдно высокая стоимость с учетом качества современных сетей.
Буквально меньше месяца назад у меня было приложение, работающее на сервере, которое исчерпало максимальное количество подключений, которое Windows может поддерживать, и регулярно отключало все сетевые службы на этом сервере. Более 16 000 подключений в netstat -a, даже если вам удается подключиться к серверу по RDP. Мы установили значение 30 десятичных знаков (30 секунд) и вуаля, проблема была решена - менее 10 000 одновременных подключений (поскольку приложение быстро открывало и закрывало их) и никаких проблем с производительностью.