소켓이란?
- 프로세스가 네트워크 세계로 데이터를 내보내거나 혹은 데이터를 받기 위한 실제적인 창구역할
- 프로세스가 데이터를 보내거나 받기 위해서는 반드시 소켓을 열어서 소켓에 데이터를 써내보내거나 소켓으로부터 데이터를 읽어들어야 한다.
- 소캣은 프로토컬, IP주소, 포트 넘버로 정의된다.
- 소켓은 떨어져 있는 두 호스트를 연결해주는 도구로써 인터페이스 역할
데이터를 주고 받을 수 있는 구조체
- 소켓을 통해 데이터 통로가 만들어집니다.
- 소켓은 역할에 따라 서버 소켓, 클라이언트 소켓으로 구분됩니다.
서버(Server)
클라이언트 소켓의 연결 요청을 대기하고, 연결 요청이 오면 클라이언트 소켓을 생성하여 통신이 가능하게 합니다.
- socket() 함수를 이용하여 소켓을 생성
- bind() 함수로 ip와 port 번호를 설정
- listen() 함수로 클라이언트의 접근 요청에 수신 대기열을 만들어 몇 개의 클라이언트를 대기 시킬지 결정
- accept() 함수를 사용하여 클라이언트와의 연결을 기다림
클라이언트(Client)
실제로 데이터 송수신이 일어나는 것을 클라이언트 소켓이다.
- socket() 함수로 가장 먼저 소켓을 연다.
- connect() 함수를 이용하여 통신 할 서버의 설정된 ip와 port 번호에 통신을 시도합니다.
- 통신을 시도 시, 서버가 accept() 함수를 이용하여 클라이언트의 socket descriptor를 반환
- 이를 통해 클라이언트 서버가 서로 read(), write()를 하며 통신의 과정 반복
소켓 종류
스트림(TCP)
- 양방향으로 바이트 스트림을 전송, 연결 지향성
- 오류 수정, 정송처리, 흐름제어 보장
- 송신된 순서에 따라 중복되지 않게 데이터를 수신 -> 오버헤드가 발생
- 소량의 데이터보다 대량의 데이터 전송에 적함 -> TCP를 사용
데이터그램 (UDP)
- 비연결형 소켓
- 데이터의 크기에 제한이 있음
- 확실하게 전달이 보장되지 않음, 데이터가 손실되도 오류가 발생하지 않음
- 실시간 멀티미디어 정보를 처리하기 위해 주로 사용
Socket 통신
서버와 클라이언트가 특정 port를 통해 실시간으로 양방향 통신을 하는 방식
Socekt 통신의 특징
- 서버와 클라이언트가 계속 연결을 유지하는 양방향 통신
- 서버와 클라이언트가 실시간으로 데이터를 주고받는 상황이 필요한 경우에 사용
- 실시간 동영상이나 Streaming이나 온라인 게임 등과 같은 경우에 자주 사용된다.
소켓은 주로 채팅 서비스, 주식 차트 페이지 등 단방향 통신이 아닌 응답이 없어도 통신을 주고 받아야 할 때 사용된다.
사이드 프로젝트로 npm socket.io를 하는데 뭔지 몰라서 궁금해서 소켓통신에 대해서 찾아보았다.