C++Builder  |  Delphi  |  FireMonkey  |  C/C++  |  Free Pascal  |  Firebird
볼랜드포럼 BorlandForum
 경고! 게시물 작성자의 사전 허락없는 메일주소 추출행위 절대 금지
분야별 포럼
C++빌더
델파이
파이어몽키
C/C++
프리파스칼
파이어버드
볼랜드포럼 홈
헤드라인 뉴스
IT 뉴스
공지사항
자유게시판
해피 브레이크
공동 프로젝트
구인/구직
회원 장터
건의사항
운영진 게시판
회원 메뉴
북마크
볼랜드포럼 광고 모집

자유게시판
세상 살아가는 이야기들을 나누는 사랑방입니다.
[27353] Re:서버 동시접속 만개도 가능할까요
빌더(TWx) [builder] 6392 읽음    2017-07-09 00:57
안녕하세요 님이 쓰신 글 :
: 인터넷 검색하면 할수록 더 혼동되는군요.
: 된다 안된다 갈리는 내용 천지네요
: 동접 몇천개는 어떤 특별한 기술을 이용해서 만든건지
: 동시접속 만개도 가능할까요
: 고수분들의 의견을 듣고싶습니다



답변:

서버와 클라이언트 간의 unique한 커넥션으로 네트웍 프로토콜을 포함하면 5 tuple로 결정되지만
protocol을 제외하면 <server IP:PORT --- client IP:PORT> 은 4개의 tuple로 unique 한 값이 결정된다고 볼수 있습니다.

server 가 ip 100 port 8000 이라고 할 때...

100:8000 ---- 200:5001과
100:8000 ---- 200:5002 는 4개의 tuple을 조합한 값이 서로 다르기 때문에(hash value를 생각해 보세요)
두개의 커넥션은 서버와 클라이언트 간에 unique 한 connection을 갖고 있다고 할 수 있죠.

소켓을 생성하게 되면 커널 네트웍 레이어에서도 내부 자료구조를 위한 메모리를 할애 하게 되는데
유져모드에서 사용되는 가상메모리가 아닌, 물리적으로 필요한 메모리인 Non-paged 메모리도 필요하게 되는데
사실상 생성할 수 있는 소켓의 수, accept() socket api로 inbound request를 받아서 생성할 수 있는 클라이언트
소켓의 수를 결정하는 요인으로 중요한 역할을 하는 게 바로 Non-paged pool 입니다.
물론 OS의 커널 아키텍쳐에서 Non-paged pool을 얼마나 효율적으로 이용하게 구현되어 있느냐도 중요한 역할을 하게 되고요.


인터넷 검색을 통한 썰에 너무 현혹하지 마세요. 실험과 데이타 없이 상상만으로 소설을 써놓은 경우도 허다하니까요.
그런건 Winsock API를 이용한 테스트 코드를 만들어서 직접 본인이 검증하고 확인하는 게 가장 확실한 겁니다.

30분 정도 시간을 할애해서 구현한 서버/클라이언트 테스트 코드를 통해서 결론 부터 확인해 봅시다.

아래 그림은 메모리 4기가 밖에 안되는 소형 랩탑에서 C/S connection을 하기 전에 OS가 사용하는 핸들의 수를 캡쳐한 겁니다.
OS는 Windows 10 입니다. 5만개 정도의 핸들이 사용되고 있습니다.





아래 그림은 1대의 컴에서 클라이언/서버 프로그램을 같이 동작시켰을 때...
서버 프로그램이 받아 들일 수 있는 inbound connection이 어느 정도 되는가를 캡쳐 한 겁니다.



소켓을 close 하지 않고, 계속 connected 상태로 inbound 할 수 있는 최대 값이...
메모리 4기가 밖에 안되는 랩탑에서 1만6천개 정도로 나옵니다. 레지스트리 수정 없이 디폴트 상태의 Windows 10.

이 경우 서버와 클라이언트를 별개의 컴에서 실행하지 않고 하나의 컴에서 같이 실행시켰기 때문에
실제로 connected 상태로 오픈된 소켓의 수는 2배인 3만개가 넘게 되는 거죠. OS에서 사용되는 핸들도 8만개를 넘어섰고요.


앞서 4 tuple 얘기를 언급했는데...

TCP/IP 프로토콜에서 포트는 16비트 크기의 값이 사용 됩니다.
따라서 <ip:port> tuple 구성에서 하나의 IP가 가질 수 있는 unique한 turple은 65536 개가 됩니다.
프로토콜에서 port 필드를 16비트 크기의 값으로 사용하기 때문이죠.

그렇다고 maximum 소켓이 64K로 제한되는 것은 아닙니다.

예를 하나 들어 봅시다.

서버 하나와 클라이언트 PC 하나가 있다고 해 봅시다.
하나의 클라이언트 PC에서 서버에 커넥트할 수 있는 소켓이(outbound) 프로토콜 상 최대치인 64K 밖에 못 쓸까요?
그렇지 않습니다. 위에서 언급한대로 4 tuple만 unique 하면 되기 때문에 네트웍 카드를 2개 설치해서
다른 ip를 추가로 사용하면 확장된 unique 값을 사용할 수 있어서 NIC 카드 수 * 64K 도 가능해 집니다.
물론 OS의 커널레이어가 효율적으로 만들어져 있고, Non-paged pool로 할당되는 물리적인 메모리도
충분히 설치되어 있어야겠죠.

서버쪽에서 inbound로 받아 들일 수 있는 소켓도 TCP/IP 프로토콜 상 최대치인 64K로 제한 될 수 밖에 없을까요?

그것도 그렇지 않습니다.

서버쪽에서 IP alias 를 만들어서 네트웍 카드에 ip를 추가로 할당하게 되면 (ip 들이 같은 subnet 으로 할당되어야 함)
하나의 네트웍 카드만을 써도 unique tuple 을 확장해서 사용할 수 있게 됩니다.
네트웍 대역을 생각해서 여러개의 네트웍 카드를 물려서 처리 할 수도 있고요. (ip alias * 64K 또는 NIC 카드수 * 64K)

서버 프로그램을 설계할 때, 네트웍 카드를 바인딩 해주는 로직을 구현해 주면 됩니다.

클라이언트/서버 쪽이 대단한 기술을 필요로 하는 것은 아닙니다. 네트웍 프로토콜을 이해하고 있는 게 중요하죠.


+ -

관련 글 리스트
27352 서버 동시접속 만개도 가능할까요 안녕하세요 4609 2017/07/08
27353     Re:서버 동시접속 만개도 가능할까요 빌더(TWx) 6392 2017/07/09
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.