다중 클라이언트-서버 모델에서요
클아이언트가 여러게 있고 서버데몬이 하나가 있다고 치면요
예를 들어 서버 포트 5555 번으로 클라이언트 5개가 붙었다 칩시다.
서버데몬은 fork() 로 자식프로세스를 띄워서 구현했다고 하구요.(기본적인 서버-클라이언트모델)
그럼 여기서 의문입니다.
5555 포트로 다섯개의 클라이언트가 접속이 되어있는데(자식 프로세스 다섯개로 연결되어있음)
어떻게 해당 클라이언트의 패킷이 같은 5555 포트로 연결되어있는 각각의 자식 프로세스로 갈수있는 걸까요?
그러니까 A라는 클라이언트도 5555 포트, B라는 클라이언트도 5555 포트...
이런식으로 연결되어있을건데요..
그러니까 서버의 커널(?)이 각각의 클라이언트의 패킷을 구분해서
이놈하고 연결되어있는 자식 프로세스로 데이타를 보낸다는 얘긴데요..(제 추측^^)
같은 5555 포트로 데이타를 보내는데 말이죠.(따라서 포트로는 해당 패킷을 구분하기 불가능하죠)
그래서 추측해보면 ip헤더와 TCP헤더의 어떤 필드중에 서버의 자식프로세스와
어떤 연결고리가 있지 않나 생각해보는데요
얼핏봐서는 ip 헤더의 identification field 가 이런 역할을 하는거같습니다.
실험해보니깐 서버의 포트에 클라이언트가 연결이 될때마다 이 필드의 값이 각각 틀리더군요.
그리고 연결이 한번되면 소켓이 끊어질때 까지 이 필드의 값은 변하지 않구요.
제가 생각하는게 맞는지 고수분들께 조언을 구합니다.(쓰레드로 구현해도 이런의문은 동일합니다.)
답변 기다릴게요^^
저도 궁금해서 찾아보았습니다. 아래 링크에 관련 답이
저도 궁금해서 찾아보았습니다. 아래 링크에 관련 답이 있는것 같습니다.
http://stackoverflow.com/questions/3329641/how-do-multiple-clients-connect-simultaneously-to-one-port-say-80-on-a-server
요약하면,
UDP통신의 경우에는 연결의 개념이 아니고 배달 (stateless)의 개념이여서 서버는 받기만 하기
때문에 client의 수에 상관이 없고,
TCP인 경우에는 server와 client의 연결을 identify하기 위해서
client_ip : client_port : server_ip : server_port
의 네가지 값을 사용하는 key을 각 연결을 구분하기 위한 identifier로 사용 한다고 합니다.
server는 port가 정해져 있지만 client의 경우에는 지정된 port로 연결하는 것이 아니고
temp port를 부여받아서 연결하기 때문에, 예를 들어 한 PC에서 서로 다른 두개의 client를
실행해서 같은 서버로 연결하더라고 그 두개의 client는 서로 다른 port를 사용해서
서버로 연결을 시도하기 때문에 위 키를 사용하면 서버쪽에서는 두개의 서로 다른 연결을
개별로 처리할 수 있게 된다고 하는것 같습니다.
아 그렇겠군요^^
아하!!
클라이언트 포트가 전부다 다르니까 이걸로 구분할수있겠군요.
아오 전 멍청한가봅니다. - -;;
이걸 간과하고있었네요 ㅎㅎ;;
client_ip : client_port : server_ip : server_port
위 키와 서버단의 차일드 프로세스의 소켓하고 연결되어있다....!!
감사합니다.
저도 소켓 프로그램을 공부하는 중이라 잘 아는 것은
저도 소켓 프로그램을 공부하는 중이라 잘 아는 것은 아닙니다. 제가 알고 있던 내용에 비춰 저도 궁금하네요.
저는 서버에서 accept() 할 때 클라이언트와 통신을 할 수 있는 소켓이 생긴다고 앏니다. 제가 모르는 것은 그 때 새로 생기는 소켓이 어떤 포트번호를 갖는가 하느 점입니다. 서버를 구현할 때 그 포트 번호를 프로그래머가 지정하지는 않으니까요.
하여, 저는 아마도 accept() 할 때 서버의 커널이 임의의 포트를 지정해서 클라이언트와의 connection을 맺어준다고 생각합니다.
그럼 말씀하신 문제는 생기지 않겠지요. 5555번 포트는 그러니까 단지 소위 서버소켓의 용도로만 사용되는 것.
저도 이 문제의 확실한 답은 궁금합니다.
댓글 달기