본문 바로가기

서버운영 (TA, ADMIN)/네트워크

[네트워크] 멀티플렉싱(Multiplexing)

1. 멀티플렉싱(Multiplexing)

멀티플렉서를 떠올려보면 접근이 조금 용이할 것이다. 멀티플렉서는 2^n 개의 입력을 하나의 출력으로 디멀티플렉서는 1개의 입력을 2^n개의 출력 중 하나로 변환해주는 장치입니다. 아래는 멀티 플렉서의 그림입니다.

 

소프트웨어에서도 이렇게 여러개의 입력을 하나의 출력으로 만들어주는 기능을 "Multiplexing", 하나의 입력을 여러개의 출력으로 변환해 주는 기능을 "Demultiplexing"일고 합니다.

2. Transport Layer에서 등장하는 Multiplexing

Transport Layer의 주된 기능 중 하나가 Multiplexing과 Demultiplexing입니다. Transport Layer는 end-point에 존재하는 host 끼리의 안전한 송수신을 보장하기 위해서 존재하는 계층입니다. Trnsport Layer에서는 특정 port 번호를 가진 TCP/UDP 패킷들을 port 번호대로 분류한 다음, port와 연결된 소켓으로 해당 데이터를 전달해 주는 역할을 합니다. Trnsport Layer의 segment 헤더 정보를 읽고, 해당 port 번호와 연결되어 있는 소켓을 찾아서 데이터그램을 분배해 주는 역할을 합니다. 이렇게 하나의 Transport Layer가 여러 소켓에게 데이터를 분배해주는 1->N으로 흘러가는 동작 과정을 Demultiplexing이라고 합니다. 반대로 데이터를 보낼때는 여러, 소켓들이 하나의 Transport Layer로 요청을 보내게 되는데, 요청한 소켓에 Trnasport Layer의 packet 헤더를 붙여서 network layer라는 하나의 인터페이스로 전달하는 N->1의 과정을 Multiplexing이라고 합니다. (소켓은 Application Layer와 Transport Layer를 연결해주는 통로와 같은 개념)

 

3. 서버 유형에서의 multiplexing

웹서버를 생성하는 방식은 크게 3가지로 나뉩니다. 한번에 하나의 요청만 처리할 수 있는 Single Process/thread 방식, 한번에 여러 연결을 처리할 수 있는 multi-thread, multi-process 방식, multiplexing 방식 이 4가지 입니다. 이중 multiplexing 방식은 기존에 여러 요청을 한번에 처리하는 방식들이 process나 thread를 여러개 생성하는 것과는 달리, 단 하나의 서버 프로세스로 여러 클라이언트 소켓들의 요청을 처리합니다. 하나만 존재하는 서버 소켓은 이런 작업을 가능하게 하기 위해서 polling 또는 interrupt 방식을 사용하게 됩니다. polling 방식은 서버 프로세스가 file descriptor를 지속적으로 감시하는 방식으로 이루어 집니다. 만약 하나의 file descriptor에 입력/출력을 요청한다는 flag가 set 되어 있으면, 해당 file descriptor에 서버 소켓이 연결하여 read 혹은 write 작업을 진행해준 뒤, 해당 클라이언트 소켓과의 연결을 끊고, 다른 소켓들에 대한 작업을 처리해주러 갑니다. 이렇게 서버 동작 유형에서 multiplexing은 하나의 소켓으로 여러 연결을 다루는 1:N 요청이 처리되는 방식을 의미합니다. 이 방식은 Transport Layer가 가지는 multiplexing의 성질과는 별개로 서버 동작유형 별로 가지는 multiplexing 속성입니다.

4. HTTP/2.0에서의 Multiplexing

HTTP/2.0은 multiplexing을 지원합니다. HTTP/1.1 같은 경우에는 만약 하나의 연결에 대해서 여러 데이터를 순차적으로 하나씩 보내거나(pipelining), 여러개의 TCP connection을 만들어 데이터 전송을 시도했습니다. 하지만 HTTP/2.0 부터는 하나의 TCP 연결에 대해서 여러 데이터를 동시에 전송할 수 있는 Multiplexing이 도입됩니다. multiplexing에서는 여러 데이터 및 파일은 하나의 TCP 연결 위에서 파일 간의 논리적으로 독립적인 연결인 stream을 생성하고, 이 stream으로 데이터를 보내게 됩니다. 하나의 TCP connection이 여러 파일을 동시에 전송하는 이러한 방식을 HTTP/2.0에서 multiplexing이라고 합니다.