소켓(Socket)의 정의
소켓은 일반적으로 접점을 위한 도구로 정의되어있다. 하지만 네트워켓 상에서의 소켓은 BSD UNIX 에서 개발한 네트워크 프로그래밍 인터페이스이다. 이를 네트워크 소켓(Network Socket) 이라고 하며 최근에는 호스트 간의 통신을 대부분 인터넷으로 하기 때문에 인터넷 소켓(Internet Socket)이라고도 한다. 네트워크 통신을 하려면 각 TCP/IP 계층 (OSI 7 계층)의 협력을 통해 이루어진다. 소켓은 그 중 전송 계층 (Transport Layer)와 응용 계층 (Application Layer) 사이에 있는 인터페이스이다. 즉, 통신의 시작점과 종료점. 엔드 포인트(end-point)라고 볼 수 있다. 우리는 소켓을 이용하여 TCP나 UDP에 접근할 수 있다.
소켓의 구성 요소
소켓의 구성요소로는 프로토콜, IP 주소, 포트 번호가 있다.
프로토콜
프로토콜은 데이터 전송을 위한 표준 집합 규칙이다. 주로 TCP/IP, UDP/IP 프로토콜을 사용한다.
TCP/IP
- 연결 설정 후 통신이 가능한 연결형 프로토콜이다.
- 신뢰성있는 데이터 전송의 특징을 가지고 있다. 필요할 경우 데이터를 재전송한다.
- 데이터 경계의 구분이 없는 바이트 스트림(Byte-Stream) 서비스이다.
UDP/IP
- 연결 설정 없이 통신이 가능한 비연결형 프로토콜이다.
- TCP에 비해 신뢰성이 떨어지는 데이터 전송의 특징을 가지고 있다. 데이터를 재 전송하지 않는다.
- 데이터 경계를 구분하는 데이터그램(Datagram) 서비스이다.
IP 주소 (송/수신 측)
IP 주소는 서버 장비 또는 네트워크 장비(호스트)를 주소로 표현한 것이다. IP 주소는 호스트마다 하나씩 있으며 고유한 특성을 가지고있다.
포트번호 (송/수신 측)
포트 번호는 통신을 사용하는 어플리케이션을 식별하는 번호이다. 포트는 65535까지 사용할 수 있지만, 사용자가 사용할 수 있는 포트는 1024 ~ 65535까지 사용할 수 있다.
소켓의 통신 과정
아래 그림은 연결 지향형 소켓 (TCP)의 예시이다.
소켓은 서버 소켓(Server Socket)과 클라이언트 소켓(Client Socket)으로 구성되어있다.
소켓 통신은 아래 과정을 통해 이루어진다.
1. socket() 으로 통신을 위한 엔트포인트을 작성하고 해당 종료점을 나타내는 소켓 설명자를 리턴한다. 소켓 설명자는 정수로 이루어져있다.
2. 소켓 설명자가 있는 어플리케이션은 고유한 이름을 소켓에 바인드할 수 있다. 서버 소켓은 네트워크에서 액세스 가능한 이름을 바인드해야 한다.
3. 서버 소켓에서 listen()으로 클라이언트 연결 요청을 승인하려는 의사를 표시한다.
4. 클라이언트 애플리케이션이 스트림 소켓에 대해 connect() API를 사용하여 서버에 대한 연결을 설정한다.
5. 서버 애플리케이션이 accept() API를 사용하여 클라이언트 연결 요청을 승인한다.
6. 서버와 클라이언트 간 연결이 이루어지면 모든 데이터 전송을 할 수 있다.
7. 서버 또는 클라이언트는 조작을 중단하려는 경우 close() 를 실행하여 소켓이 획득한 시스템 자원을 해제한다.
소켓 통신의 사용 예시
서버와 클라이언트가 계속 연결을 유지하는 방식이기 때문에 미디어 스트리밍과 같은 실시간으로 데이터를 주고 받는 상황에 사용된다.