소캣통신에 대해 알아보겠습니다.
소켓통신
먼저 소켓(Socket)은 TCP/IP 기반 네트워크 통신에서 데이터 송수신의 마지막 접점을 말합니다. TCP/IP 4 계층이나 OIS 7 계층을 아시는 분들은 응용 SW 계층과 전송 계층 사이에 관문처럼 존재하면서 포트를 통해 각각의 프로세스를 식별해 주는 추상화된 개념이라고 생각할 수 있을 것 같습니다.

소켓통신은 이러한 소켓을 통해 서버-클라이언트 간 데이터를 주고받는 양방향 연결 지향성 통신을 말합니다. 소켓통신은 보통 지속적으로 연결을 유지하면서 실시간으로 데이터를 주고받아야 하는 경우에는 사용됩니다. 대표적으로 오늘 구현해 볼 채팅이나 게임 등에서 자주 사용되는 통신 방법입니다.
소켓통신은 TCP기반과 UDP기반으로 나눌 수 있습니다.
Stream sockets - TCP (Transmission Control Protocol)
- TCP를 사용하므로 연결 지향형(Connection-oriented) 소켓
- 신뢰성을 보장합니다
- 데이터가 순서대로 송수신됩니다
- 점대점(point-to-point) 연결

Server
- socket(): 소켓 생성(TCP는 stream)
- bind(): 사용할 IP address와 Port number 등록
- listen(): 연결되지 않은 소켓을 요청 수신 대기 모드로 전환(Block 상태)
Client
- socket(): 마찬가지로 소켓 생성(TCP는 stream)
- connect(): Client에서 Server와 연결하기 위해 소켓과 목적지 IP address, Port number 지정 (Block 상태)
Server
- accept(): client의 요청 수락 후 실질적인 소켓 연결 → 통신을 위한 새로운 소켓 생성
처음 만들어 진(bind() 후 listen()한) 소켓은 그 이후로도 새로운 Client의 요청을 대기하기 위해 쓰입니다
Server-Client
- send(), recv(): Client는 처음에 생성한 소켓으로, Server는 새로 반환(생성)된 소켓으로 client와 server 간에 데이터 송수신
- close(): 소켓을 닫음
Datagram sockets - UDP (User Datagram Protocol)
- UDP를 사용하므로 비 연결형(Connectionless) 소켓
- 신뢰성을 보장할 수 없습니다.
- 데이터가 순서대로 송수신될지를 보장하지 못합니다.
- 점대점 연결뿐만 아니라 일대다도 가능

connect() 과정이 필요 없기 때문에 소켓을 생성한 후 바로 데이터 전송합니다. 따라서 주로 일 대 다 통신에 많이 쓰입니다. 또한, 데이터 손실을 감수할 수 있는 영상 스트리밍과 같은 분야에서 사용됩니다.
소켓통신 VS HTTP 통신
또 하나의 대표적인 통신 방법인 HTTP 통신 방식과 소켓통신을 비교해 보겠습니다. 이 둘의 가장 큰 차이점은 서버와 클라이언트 사이에 연결을 유지하는지 여부입니다.
HTTP 통신
먼저 HTTP는 아래와 같이 클라이언트에서 요청하고 서버에서 응답하면 연결이 끊어지고 다음에 요청을 할 때 다시 연결을 시도하는 형식입니다.


물론 poling, long poling, keep-alive 속성 등에 따라서 꼭 위와 같은 흐름으로 통신하는 것은 아니지만 주로 응답-요청의 방식으로 비실시간성을 가진 웹 통신에서 주로 사용되는 단방향 통신 방법입니다.
소켓통신
이에 반해 소켓통신은 한 번 연결을 하면 강제로 연결을 종료할 때까지 실시간 양방향 통신이 유지되는 통신 방법입니다.

사실 HTTP도 버전에 따라 TCP/UDP 기반의 통신인 만큼 내부적으로 Stream Socket이나 Datagram Socket 같은 소켓통신을 활용한 통신 방식입니다. 하지만 한쪽에서만 요청에 대한 응답을 하는 웹 통신의 특성상 HTTP가 하나의 중요한 프로토콜로 구분되었기 때문에 소켓통신과 구분하여 부릅니다. 즉, HTTP 통신은 소켓통신의 일종이라고 할 수 있습니다.
이렇게 소켓통신에 대해 알아보았는데요. 다음에는 소켓통신을 이용한 실제 프로그램 작성을 해보겠습니다.