소켓
- 프로세스와 프로세스 간의 통신을 위한 API
- 어플리케이션과 네트워크 사이의 인터페이스
어플리케이션은 통신을 할 때 소켓을 생성한다. 이때 소켓의 타입은 통신 방식을 의미한다.
소켓을 생성한 후 어플리케이션의 동작은 다음과 같다.
소켓은 TCP 소켓, UDP 소켓 2가지가 있다.
- TCP를 통해 통신하면 TCP 소켓을 생성해서 사용한다.
- UDP를 통해 통신하면 UDP 소켓을 생성해서 사용한다.
SOCK_STREAM 이라고도 한다.
SOCK_STREAM 이라고도 한다.
TCP 소켓은 다음과 같이 동작한다.
이후 서버는 클라이언트로부터 연결이 들어올 때까지 대기한다.
이후 클라이언트와 서버는 데이터 요청과 응답을 주고 받으며 Read, Write 작업을 진행한다. (통신)
전체 과정을 그림으로 나타내면 다음과 같다.
각 계층 간의 통신을 대략적으로 나타내면 다음과 같다.
어플리케이션 계층에 있는 다양한 프로세스들은 각자만의 소켓을 하나씩 갖고 있으며, 이 소켓을 통해 전송 계층으로 메시지를 내려보낸다. 전송 계층은 내려받은 메시지를 각각 하나의 세그먼트로 캡슐화해서 하위계층으로 내려준다.
이때 상위 계층으로부터 내려오는 메시지는, 서로 다른 프로세스로부터 내려오기 때문에 여러 개의 경로를 통해 내려온다.
멀티플렉싱 (Multiplexing) 이란 이렇게 여러 경로로 내려온 메시지를 그때그때마다 세그먼트로 만들어서 하위 계층으로 내려주는 작업을 의미한다.
디멀티플렉싱 (Demultiplexing) 이란 다른 프로세스로부터 세그먼트를 받으면, 그 세그먼트로부터 메시지만을 뽑아내서 알맞은 경로를 통해 상위 계층 (어플리케이션 계층)으로 올려보내는 작업이다. 즉, 하나의 경로를 통해 들어온 데이터를 수많은 경로 중 알맞은 곳으로 보내는 과정이다.
이때 데이터를 보내는 경로는 세그먼트에 포함되서 온 Header 정보를 토대로 결정한다.
호스트에서 호스트로 데이터를 전송할 때 다음과 같이 멀티플렉싱/디멀티플렉싱이 발생한다.
전송측의 여러 프로세스가 각자의 소켓을 가지고 TCP/UDP를 통해 메시지를 보내는 과정에서 멀티플렉싱이 발생한다. 여러 개의 소켓에서 데이터를 모은 후, 헤더와 함께 하나로 묶는다. 이때 헤더는 디멀티플렉싱에서 사용된다.
즉, 하나의 통신 채널을 통해 여러 개의 데이터를 동시에 보내는 작업이다. 여러 어플리케이션들이 전송 계층으로 메시지를 전달하면, 전송 계층에서는 헤더를 붙여서 캡슐화하고 네트워크 계층으로 일렬로 내려보낸다.
반대로 수신측에서 메시지를 수신할 때는 디멀티플렉싱이 발생한다. 수신 받은 세그먼트를 알맞은 소켓으로 전달한다.
즉, 수신측의 네트워크 계층에서 일렬로 올라온 데이터를 각각의 헤더 정보를 토대로 알맞은 어플리케이션 계층의 소켓으로 전달하는 과정이다.
따라서 멀티플렉싱은 여러 개의 Input과 하나의 Output이 있는 상태이며, 디멀티플렉싱은 하나의 Input이 여러 개의 Output으로 나타나는 상태이다.
먼저 세그먼트와 패킷에 대해 살펴보자면,
Segment (세그먼트)
실질적인 데이터 전송을 위해 데이터를 일정 크기로 나눈 단위이다.
발신 및 수신 포트 번호, 오류 검출을 위한 CheckSum, Frame Check Sequence 등이 붙는다.
Packet (패킷)
세그먼트를 목적지까지 전송하기 위해, 세그먼트에 출발지와 목적지의 논리적 주소 (IP 주소)를 붙인 단위이다.
즉, 데이터 + IP Header 구조이다.
TCP/UDP 세그먼트를 살펴보면 다음과 같다.
32비트 즉 4바이트를 사용하며, 헤더의 앞쪽 2바이트에는 출발지 정보를, 뒷쪽 2바이트에는 목적지 정보를 담는다.
헤더에는 Source Port #, Dest Port # 과 다른 여러개의 헤더 정보들이 포함되어있다. 이때 각각의 정보가 담겨있는 공간 하나하나를 필드라고 한다.
데이터에는 어플리케이션 게층으로부터 내려온 데이터 즉, 메시지가 담겨있다.
호스트끼리 주고 받는 IP 데이터그램 (네트워크 계층의 패킷 단위)에는 출발지 (Source)의 IP 주소와 포트 넘버, 목적지 (Dest)의 IP 주소와 포트 넘버가 들어있다. 또한 각각의 데이터그램은 1개의 전송 계층 세그먼트를 포함하고 있다.
따라서 호스트가 IP 데이터그램을 받으면 안에 들어있는 IP 주소와 포트 넘버를 통해 알맞은 소켓으로 세그먼트를 전달한다.
디멀티플렉싱은 2가지 방식이 있다.
비연결형 디멀티플렉싱으로 UDP를 사용하는 방식이다.
Dest IP와 Dest 포트 넘버만을 사용해서 디멀티플렉싱이 이루어진다. 따라서 Source IP 주소 또는 Source 포트 넘버 가 달라도 Dest 포트 넘버만 같으면 같은 소켓으로 전달된다.
이 말은 즉, 출처와 상관없이 목적지의 IP 주소, 포트 넘버만을 고려한다는 의미이다.
연결형 디멀티플렉싱으로 TCP를 사용하는 방식이다.
Source IP, Source Port, Dest IP, Dest Port를 사용해서 디멀티플렉싱이 이루어진다. 따라서 이 중 하나라도 다르면 다른 소켓으로 전달된다.
통상적으로 쓰레드를 사용하는 웹 서버에서 이용하고 있다. 이때 각 쓰레드가 각 소켓을 담당한다.
TCP를 사용하는 웹 서버는 각 클라이언트만을 위한 소켓을 열어둔다. 따라서 소켓을 많이 열어둬야하기 때문에 자원을 많이 사용한다는 특징이 있다.