나만의 작은 도서관
[C++] 게임서버 탐구 일지 #0. TCP 통신 기초 이론 본문
개요
서버는 마치 식당과도 같다. 식당에서 손님이 오면 손님을 받아 자리로 안내하는 것처럼 서버는 연결 요청을 한 소켓을 연결하고, 손님이 주문한 음식을 만들어 해당 자리에 서빙하는 것처럼, 요청한 작업을 처리하여 해당 소켓으로 처리된 데이터를 전송한다.
이 글에서는 식당으로 비유하며 클라이언트-서버 구조에서 각각 어떻게 통신을 연결하는지 간단히 정리해보고자 한다.
소켓(socket)이란?
소켓은 통신의 극점이며, 통신을 주고받으려면 반드시 필요한 개체이다(핸드폰으로 자주 비유되곤 한다. 식당 비유에 맞게 비유하자면 한 사람이라고 보면 된다). 각 소켓은 IP 주소 + 포트 번호 조합으로 구별하며, 통신을 통해 컴퓨터가 데이터를 수신하면 해당 포트를 사용하는 프로세스를 찾아 작업을 수행한다.
전화를 걸려면, 본인과 상대방 모두에게 핸드폰이 있어야되는 것처럼, 양 프로세스에 하나씩, 총 두개의 소켓이 필요하다.
통신 절차(서버 측)
1. socket() : 고객을 안내할 안내원을 고용한다.
식당에서 손님을 받기 위해선 손님을 입장시킬 안내원을 고용해야한다. 통신 세계에서는 손님이 알아서 자리를 찾아가지 않기 때문에 안내원이 없다면 손님은 영영 들어오지 않는다. 따라서, 안내를 맡을 소켓을 하나 생성한다. (이런 소켓을 listen 소켓이라고 부른다)
2. bind() : 안내원을 식당 입구에 배치시킨다.
안내원을 고용했으니 해당 인원을 식당 입구에 배치시켜 안내를 받을 준비를 해야한다. 여기서 식당 입구는 서버 주소에 해당하며, listen 소켓과 서버 주소를 엮음으로써 통신 요청들을 준비를 한다.
3. listen() : 안내원이 손님을 받기 시작한다.
손님을 받을 준비가 끝났으니, 안내원이 안내를 하도록 지시한다. 이제부터 고객이 식당에 들어오고자 하면 안내원이 이를 알아차리고 손님을 받을 수 있게 된다.
4. accept() : 고객이 오면 자리로 안내한다.
안내원이 식당에 들어가길 원하는 손님을 발견했다면 자리로 안내한다. 통신 관점으론 listen 소켓이 listen을 하는 동안 클라이언트의 connect 요청을 감지했을 때 연결 작업을 처리한다고 보면 된다.
5. 통신 시작: 주문 시작!
이제 손님은 안내원과 소통하는 것이 아닌, 자리에 앉아 식당과 소통하게 된다. 이 또한 통신 관점에서 보면 accept() 이후 서버 측 다른 소켓과 클라이언트 소켓이 연결되어 통신하는 상황이라 볼 수 있다.
통신 절차(클라이언트 측)
1. socket() : 식당에 갈 본인을 준비(?)한다.
식당에서 식사를 하려면 어찌되었든 식당에 가야한다. 통신을 위한 소켓을 하나 준비한다.
2. connect() : 식당에 입장한다.
안내원에게 식당에 들어가고 싶다고 요청한다. 안내원은 식당의 여러 사정으로 입장을 거절할 수도 있으며, 입장을 허용하면 식당에 들어가 주문을 할 수 있게 된다. 통신 관점에서 바라보면 서버에 연결을 시도하는 시점이라 볼 수 있다.
3. 통신 시작 : 주문 시작!
입장에 성공했다면, 이제 손님은 안내원과 소통하는 것이 아닌, 자리에 앉아 식당과 소통하게 된다. 이를 통신 관점에서 보면 accept() 이후 서버 측 다른 소켓과 클라이언트 소켓이 연결되어 통신하는 상황이라 볼 수 있다.
'C++ > Windows 게임서버' 카테고리의 다른 글
[C++] 게임서버 탐구 일지 #5. Winsock TCP 서버 - 논블로킹 (0) | 2024.12.28 |
---|---|
[C++] 게임서버 탐구 일지 #4. 다양한 소켓 옵션 (1) | 2024.12.28 |
[C++] 게임서버 탐구 일지 #3. Winsock UDP echo 서버 (0) | 2024.12.27 |
[C++] 게임서버 탐구 일지 #2. Winsock TCP 서버 기초- send(), recv() (0) | 2024.12.27 |
[C++] 게임서버 탐구 일지 #1. Winsock TCP 서버 기초- 클라이언트-서버 연결하기 (0) | 2024.12.25 |