[질문]서버에서 클라이언트의 접속을 더 이상 허용하지 않으려면
글쓴이: paraline / 작성시간: 금, 2004/09/03 - 7:11오후
안녕하세요?
서버가 클라이언트의 접속수를 제한하고 싶습니다.
일정수 이상의 클라이언트 접속시 단순히, accept()만 안해서는 문제가 있을것 같습니다.
예를 들어, 제한수가 100이고, 현재 모두 접속이 되어 있는 상태에서, 101번째 클라이언트가 접속을 시도하면, readset이 체크가 되어서, accept를 하지 않아도, 계속 무한루프를 돌게 됩니다.
그리고, 클라이언트는 접속이 안되니까 계속 블럭상태인것 같고요.
connect를 refuse 하는 방법은 없을까요?
accept가 된 상태라면, 반환된 fd로 close를 하면 되겠지만, accept 단계에서 refuse하고 싶은데 어떻게 해야할지...
여러분의 고견을 듣고 싶습니다.
즐프~
Forums:
accept하시고.. close해주세요..괜히 fd값 넘어오는데.
accept하시고.. close해주세요..
괜히 fd값 넘어오는데.. 무시하시다.. 쓰레기 fd가 생깁니다..
그냥 깔끔하게 accept하시고.. 현재 인원초과라면 close해버리세욤..
추가 질문입니다.
관심 가져주셔서 감사합니다.
사실, 클라이언트의 접속을 제한하려는 상황은 이렇습니다.
각각의 시스템에 따라 fd open 가능 갯수가 제한이 있는데, 이 갯수가 넘어서 접속할 경우를 가정한겁니다.
물론, 이 갯수 제한은 어느정도의 숫자로 늘린 상황입니다.
이런 상황에서 클라이언트의 초과 접속 발생시, accept()에서 에러가 발생합니다.
그러므로, accept() 한 후에, close()하는건 불가능한 상황이고요.
그래서, 제가 원하는건, accept()하지 않고, 뭔가 refuse 하는 명령이나 메세지를 보낼수 있는가 하는겁니다.
물론, fd open 갯수 초과시, 프로세스를 더 생성하는 방법도 있습니다만, 지금 상황은 현재, 최대한의 프로세스 생성된 상태에서, 최대한의 클라이언트가 붙은 상황을 가정하는겁니다.
대부분의 소켓 샘플 프로그램에서는 max fd 이상이면, 에러를 내면서, 서버가 종료되도록 되어 있는데, 서버가 종료하지 않고, 해당 클라이언트의 접속만 차단하고 싶어서 질문을 드렸습니다.
제대로 설계를 한다면, 이런 상황은 절대로 발생하지 않을거라 생각합니다.
이 정도의 트래픽이라면, 서버를 증설해도 될테고요.
그리고, 서버의 한계를 넘었을 경우, 서버가 종료되는것도 그다지 이상하지 않을수도 있겠습니다만, 이런 제한된 상황에서 서버를 멈추지 않고, 대처할수 있는 방법이 있을까 해서 말입니다.
쓸데없는 일로 고민한다고 책하지 마시고, 여러분의 고견 좀 많이 들려주세요.
많은 조언 부탁드립니다.
좌절금지!!!
피할수 없다면 즐겨라.
흐음 왜 제한이 넘어가는걸 가정하시는지 모르겠지만..프로그램에서
흐음 왜 제한이 넘어가는걸 가정하시는지 모르겠지만..
프로그램에서 max fd를 넘어가지 않도록 잘 컨트롤 하셔야겠지요..
프로그램에서 max fd값을 얻어올수있습니다..
리눅스 시라면 getrlimit계열의 함수를 찾아보시기 바랍니다..
시스템에 따라 max fd를 넘어간 접속을 받아내는 경우를 고려하시는것같은데
그다지 이유는 잘모르겠습니다..
예를 들어...만약 제한이 1024라면 1000명쯤에 제한을 걸어 두
예를 들어...
만약 제한이 1024라면 1000명쯤에 제한을 걸어 두고..
1000명이 넘는다면 accept()후 바로 close() 하거나
친절히 에러메세지를 담아 send()해 준 후 close() !
아니면 걍 1000명이 넘는다면 accept()를 안합니다.
물론 클라이언트쪽에서 connect() 컨트롤을 잘 해줘야겠죠..
어떤 구조인지는 모르겠지만 별로 어렵지 않을거라 생각되는데요..
멀 그리 고민하시는지.. :twisted:
아래 알고리즘은 어떨까요?1. 최대 가용한 사용자 수가 n이라면,
아래 알고리즘은 어떨까요?
1. 최대 가용한 사용자 수가 n이라면, n-1까지(조정가능)만 접속을 허용한다.
이 예에서처럼 1개(또는 몇개)는 접속불가를 위해 남겨두자. 달리 말하자면,
n개 가능하다고 n개를 다 서비스로 두지는 말자. 당연히 서버의 성능문제 또는
관리등에 사용될 예약 접속수가 필요할 수도 있으니, 또는, 이 경우처럼
접속불가를 알리기 위해 비워두자.
2. n번째 사용자가 접속하면(접속? 된다. n+1번째는? 큐에 대기하겠지....),
"나가시요. 더이상 허용안되오." 라고 하고 정중히 끊어버린다.
이때, 클라이언트는 아 서버가 다운된것은 아니고, 접속이 안되는 이유는
xx구나라는것을 알게된다.
3. listen 큐에 대기중인, 접속요청은 시간이 지나거나(connect timeout;
이로 인해 접속이 안되면, 사용자는 서버가 죽었나?라고 생각할 수도.....),
n-1개의 연결이 접속중인 경우 리슨 큐에서 1개씩 접속되었다가,
본격서비스로 가지 못하고, 정중하게 끊기게 될것이다.
** layer 4에서는 위와 같이 하고, layer 3에서, connection proxy같은
것을 만들어서리, (netfilter 사용) 세션을 카운트하다가 아예 RST를
날려버리는 것도 방법이겠지요. 허나, 권장하지 않습니다.
음 예전에는 답변을 달려고 하면 로긴 화면으로 자동으로 가서, 로그인하고
음 예전에는 답변을 달려고 하면 로긴 화면으로 자동으로 가서, 로그인하고 답달았는데, 이젠 손님으로 등록되는구료.
듣고 보니, 기우였네요. ^^답변주신 모든 분들께 감사의 말씀 전
듣고 보니, 기우였네요. ^^
답변주신 모든 분들께 감사의 말씀 전합니다.
좌절금지!!!
피할수 없다면 즐겨라.
댓글 달기