RTMP란

RTMP는 Adobe에서 개발한 실시간 데이터 전송을 위한 프로토콜입니다. 자사 서비스인 Flash Player에서 사용할 목적으로 RTMP가 개발되었습니다. 따라서 비디오, 오디오와 같은 스트리밍에 최적화된 프로토콜입니다.

2009년 RTMP의 스펙이 공개되었습니다. 이후 2020년에 Flash Player 서비스가 종료되면서 현재까지 추가적인 업데이트 없이 이어져 오고 있습니다. Flash Player 서비스 종료 이후 RTMP 프로토콜 사용 빈도가 감소했지만, 여전히 송출 단계에서 널리 사용되고 있는 프로토콜입니다.

RTMP는 왜 사라지지 않았는가?

앞서 언급했듯이 Flash Player 서비스 종료 이후 RTMP 사용 빈도는 감소했습니다. 이유는 HLS와 같은 HTTP 기반 프로토콜이 방화벽 우회가 쉽고, 보안 및 호환성 측면에서 이점이 있기 때문입니다. 하지만 여전히 서버로 데이터를 전송하는 과정에서는 RTMP가 주로 사용됩니다.

RTMP는 평균 5초 대의 짧은 지연 시간을 자랑합니다. 또한, TCP 기반으로 동작하여 안정적인 데이터 전송이 가능하고, 구조가 단순하며 인코딩 시 리소스를 적게 사용한다는 장점이 있습니다.

RTMP의 데이터 전송 과정

RTMP 프로토콜은 다음과 같은 단계를 통해 서버로 미디어 데이터를 전송합니다.

Handshake -> Connect -> CreateStream -> Publish -> 미디어 데이터 전송

Handshake

RTMP 프로토콜을 통해 클라이언트와 서버 간 연결을 위해 가장 먼저 핸드셰이크 과정을 반드시 거쳐야 합니다. 이 과정에서 클라이언트와 서버는 네트워크 연결을 설정하고, 통신 준비 상태를 확인합니다. 특히, 실시간 스트리밍에서 클라이언트와 서버 간 시간 동기화를 위해 이 과정은 필수입니다.

핸드셰이크 단계에서는 3개의 정적 크기의 청크가 사용됩니다.

클라이언트와 서버는 다음과 같은 순서로 청크를 주고 받으며, 상태값을 업데이트 합니다.

+-------------+                           +-------------+
|    Client   |       TCP/IP Network      |    Server   |
+-------------+            |              +-------------+
      |                    |                     |
 Uninitialized             |               Uninitialized
      |          C0        |                     |
      |------------------->|         C0          |
      |                    |-------------------->|
      |          C1        |                     |
      |------------------->|         S0          |
      |                    |<--------------------|
      |                    |         S1          |
 Version sent              |<--------------------|
      |          S0        |                     |
      |<-------------------|                     |
      |          S1        |                     |
      |<-------------------|                Version sent
      |                    |         C1          |
      |                    |-------------------->|
      |          C2        |                     |
      |------------------->|         S2          |
      |                    |<--------------------|
   Ack sent                |                  Ack Sent
      |          S2        |                     |
      |<-------------------|                     |
      |                    |         C2          |
      |                    |-------------------->|
 Handshake Done            |               Handshake Done

C0/S0