학습 | 소켓과 TCP 커넥션
Last updated
Last updated
서브젝트를 읽기 전에, 마지막으로 소켓과 TCP 커넥션에 대해 알아보도록 합시다. 앞에 나온 것이 구현대상에 대한 학습이었다면 이번에 다루는 것은 구현방법에 대한 학습에 가깝습니다. 클라이언트가 요청 메시지를 보내고, 서버가 받아서 읽고 응답 메시지를 보내고, 클라이언트가 다시 응답 메시지를 받기 위해서는 클라이언트와 서버가 '연결'되어야 합니다. 우선 아래의 포스팅을 먼저 봅시다.
클라이언트와 서버가 1:1로 연결되는 것은 TCP 커넥션입니다. 커넥션이 핸들링되는 방식이 그 유명한 3 Way-Handshake인데, 실제로는 함수들이 알아서 해주지만 한 번 읽어둡시다. <소켓과 포트의 차이> 포스팅을 읽으셨다면, 연결되는 주체가 단순히 호스트가 아니라는 것을 아셨을 거에요. 호스트에는 많은 프로세스들이 있고, 프로세스들은 각자 포트 번호가 있고, 클라이언트의 특정 프로세스(포트)와 서버의 특정 프로세스(포트)가 커넥션을 맺는 것입니다. 이 때 서버 프로세스에서는 자신의 포트가 클라이언트와 메시지를 주고 받을 수 있도록 소켓을 생성할 수 있는데, 소켓에 대한 더 자세한 설명은 아래를 봅시다.
"Unix는 모든 것이 파일이다"라는 말을 들어보셨나요? 만약 Mac을 이용해 webserv를 진행하고 계시다면 소켓 역시도 파일입니다. 클라이언트가 보내는 메시지들이 소켓 파일에 쌓이고, 서버 역시 상대 측의 소켓에 메시지를 보내서 통신한다고 생각하시면, 정확하지는 않더라도 해당 서브젝트를 진행하는 수준에서는 문제가 없으실 거에요.
다만 서버에 소켓을 만든다고 해서 그 소켓에 모든 클라이언트들의 요청이 들어오는 것은 아닙니다. 커넥션은 1:1로 관리되기 때문에 하나의 소켓은 새로운 클라이언트의 연결 요청을 감지하는 용도로만 사용하고, 감지가 되면 각 클라이언트와 따로 개별적인 커넥션(소켓)을 만든 뒤 메시지를 주고 받습니다. 전자와 후자에 대해 이름을 명확히 협의하시는 것이 변수명에도, 협업에도 좋습니다. 전자는 랑데뷰 소켓인데 저희는 편의상 서버 소켓이라고 불렀고, 후자는 클라이언트 fd/socket/connection을 혼용해서 사용했습니다.
저는 읽지 않았지만 다른 webserv 팀의 iwoo님은 해당 책을 통해 소켓 프로그래밍에 대해 학습을 더 심도 있게 하셨더라고요. 네트워크 프로그래밍에 관심이 많거나 확실히 학습하고 넘어가고 싶으시다면 추천합니다.