WebRTCにおけるSDPを理解する

SDPによってオファー/アンサーモデルがどのように構築されているかを見る

Posted on Wednesday, January 6, 2021

TOC

モチベーション

最近はWebRTCにハマっていて、別に何か作りたいものがあったからというわけでは無いのだけど単純に面白いから見ており、それに際してその周辺技術にぼちぼちコミットしたりしている(こんな感じ)。

ただ実際のところは本当に趣味といった具合なので詳細な部分についてはまだまだ勉強中だったりする。

そんなわけでこの記事はある程度理解が進んだSDPについての勉強メモみたいな感じ。

SDPとは

まず最初にSDPとググるとだいたいゼロトラストの方のSDPが出てくる。

ゼロトラストのSDPはSoftware Defined Perimeterの略語で、WebRTCのSDPとは全くの別物であることに注意(ただ、WebRTCはP2P通信でファイアウォールなどのネットワークの壁をどう越えるかみたいなところが結構大変で、そこらへんの概念にゼロトラストのSDPみたいな考え方が出てきたりするので無関係というわけではなさそうだけども…)。

とりあえず今回の記事ではSDPとはSession Description Protocolだと最初に断っておきたい。

オファーアンサーモデル

さて、WebRTCにおけるSDPの話というわけだけど、WebRTCはP2P通信で、クライアントとクライアントが通信することになる。

何を通信するかというと、音声だったりテキストだったり画像とか動画。 ただ、前提として各クライアントがどのメディアを使えるかはお互いに確認してみないと分からないのである。

そこでお互いが何のメディアを使えるかを伝え合う所作をオファーアンサーモデルという。

具体的には

アリス「こっち電話とビデオいけるけどそっちどうよ?」

ボブ「あーこっち電話しか使えないんだわ」

的なやり取りである。

仕様を眺めてみる

SDPがP2P通信においてお互いがどのメディアを使用可能か確認するお作法であることはわかったので、具体的にどのようにやっていくかを見ていく。

クライアント間では以下のようなデータがやり取りされる。

v=0
o=jdoe 2890844526 2890842807 IN IP4 10.47.16.5
s=SDP Seminar
i=A Seminar on the session description protocol
u=http://www.example.com/seminars/sdp.pdf
e=j.doe@example.com (Jane Doe)
c=IN IP4 224.2.17.12/127
t=2873397496 2873404696
a=recvonly
m=audio 49170 RTP/AVP 0
m=video 51372 RTP/AVP 99
a=rtpmap:99 h263-1998/90000

このv=とかみたいなのはSDPにおけるDSLみたいなもので、それぞれがセッション情報だったり扱えるメディアについての情報、どのポート番号を解放するかなどを表している。

簡単にいくと

  • v= : セッションのバージョン番号。基本的に0で固定。
  • o= : 送信元の情報。
  • s= : セッション名。
  • i= : セッション情報。
  • u= : URI
  • e= : メールアドレス。p=で電話番号が書かれることも。
  • c= : 接続データ。
  • b= : 帯域。
  • t= : タイミング、時間。スタートと終わりがUnixタイムで表現される。
  • r= : 繰り返し回数
  • z= : タイムゾーン
  • k= : 暗号化キー
  • a= : 属性情報、セッションの拡張情報
  • m= : メディア記述

という具合。

これらは全部が必須というわけではなくオプションのものもあるが、SDPの記述においてはいくつかの制約があったりする。

具体的に言うと、例えばv=0などでは途中に空白を入れてはいけないことや、voなどの出現順序を間違えてはいけないことなどがある。

詳しい話はこのSlideshareがめちゃくちゃわかりやすく解説してあるが、これの補足をいくつかしておく。

  • m=行の数のオファーとアンサーで同一でなければいけないけど、互いに扱えるメディアの数が違う時はどうするの?
    • 該当するメディアのポート番号を0として解放しない旨を示す
  • 行の並びが指定されているけどm=が複数並んでる時は順序指定ってある?
    • audioを優先的に上にする。

ここら辺の仕様書は情報通信技術委員会が作ったものが参考になるので確認しよう。

また一番詳しいのはRFC4566なのでこれを読もう。