Microsoft MVP성태의 닷넷 이야기
글쓴 사람
정성태 (techsharer at outlook.com)
홈페이지
첨부 파일
 
(연관된 글이 3개 있습니다.)
(시리즈 글이 3개 있습니다.)
.NET Framework: 116. 소켓 연결 시간 제한
; https://www.sysnet.pe.kr/2/0/629

.NET Framework: 272. 소켓 연결 시간 제한 - 두 번째 이야기
; https://www.sysnet.pe.kr/2/0/1177

개발 환경 구성: 457. 윈도우 응용 프로그램의 Socket 연결 시 time-out 시간 제어
; https://www.sysnet.pe.kr/2/0/12015




윈도우 응용 프로그램의 Socket 연결 시 time-out 시간 제어

일단 기본적인 제어는,

Which is the default TCP connect timeout in Windows?
; https://serverfault.com/questions/193160/which-is-the-default-tcp-connect-timeout-in-windows

Appendix A: TCP/IP Configuration Parameters
; https://learn.microsoft.com/en-us/previous-versions/windows/it-pro/windows-server-2003/cc739819(v=ws.10)

TcpInitialRTT: Defines what the initial time-out settings are for new connections. This number in seconds is doubled each time it retransmits before timing a connection out. Defaults to 3.

TcpMaxConnectRetransmissions: Defines the number of retransmissions before timing a connection out. Defato 5.

How to set TCP/IP abort interval or timeout in Windows XP?
; https://superuser.com/questions/339959/how-to-set-tcp-ip-abort-interval-or-timeout-in-windows-xp

TcpInitialRTT, TcpMaxConnectRetransmissions 관련 값들을 통해 이뤄집니다. 그런데 이게 윈도우 서버 2008 R2/7까지는 레지스트리 설정(HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters)으로 가능한 반면, 2012를 기점으로 netsh 관리로 통합이 됩니다.

테스트를 간단하게 만들기 위해 최신 버전 기준인 Windows Server 2019에서 TcpInitialRTT, TcpMaxConnectRetransmissions 값을 다음의 명령어로 구할 수 있고,

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.

/*
[(개인적으로 테스트 중인) 운영체제별 기본값]

Windows Server 2012 R2: TcpInitialRTT (3000), TcpMaxConnectRetransmissions (2) - timeout 21초
Windows Server 2016:    TcpInitialRTT (3000), TcpMaxConnectRetransmissions (2) - timeout 21초
Windows Server 2019:    TcpInitialRTT (3000), TcpMaxConnectRetransmissions (2) - timeout 21초 
Windows Server 2022:    TcpInitialRTT (1000), TcpMaxConnectRetransmissions (4) - timeout 31초 
*/

해당 값들의 변경은 이런 식으로 할 수 있습니다.

C:\Windows\system32> netsh interface tcp set global MaxSynRetransmissions=2
Ok.

C:\Windows\system32> netsh interface tcp set global InitialRto=1000
Ok.

그럼, 실제로 Socket 코드를 다음과 같이 작성하고,

using (Socket clntSock = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp))
{
    var entry = Dns.GetHostEntry(target);
    clntSock.Connect(new IPEndPoint(entry.AddressList[0], port));
}

기본 값 상태에서,

TcpInitialRTT == 3000
TcpMaxConnectRetransmissions == 2

외부 인터넷 망에 있는 서버를 대상으로 listening하지 않는 포트에 대해 테스트를 해보면 21초가 걸리는 것을 확인할 수 있습니다.

c:\temp> ConsoleApp1.exe www.sysnet.pe.kr 8032
21203.2789

21초가 걸린 이유는 계산 결과와,

RTO: 3000 = 3초
1번 재시도: 3000 * 2 = 6초
2번 재시도: 6000 * 2 = 12초
-------------------------------
총 21초

일치합니다. 그럼, 설정값을 변경도 해봐야겠지요. ^^

TcpInitialRTT == 2000
TcpMaxConnectRetransmissions == 2

RTO: 2000 = 2초
1번 재시도: 2000 * 2 = 4초
2번 재시도: 4000 * 2 = 8초
-------------------------------
총 14초

