소켓(Socket)이란?
- 데이터를 내보내거나 받기 위한 실제적인 창구를 의미한다.
- 즉, 두 호스트를 연결해 주는 도구로써 인터페이스의 역할을 한다.
- 역할에 따라 서버소켓, 클라이언트 소켓으로 구분된다.
- Server와 Client가 계속 연결을 유지하는 양방향 통신(실시간으로 데이터를 주고받는 상황에서 쓰인다.)
- 실시간 동영상 Streaming이나 온라인 게임 등과 같은 경우 자주 사용된다.
서버(Server)
- 클라이언트 소켓의 연결 요청을 대기하고, 연결 요청이 오면 클라이언트 소켓을 생성하여 통신이 가능하게 한다.
- 순서
1. socket() 함수를 이용하여 소켓을 생성
2. bind() 함수로 ip와 port 번호를 설정하게 됩니다.
3. listen() 함수로 클라이언트의 접근 요청에 수신 대기열을 만들어 몇 개의 클라이언트를 대기시킬지 결정
4. accept() 함수를 사용하여 클라이언트와의 연결을 기다림
클라이언트(Client)
- 실제로 데이터 송수신이 일어나는 곳
- 순서
1. socket()함수로 소켓을 가장 먼저 연다.
2. connect()함수를 이용하여 통신할 서버의 설정된 ip와 port번호에 통신을 시도
3. 통신을 시도 시, 서버가 accept() 함수를 이용하여 클라이언트의 socket descriptor를 반환
4. 이와 같은 과정을 통해 클라이언트와 서버가 서로 read(), write()를 하며 통신
소켓 종류
스트림(TCP)
- 양방향으로 바이트 스트림을 전송(연결 지향성)
- 오류 수정, 전송처리, 흐름제어 보장
- 송신된 순서에 따라 중복되지않게 데이터를 수신 → 오버헤드가 발생
- 소량 보단 다량의 데이터 전송에 적합
데이터그램(UDP)
- 비연결형 소켓
- 데이터의 크기에 제한이 있음
- 확실하게 전달이 보장되지않음
- 데이터가 손실돼도 오류가 발생하지 않음
- 실시간 멀티미디어 정보를 처리하기 위해 주로 사용 ex) 전화