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)
11025정성태8/12/201622343개발 환경 구성: 294. .NET Core 프로젝트에서 "Copy to Output Directory" 처리 [1]
11024정성태8/12/201621654오류 유형: 350. "nProtect GameMon" 실행 중에는 Visual Studio 디버깅이 안됩니다! [1]
11023정성태8/10/201623164개발 환경 구성: 293. Azure 구독 후 PaaS 서비스 만들어 보기
11022정성태8/10/201623826개발 환경 구성: 292. Azure Cloud Service 배포시 사용자 정의 작업을 추가하는 방법
11021정성태8/10/201620876오류 유형: 349. System.Runtime.Remoting.RemotingException - Type '..., ..., Version=..., Culture=neutral, PublicKeyToken=null' is not registered for activation [2]
11020정성태8/10/201623609VC++: 98. 원본과 대상 버퍼가 같은 경우 memcpy, wmemcpy 주의점
11019정성태8/10/201640284기타: 60. 도서: 시작하세요! C# 6.0 프로그래밍: 기본 문법부터 실전 예제까지 (2쇄 정오표)
11018정성태8/9/201624747.NET Framework: 600. 단일 메서드 내에서의 할당으로 알아보는 자바와 닷넷의 GC 차이점 [1]
11017정성태8/9/201626802웹: 33. HTTP 쿠키에 한글 값을 설정하는 방법
11016정성태8/7/201624012개발 환경 구성: 291. Windows Server Containers 소개
11015정성태8/7/201622269오류 유형: 348. Windows Server 2016 TP5에서 Windows Containers의 docker run 실행 시 encountered an error during Start failed in Win32
11014정성태8/6/201623054오류 유형: 347. Hyper-V Virtual Machine Management service Account does not have permission to open attachment
11013정성태8/6/201633833개발 환경 구성: 290. Windows 10에서 경험해 보는 Windows Containers와 docker [4]
11012정성태8/6/201623882오류 유형: 346. Windows 10에서 Windows Containers의 docker run 실행 시 encountered an error during CreateContainer failed in Win32 발생
11011정성태8/6/201625502기타: 59. outlook.live.com 메일 서비스의 아웃룩 POP3 설정하는 방법
11010정성태8/6/201622881기타: 58. Outlook에 설정한 SMTP/POP3(예:천리안 메일) 계정 암호를 잊어버린 경우
11009정성태8/3/201628074개발 환경 구성: 289. 2016-08-02부터 시작된 윈도우 10 1주년 업데이트에서 Bash Shell 사용 [8]
11008정성태8/1/201621886오류 유형: 345. 2의 30승 이상의 원소를 갖는 경우 버그가 발생하는 이진 검색(Binary Search) 코드
11007정성태8/1/201623586오류 유형: 344. RDP ActiveX 컨트롤로 특정 PC에 연결할 수 없을 때, 오류 상황을 해결하기 위한 팁파일 다운로드1
11006정성태7/22/201626584개발 환경 구성: 288. SSL 인증서를 Azure Cloud Service에 적용하는 방법
11005정성태7/22/201625223개발 환경 구성: 287. Let's Encrypt 인증서 업데이트 주기: 90일
11004정성태7/22/201620081오류 유형: 343. Invalid service definition or service configuration. Please see the Error List for more details.
11003정성태7/20/201627360VS.NET IDE: 110. Visual Studio 2015에서 .NET Core 응용 프로그램 개발 [1]
11002정성태7/20/201620838개발 환경 구성: 286. Microsoft Azure 서비스의 구독은 반드시 IE로!
11001정성태7/19/201631903.NET Framework: 599. .NET Core/SDK 설치 및 기본 사용법 [6]
11000정성태7/16/201620612오류 유형: 342. Microsoft Visual Studio 2010 Tools for Office Runtime (x86 and x64) 설치 시 오류
... 106  107  108  109  110  111  112  113  114  115  [116]  117  118  119  120  ...