성태의 닷넷 이야기
홈 주인
모아 놓은 자료
프로그래밍
질문/답변
사용자 관리
사용자
메뉴
아티클
외부 아티클
유용한 코드
온라인 기능
MathJax 입력기
최근 덧글
[정성태] VT sequences to "CONOUT$" vs. STD_O...
[정성태] NetCoreDbg is a managed code debugg...
[정성태] Evaluating tail call elimination in...
[정성태] What’s new in System.Text.Json in ....
[정성태] What's new in .NET 9: Cryptography ...
[정성태] 아... 제시해 주신 "https://akrzemi1.wordp...
[정성태] 다시 질문을 정리할 필요가 있을 것 같습니다. 제가 본문에...
[이승준] 완전히 잘못 짚었습니다. 댓글 지우고 싶네요. 검색을 해보...
[정성태] 우선 답글 감사합니다. ^^ 그런데, 사실 저 예제는 (g...
[이승준] 수정이 안되어서... byteArray는 BYTE* 타입입니다...
글쓰기
제목
이름
암호
전자우편
HTML
홈페이지
유형
제니퍼 .NET
닷넷
COM 개체 관련
스크립트
VC++
VS.NET IDE
Windows
Team Foundation Server
디버깅 기술
오류 유형
개발 환경 구성
웹
기타
Linux
Java
DDK
Math
Phone
Graphics
사물인터넷
부모글 보이기/감추기
내용
<div style='display: inline'> <h1 style='font-family: Malgun Gothic, Consolas; font-size: 20pt; color: #006699; text-align: center; font-weight: bold'>윈도우 응용 프로그램의 Socket 연결 시 time-out 시간 제어</h1> <p> 일단 기본적인 제어는,<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > Which is the default TCP connect timeout in Windows? ; <a target='tab' href='https://serverfault.com/questions/193160/which-is-the-default-tcp-connect-timeout-in-windows'>https://serverfault.com/questions/193160/which-is-the-default-tcp-connect-timeout-in-windows</a> Appendix A: TCP/IP Configuration Parameters ; <a target='tab' href='https://learn.microsoft.com/en-us/previous-versions/windows/it-pro/windows-server-2003/cc739819(v=ws.10)'>https://learn.microsoft.com/en-us/previous-versions/windows/it-pro/windows-server-2003/cc739819(v=ws.10)</a> 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? ; <a target='tab' href='https://superuser.com/questions/339959/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</a> </pre> <br /> TcpInitialRTT, TcpMaxConnectRetransmissions 관련 값들을 통해 이뤄집니다. 그런데 이게 윈도우 서버 2008 R2/7까지는 레지스트리 설정(HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters)으로 가능한 반면, 2012를 기점으로 netsh 관리로 통합이 됩니다.<br /> <br /> 테스트를 간단하게 만들기 위해 최신 버전 기준인 Windows Server 2019에서 TcpInitialRTT, TcpMaxConnectRetransmissions 값을 다음의 명령어로 구할 수 있고,<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > C:\Windows\system32> <span style='color: blue; font-weight: bold'>netsh interface tcp show global</span> 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 <span style='color: blue; font-weight: bold'>Initial RTO : 3000</span> Non Sack Rtt Resiliency : disabled <span style='color: blue; font-weight: bold'>Max SYN Retransmissions : 2</span> ** The above autotuninglevel setting is the result of Windows Scaling heuristics overriding any local/policy configuration on at least one profile. </pre> <br /> 해당 값들의 변경은 이런 식으로 할 수 있습니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > C:\Windows\system32> <span style='color: blue; font-weight: bold'>netsh interface tcp set global MaxSynRetransmissions=2</span> Ok. C:\Windows\system32> <span style='color: blue; font-weight: bold'>netsh interface tcp set global InitialRto=1000</span> Ok. </pre> <br /> 그럼, 실제로 Socket 코드를 다음과 같이 작성하고,<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > using (Socket clntSock = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp)) { var entry = Dns.GetHostEntry(target); clntSock.Connect(new IPEndPoint(entry.AddressList[0], port)); } </pre> <a name='default_timedout'></a> <br /> 기본 값 상태에서,<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > TcpInitialRTT == 3000 TcpMaxConnectRetransmissions == 2 </pre> <br /> 외부 인터넷 망에 있는 서버를 대상으로 listening하지 않는 포트에 대해 테스트를 해보면 21초가 걸리는 것을 확인할 수 있습니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > c:\temp> <span style='color: blue; font-weight: bold'>ConsoleApp1.exe www.sysnet.pe.kr 8032</span> 21203.2789 </pre> <br /> 21초가 걸린 이유는 계산 결과와,<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > RTO: 3000 = 3초 1번 재시도: 3000 * 2 = 6초 2번 재시도: 6000 * 2 = 12초 ------------------------------- 총 21초 </pre> <br /> 일치합니다. 그럼, 설정값을 변경도 해봐야겠지요. ^^<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > TcpInitialRTT == 2000 TcpMaxConnectRetransmissions == 2 </pre> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > RTO: 3000 = 2초 1번 재시도: 2000 * 2 = 4초 2번 재시도: 4000 * 2 = 8초 ------------------------------- 총 14초 </pre> <br /> 실행해 보면,<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > c:\temp>ConsoleApp1.exe 14042.6988 </pre> <br /> 예상했던 데로, 대략 14초(14000ms)가 걸렸습니다.<br /> <br /> <hr style='width: 50%' /><br /> <br /> 참고로, TcpInitialRTT, TcpMaxConnectRetransmissions 값을 조절하다 보면 Connection Timeout 시간이 지나치게 오래 걸릴 수 있는데,<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > 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초 </pre> <br /> 정작 실행해 보면 100초 정도에 끝납니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > c:\temp>ConsoleApp1.exe 100058.9233 </pre> <br /> 왜냐하면, 최댓값이 100초이기 때문입니다. 관련해서 다음의 Q&A를 보면,<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > Window registy: TCPMaxConnectRetransmissions ; <a target='tab' href='https://social.technet.microsoft.com/Forums/windows/en-US/110271d5-5221-44b4-af14-f07f3fa01a73/window-registy-tcpmaxconnectretransmissions?forum=w7itpronetworking'>https://social.technet.microsoft.com/Forums/windows/en-US/110271d5-5221-44b4-af14-f07f3fa01a73/window-registy-tcpmaxconnectretransmissions?forum=w7itpronetworking</a> </pre> <br /> Windows 2003에서는 최댓값이 120초라고 하니 이것 역시 윈도우 버전마다 다를 수 있습니다.<br /> <br /> <hr style='width: 50%' /><br /> <br /> 경험상, 이와 관련된 값들을 굳이 설정해야 한다면 반드시 해당 환경에서 테스트를 해보는 것이 좋습니다. 일례로 예전에 소개했던 장애 환경의 경우,<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > .NET Remoting에서 서비스 호출 시 SYN_SENT로 남는 현상 ; <a target='tab' href='http://www.sysnet.pe.kr/2/0/11998'>http://www.sysnet.pe.kr/2/0/11998</a> </pre> <br /> 원인은 알 수 없었지만 일단 TcpInitialRTT, TcpMaxConnectRetransmissions 레지스트리 값을 조정한 경우 연결 시간은 제어가 되었는데 - 즉, SYN_SENT로 남는 시간을 제어할 수 있었지만 아쉽게도 시스템이 일정 시간 동작한 후에는 다시 무한대의 time-out 시간으로 바뀌는 현상이 발생했습니다. 일단 그런 경우도 있다는 것을 알아만 두시고. ^^<br /> <br /> 그 외에, maxsynretransmissions과 initialrto에 설정 가능한 값의 범위는 netsh 도움말에 나옵니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > C:\> <span style='color: blue; font-weight: bold'>netsh interface tcp set global ?</span> 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] <span style='color: blue; font-weight: bold'>[[initialrto=]<300-3000>]</span> [[rsc=]disabled|enabled|default] [[nonsackrttresiliency=]disabled|enabled|default] <span style='color: blue; font-weight: bold'>[[maxsynretransmissions=]<2-8>]</span> [[fastopen=]disabled|enabled|default] [[fastopenfallback=]disabled|enabled|default] [[hystart=]disabled|enabled|default] [[pacingprofile=]off|initialwindow|slowstart|always|default] ...[생략]... </pre> <br /> 기타... Windows Server 2008 R2 이하에서는 "netsh interface tcp show global" 명령어의 출력이 다음과 같습니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > C:\Windows\system32> <span style='color: blue; font-weight: bold'>netsh interface tcp show global</span> 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 </pre> </p><br /> <br /><hr /><span style='color: Maroon'>[이 글에 대해서 여러분들과 의견을 공유하고 싶습니다. 틀리거나 미흡한 부분 또는 의문 사항이 있으시면 언제든 댓글 남겨주십시오.]</span> </div>
첨부파일
스팸 방지용 인증 번호
6767
(왼쪽의 숫자를 입력해야 합니다.)