실행해 보면,

c:\temp>ConsoleApp1.exe
14042.6988

예상했던 데로, 대략 14초(14000ms)가 걸렸습니다.




참고로, TcpInitialRTT, TcpMaxConnectRetransmissions 값을 조절하다 보면 Connection Timeout 시간이 지나치게 오래 걸릴 수 있는데,

TcpInitialRTT == 3000
TcpMaxConnectRetransmissions == 5

RTO: 3000 = 3초
1번 재시도: 3000 * 2 = 6초
2번 재시도: 6000 * 2 = 12초
3번 재시도: 12000 * 2 = 24초
4번 재시도: 24000 * 2 = 48초
5번 재시도: 48000 * 2 = 96초
-------------------------------
총 189초

정작 실행해 보면 100초 정도에 끝납니다.

c:\temp>ConsoleApp1.exe
100058.9233

왜냐하면, 최댓값이 100초이기 때문입니다. 관련해서 다음의 Q&A를 보면,

Window registy: TCPMaxConnectRetransmissions
; https://social.technet.microsoft.com/Forums/windows/en-US/110271d5-5221-44b4-af14-f07f3fa01a73/window-registy-tcpmaxconnectretransmissions?forum=w7itpronetworking

Windows 2003에서는 최댓값이 120초라고 하니 이것 역시 윈도우 버전마다 다를 수 있습니다.




경험상, 이와 관련된 값들을 굳이 설정해야 한다면 반드시 해당 환경에서 테스트를 해보는 것이 좋습니다. 일례로 예전에 소개했던 장애 환경의 경우,

.NET Remoting에서 서비스 호출 시 SYN_SENT로 남는 현상
; https://www.sysnet.pe.kr/2/0/11998

원인은 알 수 없었지만 일단 TcpInitialRTT, TcpMaxConnectRetransmissions 레지스트리 값을 조정한 경우 연결 시간은 제어가 되었는데 - 즉, SYN_SENT로 남는 시간을 제어할 수 있었지만 아쉽게도 시스템이 일정 시간 동작한 후에는 다시 무한대의 time-out 시간으로 바뀌는 현상이 발생했습니다. 일단 그런 경우도 있다는 것을 알아만 두시고. ^^

그 외에, maxsynretransmissions과 initialrto에 설정 가능한 값의 범위는 netsh 도움말에 나옵니다.

C:\> netsh interface tcp set global ?

Usage: set global [[rss=]disabled|enabled|default]
             [[autotuninglevel=]
                disabled|highlyrestricted|restricted|normal|experimental]
             [[congestionprovider=]none|ctcp|default]
             [[ecncapability=]disabled|enabled|default]
             [[timestamps=]disabled|enabled|default]
             [[initialrto=]<300-3000>]
             [[rsc=]disabled|enabled|default]
             [[nonsackrttresiliency=]disabled|enabled|default]
             [[maxsynretransmissions=]<2-8>]
             [[fastopen=]disabled|enabled|default]
             [[fastopenfallback=]disabled|enabled|default]
             [[hystart=]disabled|enabled|default]
             [[pacingprofile=]off|initialwindow|slowstart|always|default]
...[생략]...

기타... Windows Server 2008 R2 이하에서는 "netsh interface tcp show global" 명령어의 출력이 다음과 같습니다.

C:\Windows\system32> netsh interface tcp show global
Querying active state...

TCP Global Parameters
----------------------------------------------
Receive-Side Scaling State          : enabled
Chimney Offload State               : disabled
Receive Window Auto-Tuning Level    : disabled
Add-On Congestion Control Provider  : ctcp
ECN Capability                      : disabled
RFC 1323 Timestamps                 : disabled




[이 글에 대해서 여러분들과 의견을 공유하고 싶습니다. 틀리거나 미흡한 부분 또는 의문 사항이 있으시면 언제든 댓글 남겨주십시오.]

[연관 글]






[최초 등록일: ]
[최종 수정일: 4/22/2025]

