[C++]소켓

강병우·2023년 8월 17일
0

네트워크

목록 보기
1/7

소켓?

게임 서버는 다뤄야 할 클라이언트 소켓의 수가 많다. 온라인 게임들을 보면 월드 하나의 수 십명의 플레이어들이 있는데, 이 플레이어 한명 한명이 서버와 통신하는 클라이언트 소켓이 되시겠다.

소켓에 대해 얘기하기 전, 짚고 넘어갈 것이 있다.

소켓 프로그래밍을 접하기 전까지, 학부와 직장에서 웹기반 서버 프로그래밍을 담당했었다. 주로 nodejsspring boot를 다뤘는데, 이런 것들이 HTTP 통신을 기반한 프레임워크들이다. 흔히 GET이나 POST로 요청을 보낸다고 하는데 이러한 과정들을 HTTP 통신이라고 봐도 좋다. 네트워크 통신은 크게 HTTP 통신과 Socket 통신으로 나뉘는데, HTTP 통신의 특징부터 짚어보고 소켓에 대해 다뤄보겠다.

HTTP 통신?

HyperText Transfer Protocol의 약자로, 하이퍼한 텍스트를 보내는 규약? 이라고 의역할 수 있는데 정확한 정의는 HTML파일을 전송하는 프로토콜이다. 웹에서 일어나는 통신이며 이를 통해 json이나 파일 등을 전송할 수 있다.

HTTP통신은 클라이언트측이 서버에 요청을 보내고 서버가 응답하는 오고가는 형식의 TCP 기반 통신이다. 즉, 단방향 통신으로 한 번 주고 받으면 연결을 끊는다. 이러한 특성덕분에 서버는 클라이언트의 상태정보를 관리하지 않는다. 서버의 리소스를 절약하고 많은 클라이언트의 요청을 처리할 수 있는 장점이 있지만, 클라이언트는 많은 양의 데이터를 서버에 보내야 하거나, 로그인과 같은 상태 정보를 클라이언트에서 관리해야 한다.

옛날엔 서버측에서 클라이언트에 요청을 받은 직후에 바로 연결을 끊었지만(3-way handshake에 의해 문제가 발생할 수도!), 많은 양의 데이터를 주고 받는데에 연결을 유지하는 것이 더 효율적이다. 그래서 최근엔 클라이언트와 서버 간 연결을 유지하는 것도 가능하다(그래서 서버 최적화를 뒷전으로 미루기 위해 nginx의 keep alive를 왕창 늘려버린 적도).

이 외에 header, body, method 등 할 얘기는 많지만 이 글의 주인공은 소켓이기때문에, HTTP에 대한 이야기는 이쯤에서 정리한다.

  • 서버와 클라이언트 간 단방향 통신을 한다.
  • 서버는 클라이언트의 상태를 보존하지 않는다.
  • 클라이언트는 요청 후 서버로부터 응답을 받으면 연결을 끊는다.
  • Header, Body 등으로 이루어진 HTTP 메세지를 통해 서버와 클라이언트 간 통신에 필요한 데이터를 주고 받는다.

이제, 소켓에 대해 짚어보자

Socket 통신?

소켓이란, 네트워크 상에서 서로 데이터를 주고 받는 두 프로그램 간의 양방향 엔드포인트이다. 양방향 통신을 하기 때문에, 서버와 클라이언트는 연결에 대한 정보(Connection)을 계속 가지고 있어야 하며 때문에 HTTP 통신에 비해 많은 리소스가 소모된다. 그래도 클라이언트와 서버가 서로에게 데이터를 보낼 수 있기 때문에 실시간성이라는 장점이 있다.

소켓 통신을 하기 위해 TCP/UDP 규약을 정해야 한다. 이 둘의 특징을 간단하게 짚고 가자면, TCP는 신뢰적이고 정확한 프로토콜이지만, UDP는 신뢰적이지 않고 데이터가 손실될 수 있지만 TCP에 비해 빠른 속도가 장점인 프로토콜이다(사실 이부분이 중요한 내용인데.. 순서상 나중에 다루겠다. 공부해야될 내용들이 많다).

TCP 언급이 나왔는데, HTTP 통신이 TCP에 기반한 통신이라고 위에 적어놨는데, 엄밀히 따지면 HTTP 통신은 소켓 통신을 활용한 통신이라고 볼 수 있다. 그렇다고 HTTP는 연결을 유지해야 하는 것은 아니다. 신뢰할 수 있고 메세지 손실이 없는 연결을 필요로 하기 때문에 TCP 표준에 따라 통신을 한다.

정리하자면 다음과 같다.

  • 소켓은 두 프로그램 간의 양방향 엔드포인트(도착점)를 뜻한다.
  • 서로 주고 받기 때문에, 서버와 클라이언트는 서로에 대한 정보/상태를 갖고 있어야 한다.
  • Connection 정보/상태를 메모리에 갖고 있어야 하기 때문에 이에 대한 리소스 소모가 있다.
  • Connection 정보/상태를 갖고 있기 때문에 실시간으로 통신(예 : 채팅프로그램)에 유용하다.

이 정도로 정리할 수 있겠다. 약간 느낌적으로, 소켓 통신이 HTTP 통신보다 로우 레벨의 느낌이 난다. HTTP 통신은 규칙에 의해 돌아간다면, 소켓의 경우엔 개발자가 직접 규칙을 만들고 통신하는 느낌이랄까.

아직 갈 길이 멀다. 벨로그 정리를 안 하다보니 복습하고 작성해야 될 내용들이 많다.

0개의 댓글

관련 채용 정보