RTPの基本


<!--

##　RTPというプロトコルについて

-->

## はじめに

私自身，ちょうど1年ほど前にRTPを知り，勉強し始めました．
しかし，RTPに関する記事や情報が少なく，なかなかに苦しめられました...
そのため，この記事では，「RTPとはなんぞや？」「どんなパケット構造なん？」というような基本的な部分の説明を行なっていきます．
（初めて書く記事なので分かりにくかったごめん...）


### この記事でわかる・できること
<!--
読んだら何がわかるようになるのか、何ができるようになるのかを書きましょう。
-->

- RTPとはどのようなものなのか
- RTPパケットはどのような構造となっているのか


### この記事の対象者
<!--
誰に向けた記事なのかを明確にすることで読者に選んでもらいましょう。
-->

- RTPの基本を知りたい人


<!--### 動作環境・使用するツールや言語

誰に向けた記事なのかを明確にすることで読者に選んでもらいましょう。
環境を書くと分かりやすいです。
- OS バージョン
    - 例 Windows11 23H2
- ツール
    - 例 VSCode 1.86.2
- 言語
    - 例 Python 3.12.2
- フレームワーク
    - 例 flask 3.0.2

- OS バージョン
- ツール バージョン
- 言語 バージョン
- フレームワーク バージョン
-->

## 1．RTPについて

### 1．そもそもRTPとは何なのか
<!--
章全体の要約や、何について書くのかをここに書きます。
記事が長い時や資料として作るときは番号を振ることをおすすめします。
章を増やすときは章から項までをコピーしてください。
-->

初めに，そもそもRTPとはどのようなものなのかについて説明していきます．

結論から述べるとRTPとはプロトコル（データをやりとりする時のルール）の1つです．

よく耳にするであろうHTTPとかの仲間ですね．（厳密にはHTTPとは階層が違うけど...）
なので，RTP自体はデータをやりとりする時のルールなんだ的な認識を持っていればOK
### 2．RTPの特徴
<!--
記事の主要な部分です。ここに思い思いの内容を書いていってください。

画像やGIFがあると分かりやすいです。
画像があるとUIが変わったとしても読者がアタリをつけて対応しやすくなります。

コードを記載する場合は必ずコードブロックを使いましょう。
バッククオート3つで囲んでください。
```python:表示名

    print('Hello World')
    
```
-->
では，RTPというルールはどのような特徴があるのかについて説明をしていきます．
RTPの特徴は主に3つ
- 低遅延なデータのやりとり
- UDP上での動作
- シーケンス番号，タイムスタンプの存在

RTPの1番の特徴は低遅延（リアルタイム）という部分です．
この低遅延なデータのやりとりを実現させるため，UDP上での動作やシーケンス番号，タイムスタンプが存在しています．
順番に説明を行なっていきます．
- 低遅延なデータのやりとり
説明不要！とりあえず速い
　
- UDP上での動作
RTPはUDPというプロトコルを元に動作を行っています．
一般的には，TCPかUDPが有名どころですが，UDPはTCPよりも速いデータのやりとりが可能です．（TCPとUDPの違いはこちら）
UDPを元にすることでRTPは低遅延なデータのやりとりを可能としています．
　
- シーケンス番号，タイムスタンプの存在
UDPは速いデータのやりとりが可能です．
しかし，速くするために必要最小限のデータしかやりとりせず，UDPでのやりとりではデータの送信された順序などは判別不可です．
そのため，RTPでは，受け取り側が正確にデータの並び替えを行えるように，シーケンス番号（データの送信した順番），タイムスタンプが付いています．

### 3．RTPの利用場面
次は，上記のような特徴を持つRTPの利用場面について説明をしていきます．
主な利用場面は
- 音声
- 映像

これら2つのデータのやりとりで利用されています．（他にもあったらごめん）
例えば，電話をするのに「返事が返ってくるまで1分の遅延があります」だったり，
リモート会議するのに「映像に2分の遅延があります」だったら不便ですよね．
そのため，データの変化をリアルタイムに反映するため，低遅延のRTPを利用してやりとりを行います．


## 2．RTPの構造
ここからはRTPの具体的な中身に触れていきます．
RTPのパケット構造（やりとりするデータの中身）は以下の通りです．
![RTP3-1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4025077/d234ffad-8cfe-4442-96c3-1a67db28da6f.png)
（図作るのってめっちゃ大変...）

- V（Version）... 現在使っているRTPのバージョン（基本的に2が使われている）
- P（Padding）... Payloadの一番後ろに0（パディング）の有無
- E（Extension）... 拡張ヘッダの有無
- CC（Contributing Source Count）... CSRCの数
- M（Marker）... 画像の終端などの特別なイベントの有無
- PT（Payload Type）... データフォーマットの種類
- Sequence Number ... シーケンス番号（データの順番）
- Timestamp ... タイムスタンプ
- SSRC（Synchronization Source Identifier）... 送信元を識別するための識別子
- CSRC（Contributing Source Identifier）... データを構成している送信元のSSRC
- Extension Data ... 拡張データ
- Payload ... 実際の音声や映像データ

これらの要素によってRTPパケットは構成されています．
CSRCは1つの送信元から送信される場合，存在しません．
また，Extension Dataは名前の通り，拡張部分なので，パケットによって存在するしないが変化します．（パケットのXで判別可能）

<!--#### 内容の小見出し(項)
<!--
より詳細な内容を書いたり、事例を挙げたりするときに使います。
- 節の内容の列挙
- 節の補足事項
- 例外
-->


## まとめ
<!--
どちらかを書きます。あってもなくても良いです。
-->
いかがだったでしょうか？
RTPについて少しでも理解できたという人がいれば幸いです．
今回は基本的な部分のため，まだ書ききれていない情報が多々あります．
足りていない情報は順次，更新を加えていく予定です．

## 参考資料
<!--

https://qiita.com

[リンク1](https://qiita.com)

https://www.paltek.co.jp/techblog/techinfo/230201_01
[リンク2](https://www.paltek.co.jp/techblog/techinfo/230201_01)
-->

https://qiita.com


https://www.paltek.co.jp/techblog/techinfo/230201_01