Creative Commons License
이 저작물은 크리에이티브 커먼즈 코리아 저작자표시-비영리-변경금지 2.0 대한민국 라이센스에 따라 이용하실 수 있습니다.
by SeongTae Jeong, mailto:techsharer at outlook.com

비밀번호

댓글 작성자
 




... 106  107  108  109  [110]  111  112  113  114  115  116  117  118  119  120  ...
NoWriterDateCnt.TitleFile(s)
11208정성태5/25/201728936오류 유형: 390. diskpart의 set id 명령어에서 "The specified type is not in the correct format." 오류 발생
11207정성태5/24/201729794Windows: 142. Windows 10의 복구 콘솔로 부팅하는 방법
11206정성태5/24/201722999오류 유형: 389. DISM.exe - The specified image in the specified wim is already mounted for read/write access.
11205정성태5/24/201722666.NET Framework: 658. C#의 tail call 구현은? [1]
11204정성태5/22/201732180개발 환경 구성: 316. 간단하게 살펴보는 Docker for Windows [7]
11203정성태5/19/201719513오류 유형: 388. docker - Host does not exist: "default"
11202정성태5/19/201720716오류 유형: 387. WPF - There is no registered CultureInfo with the IetfLanguageTag 'ug'.
11201정성태5/16/201724201오류 유형: 386. WPF - .NET 3.5 이하에서 TextBox에 한글 입력 시 TextChanged 이벤트의 비정상 종료 문제 [1]파일 다운로드1
11200정성태5/16/201720978오류 유형: 385. WPF - 폰트가 없어 System.IO.FileNotFoundException 예외가 발생하는 경우
11199정성태5/16/201722170.NET Framework: 657. CultureInfo.GetCultures가 반환하는 값
11198정성태5/10/201724166.NET Framework: 656. Windows Forms의 오류(Exception) 처리 방법에 대한 차이점 설명
11197정성태5/8/201720478개발 환경 구성: 315. VHD 파일의 최소 크기파일 다운로드1
11196정성태5/4/201721902오류 유형: 384. Msvm_ImageManagementService WMI 객체를 사용할 때 오류 상황 정리 [1]
11195정성태5/3/201722638.NET Framework: 655. .NET Framework 4.7 릴리스
11194정성태5/3/201724159오류 유형: 383. net use 명령어로 네트워크 드라이브 연결 시 "System error 67 has occurred." 오류 발생
11193정성태5/3/201722175Windows: 141. 설치된 Windows로부터 설치 이미지를 만드는 방법
11192정성태5/2/201723545Windows: 140. unattended.xml/autounattend.xml 파일을 마련하는 방법
11191정성태5/2/201724323Windows: 139. Dell Venue 8 Pro 태블릿에 USB를 이용한 윈도우 운영체제 설치 방법
11190정성태5/2/201729762Windows: 138. Windows 운영체제의 ISO 설치 파일에 미리 Device driver를 준비하는 방법
11189정성태5/2/201721142Windows: 137. Windows 7 USB/DVD DOWNLOAD TOOL로 98%에서 실패하는 경우
11188정성태4/27/201723881VC++: 118. Win32 HANDLE 자료형의 이모저모 [1]
11187정성태4/26/201724795개발 환경 구성: 314. C# - PowerPoint 확장 Add-in 만드는 방법 [1]파일 다운로드1
11186정성태4/24/201722719VS.NET IDE: 117. Visual Studio 확장(VSIX)을 이용해 사용자 매크로를 추가하는 방법 [1]파일 다운로드1
11185정성태4/22/201720347VS.NET IDE: 116. Visual Studio 확장(VSIX)을 이용해 사용자 메뉴 추가하는 방법 (2) - 동적 메뉴 구성파일 다운로드1
11184정성태4/21/201722060VS.NET IDE: 115. Visual Studio 확장(VSIX)을 이용해 사용자 메뉴 추가하는 방법파일 다운로드1
11183정성태4/19/201720851.NET Framework: 654. UWP 앱에서 FolderPicker 사용 시 유의 사항파일 다운로드1
... 106  107  108  109  [110]  111  112  113  114  115  116  117  118  119  120  ...