Notice
Recent Posts
Recent Comments
Link
«   2024/12   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
Archives
Today
Total
관리 메뉴

Code Habit

RTMP 본문

카테고리 없음

RTMP

코드베어 2023. 5. 5. 20:11

RTMP(Real Time Messaging Protocol)는 비디오, 오디오 혹은 기타 데이터를 인터넷을 통해 전송하는데 쓰이는 어도비사의 독점 통신 규약이다. 기본으로 1935번 포트를 사용하고 시도해서 실패하면 443 포트(RTMPS)나 80 포트 (RTMPT)로 재시도 한다. 

 

RTMP는 TCP 기반 프로토콜로 지속적인 연결 유지, 저지연, 더 나아가 원활한 스트리밍을 제공한다.

 

RTMP는 보통 다음 과정을 통해 연결이 이루어진다.

 

Handshake

RTMP의 시작은 Handshake로 시작하는데 클라이언트는 서버로 C0, C1, C2를 보내고 서버는 클라이언트로 S0, S1, S2를 보내 서로의 정보를 확인하고 Handshake과정을 끝낸다.

 

Chunking

Handshake 과정 이후 데이터를 주고 받는데 이는 Chunk 단위로 fragmentation되어 보내지, 수신 단에서 다시 ressembly 되어 온전한 메시지가 된다. RTMP 연결은 multiplex 될 수 있으므로, 각각의 스트림을 구분하기 위해 chunk stream ID를 사용한다. chunk format은 다음과 같으며 각각의 요소가 가변 크기를 갖는다.

  - Basic Header ( 1 / 2  / 3 Byte )

  - Message Header ( 0 / 3 / 7/ 11 Byte ) 

  - Extended Timestamp ( 0 / 4 Byte )

  - Chunk Data

 

RTMP Chunk Data의 크기는 기본 128bytes 이며 SetChunkSize라는 프로토콜 메시지를 통하여 RTMP Chunk Data의 크기를 변경할 수 있다.

 

Basic Header

Basic Header는 1~3bytes까지 존재하며 RTMP Chunk Header에 반드시 포함되며 Type 0(a) / Type 1(b) / Type 2(c)로 구성되어 있다.

  - fmt : Chunk format, Message Header의 type을 결정.

  - cs id ( Chunk Stream ID )

 

Message Header

다음에 오는 Message Header는 위의 fmt에 따라 Type 0(a) / Type 1(b) / Type 2(c) / Type 3으로 나뉜다.

 * Message Types

  - Type 0 (11 byte) : chunk stream의 시작 혹은 seek에 의해 timestamp가 뒤로 갔을 때 사용된다.

  - Type 1 (7 byte) : 이전 message와 message stream ID가 같으며, chunk size가 변하는 경우에 사용.

  - Type 2 (3 byte) : 이전 message와 message stream ID가 같으며, chunk size가 일정한 message에 사용.

  - Type 3 (0 byte) : 하나의 message가 여러 개의 chunk로 나눠진 경우 가장 앞의 chunk만 message header를 붙이며, 이후의 chunk들은 Type 3로 전달.

 

* Common Header Fields

  - timestamp (24) : Absolute timestamp, 16777215 (0xFFFFFF) 이상일 때는 0xFFFFFF로 기록하며 실제 데이터는 Extended timestamp에 기록.

  - timestamp delta (24) : 이전 chunk의 timestamp와의 차이. 16777215 (0xFFFFFF) 이상일 때는 0xFFFFFF로 기록하며 실제 데이터는 Extended timestamp에 기록.

  - messae length (24) : Message의 길이. 일반적으로 Message가 여러 개의 chunk로 나눠지기 때문에 마지막 chunk까지의 chunk payload 크기를 모두 합친 값.

  - message type id (8) : message의 type

  - message stream id (32) : Message Stream ID. Multiplexing을 하지 않는 이상 하나의 chunk stream id 안에서 message stream id는 같다. 따라서 type 0 message는 연결된 이후 한번만 보낸다.

 

Extended timestamp

Timestamp에 기록해야 하는 숫자가 16777215 (0xFFFFFF) 이상일 때, 더 많은 bit (32bit)를 이용하여 timestamp를 기록하기 위한 영역. Type 0 / Type 1 / Type 2의 timestamp영역이 0xFFFFFF인 경우에만 존재.

 

Chunk Data

Message Header의 Message Length가 Chunk Data 사이즈 보다 큰 경우 데이터는 쪼개져서 (Broken) 들어온다.

 

 

참조 : https://yoooonghyun.gitbook.io/documents/multimedia/overview/rtmp