Windows XP SP2의 Half-Open 연결 제한 : P2P, Socket
Posted 2006/10/24 19:32다음의 글은 P2P를 개발할 때 접했던 'Half-Open 연결 제한'에 대한 내용이다.
1. P2P 클라이언트
(1) P2P 클라이언트
P2P 프로그램이 파일 다운로드 속도를 높이기 위해서는 해당 클라이언트가 많은 노드에 소켓 연결을 하여 동시에 파일을 다운로드 해야한다. 일반적으로 사용자들이 이용하는 P2P 프로그램(당나귀, 푸르나, 비트 토런트 등등)은 무료이기 때문에 어느 정도의 속도 저하에 대해 이해할 수 있지만, P2P를 이용하여 서비스하는 업체로 본다면, 속도 저하는 곧 품질과 직결되기 때문에 고객에게 불편 뿐만 아니라 양질의 서비스를 제공하지 못함으로 인해 업체의 존속의 여부도 결정지을 수 있다고 생각한다.
(2) 프로그램 구조
현재의 프로그램은 서버 기반의 P2P 프로그램으로 클라이언트는 파일을 다운로드 받기 위해 서버에 접속하여, 각 노드의 정보를 얻은 후, 해당 노드로 접속하여 파일의 특정양을 다운로드하는 구조이다.
2. 클라이언트 속도 저하
(1) 클라이언트의 노드 접속 실패 중복 시, 다운로드 속도 저하 발생
① 노드 접속 실패 중복 시, 실제 접속 가능한 목적지에도 접속이 불가능한 상태가 되는 소켓 블록화가 발생
(2) 접속 실패 원인
① 서버가 요청 클라이언트에 노드를 할당 한 뒤, 할당된 노드들이 서버를 이탈(종료)하였거나, 각 노드들의 환경(NetLimiter 사용)이라 생각된다.
3. 플랫폼 현황
(1) 운영체제
Windows XP, Service Pack 2(이하 SP2)
4. 원인 분석
(1) SP2 내용
MS는 바이러스나 웜과 같은 악성 프로그램들이 많은 Random IP 주소로 동시 접속 시도를 하여 확산하는 전략을 갖고 있기 때문에, 악성 프로그램이 다른 컴퓨터로 번지는 속도를 제한하기 위해 SYN에 대한 제한을 두었다. 또한 이들 대부분의 Random IP 접속 시도가 실패를 유발시켜, 사용자 컴퓨터의 활동을 방해한다고 결정을 내렸다. 이와 같은 연결 제한은 많은 연결을 가져야 하는 합법적인 프로그램도 이 제약을 벗어날 수 없음을 말한다.
(2) Half-Open 연결 제한
Windows XP SP2의 half-open connection(SYN)의 수는 10개로 제한되어 있다.
(이전 버전이 갖고 있는 제한은 65,000개)
(3) 현상
Half-open 연결 제한(10개)에 도달하게 되면, 뒤이어 발생하는 연결시도는 Queue에 들어가게 되고, 고정된 비율로 해제되게 된다. (이러한 원인으로 인해 현재 클라이언트의 계속된 접속 실패와 연결 시간의 지연이 발생하여, 다운로드 속도 저하의 원인이 된다.)
① 확산을 시도하는 바이러스 혹은 웜에 의해 사용자 컴퓨터가 오염되었을지 모른다.
5. 알려진 해결 방안
(1) Patch
① Tcpip.sys 파일에 비공식 패치 적용하여, 10개로 제한된 half-open connect 을 원하는 수 만큼 수정하여 해결
(다운로드 : http://www.lvllord.de/?lang=en&url=tools)
(2) 레지스트리 값 변경
인터넷에 보면 레지스트리 값을 변경하여 half-open의 수를 증가시킬 수 있다는 글들이 있는데, 이는 잘못된 정보라 생각된다.
※ 참고 자료
http://www.microsoft.com/technet/prodtechnol/winxppro/maintain/sp2netwk.mspx#E5AAE
http://blog.davidkaspar.com/archives/2005/04/windows-xp-sp2-and-event-id-4226.php?page=1
TCP 프로토콜은 접속에 대한 3개의 상태를 가진다.
① A의 SYN 패킷 전송
시작지 (A)에서 목적지 (B)로 SYN 패킷을 전송한다. 이 시점에서 A는 half-open 상태로 응답을 기다린다.
② B의 SYN/ACK 패킷 전송
B는 A로부터 도착한 연결정보를 나타내는 커널 정보를 업데이트 한 후, SYN/ACK 패킷을 전송한다. B는 half-open 상태로 패킷 수신 할 수 있지만, 전송을 할 수 없는 상태이다.
③ A의 ACK 패킷 전송
A는 B로부터 SYN/ACK를 수신하여 송수신이 가능한 상태가 되며, B로 마지막 ACK 를 전송한다. 일단 B가 A의 마지막 ACK를 수신한다면 B 역시 송수신이 가능한 full-open 상태가 된다.