소켓이란?

소켓은 네트워크 통신을 위한 연결의 끝점이다. 애플리케이션 입장에서는 데이터를 보내고 받기 위한 인터페이스이고, 운영체제 입장에서는 IP 주소와 포트, 프로토콜 정보를 묶어 관리하는 통신 단위에 가깝다.

웹 서버와 클라이언트가 데이터를 주고받을 때도 결국 아래쪽에서는 소켓을 사용한다. HTTP는 더 높은 계층의 규칙이고, 실제 연결과 데이터 송수신은 TCP/IP 위에서 소켓을 통해 이뤄진다.

TCP/IP와 소켓의 관계

TCP/IP는 인터넷 통신의 기본이 되는 프로토콜 묶음이다. IP는 목적지까지 패킷을 보내는 역할을 하고, TCP는 연결을 만들고 데이터가 순서대로 안정적으로 도착하도록 관리한다. UDP는 TCP보다 가볍지만, 순서와 재전송을 보장하지 않는다.

소켓은 이 프로토콜들을 애플리케이션에서 사용할 수 있게 해주는 창구다. 개발자는 send, recv, connect, close 같은 API를 호출하지만, 내부에서는 운영체제가 TCP 연결 상태와 버퍼를 관리한다.

서버와 클라이언트의 흐름

서버 소켓은 먼저 특정 포트에 바인딩된다. 그다음 연결 요청을 기다리고 있다가 클라이언트가 접속하면 연결을 수락한다. 수락 이후에는 클라이언트와 데이터를 주고받고, 통신이 끝나면 연결을 닫는다.

서버: bind → listen → accept → send/recv → close
클라이언트: connect → send/recv → close

클라이언트 소켓의 흐름은 조금 더 단순하다. 서버의 IP와 포트로 연결을 요청하고, 연결이 만들어지면 데이터를 주고받는다. HTTP 요청도 이런 흐름 위에서 만들어진다.

소켓과 WebSocket은 다르다

소켓은 네트워크 통신의 기본 인터페이스이고, WebSocket은 웹 환경에서 양방향 통신을 하기 위한 프로토콜이다. 이름은 비슷하지만 같은 개념은 아니다.

일반적인 HTTP 요청은 클라이언트가 요청하고 서버가 응답하면 끝나는 구조다. 반면 WebSocket은 한 번 연결을 만든 뒤 서버와 클라이언트가 서로 필요할 때 데이터를 보낼 수 있다. 채팅, 실시간 알림, 게임, 협업 도구처럼 연결을 유지하며 데이터를 주고받아야 하는 기능에 잘 맞는다.

Node.js에서는 socket.io, Spring에서는 WebSocket이나 STOMP, Python에서는 socket 모듈 같은 도구를 사용할 수 있다. 다만 라이브러리는 달라도 핵심은 같다. 연결을 만들고, 데이터를 주고받고, 연결이 끊겼을 때 다시 복구하는 흐름을 설계해야 한다.

정리

소켓 통신을 이해할 때는 API 이름을 외우는 것보다 흐름을 잡는 게 중요하다. 서버는 기다리고, 클라이언트는 연결을 요청한다. 연결이 만들어지면 양쪽은 데이터를 주고받고, 통신이 끝나면 연결을 닫는다.

실시간 기능을 만들 때 문제가 생기는 지점도 대부분 이 흐름 안에 있다. 연결이 언제 끊기는지, 재연결은 어떻게 할지, 서버는 많은 연결을 어떻게 관리할지까지 생각해야 소켓 기반 기능을 안정적으로 만들 수 있다.