문제
서버가 1개의 TCP 포트에 대해 listen하고 있을 때, 해당 포트로 몇 개의 TCP connection이 생성될 수 있는가.
결론
TCP/IP 디자인에는 제한이 없지만 다른 요인에 의해 최대 connection 수는 제한된다.
- 서버의 Memory 제한.
- 프로세스가 열 수 있는 최대 파일 디스크립터.
Google 검색을 해보니 "제한이 없다"라고 자신있게 얘기하는 문서는 있어도 "xxx 이상으로는 못만든다"라고 얘기하는 자료는 없는 것 같다.
상세
connection은 다음 5가지 요인에 의해 식별할 수 있다.
protocol (tcp) | remote ip | remote port | local ip | local port |
여기서 protocol, local port는 고정된 값이고, local ip도 대개는 고정된 값이 된다.
만약 1 client가 서버로 붙는다면 해당 client는 port 번호가 1~64K까지 있으므로 64K개의 connection만 붙을 수 있지만,
multi client 상황에서는 remote ip도 같이 변하므로, 이론 상으로는 connection 수에 제한이 없다.
(세상에 존재하는 모든 client가 붙을 수 있다)
여기서 흔히 잘못 알고 있는 것이 서버가 listening socket을 accept하면 새로운 port를 할당해서 connection이 맺어지고,
서버측은 새로운 port는 64K 제한에 걸리기 때문에 서버측의 connection수는 제한된다는 것이다.
이러한 오해는 "accept()는 새로운 socket을 생성한다"라는 설명과, "socket은 local ip와 local port만으로 식별된다"는 잘못된 지식에서 나온다고 한다.
참고자료
stackoverflow.com/questions/3497528/is-there-a-way-to-overcome-the-port-limit-on-a-linux-system
stackoverflow.com/questions/489036/how-does-the-socket-api-accept-function-work
- accept()가 새로운 port를 할당하지 않는다는 글.
출처 : blog.daum.net/chaeyk09 만년채과장님 글
'[ Programing ] > Server' 카테고리의 다른 글
윈도우 소켓 SOCKET WSAAPI socket() 사용시 리턴 소켓 넘버 값 관련 (0) | 2013.10.25 |
---|---|
윈도우 소켓 WSAStartup, WSACleanup (0) | 2013.10.25 |
IOCP에서 ERROR_NETNAME_DELETED 에러 메세지 (0) | 2013.09.11 |
UDP 홀펀칭2 (0) | 2013.08.22 |
UDP 홀펀칭 (0) | 2013.08.22 |