この記事の目的
- WebRTCを0から学ぶのが割としんどかった。他の人が同じ思いをしないように今わかっていることをわかりやすく記述します。
- 本当に何も知らないのに急に仕事でやらないといけなくなった人とかに読んでもらいたいです。
- できるだけ用語解説やリンクの掲載は行いますが、言葉がわからない場合は調べてください。
WebRCTとは
- web会議が一番有名な例。リアルタイムに動画や音声の通信を行うことを可能にする技術全体のこと。
- 色々な場所にいる人が同時に音声や動画を共有することを実現するための技術のこと。
どうやって実現するのか
Web会議ツールでAさんとBさんが通話するまでの流れを例に取り、実現方法を説明します。
まず最初に実現手順を示します。
- 通話をするために必要な情報を運ぶネットワーク上の道を開く(共有シグナリングチャネル)
- Aさん、Bさんお互いのネットワーク上の住所を取得する(STUN/TURN, ICE)
- お互いのネットワーク上の住所に通話するために必要な情報を送り合う(Session Negotiation)
- お互いがお互いの情報を受け取ることで通信が確立して通話可能な状態に(WebRTC確立)
共有シグナリングチャネル
お互いの通信ができるか確認したり情報を交換するための仲介役を立てておく必要があります。この仲介役は共有シグナリングチャネルと呼ばれ、主にWebSocketが使われています。
今さら聞けないWebSocket~WebSocketとは~
STUN/TURN, ICE
実際の世界で手紙を送るためには相手の住所を知らないといけないのと同様に、ネットワーク上でも通信相手に情報を届けるために相手の住所を知っておく必要があります。
ネットワーク上の住所、というのはIPアドレスのことです。IPアドレスさえ分かっていれば情報を届けることができます。
ところが、プライベートなIPアドレスからパブリックなIPアドレスを直接取得することはできないので、通信者のどちらかもしくは双方がプライベートネットワークに所属している場合、情報をお届けできないのです。この問題を解決してくれるのがSTUNサーバーです。
(プライベート・パブリックIPアドレスに関してはこちらなど)
STUNサーバー
自身のパブリックIPアドレスを教えてくれるサーバー。STUNサーバーに「外から見たらどんな住所に見えますか〜?」と聞くと自分をネットワークの外から見た時の住所を教えてくれるイメージ。
STUNサーバーとはhttps://webrtcforthecurious.com/ja/docs/03-connecting/#stun
ところが、通信しようとしているネットワークがそれぞれSTUNサーバーに対する互換性がない場合など、なんらかの妨げがある場合は通信に失敗してしまいます。この場合はお互いが直接通信する方針を諦め、サーバーに通信の仲介役をしてもらいます。この仲介役がTURNサーバーです。
TURNサーバー
通信しようとしている人の間に立ってデータのやりとりの仲介者となってくれるサーバー。通信しようとしている人はTURNサーバーに向けてデータを投げ、相手はTURNサーバーからデータを受信することになります。
TURNサーバーとはhttps://webrtcforthecurious.com/ja/docs/03-connecting/#turn
実際のWebRTCの確立ではSTUNサーバーがうまく機能しなかった場合にはTURNサーバーを使用するという流れになります。そしてこれを勝手にやってくれるのがICEという技術です。
ICE
STUNとTURNをいい感じに使用して接続を確立してくれる技術。
到達可能な住所をリスト化して送信し、そのリストのなかで接続可能なものがあれば終了、なければ再度リクエストするといったやりとりをします。
Session Negotiation
接続を確立するためにどのような情報を送っているのか、について説明をします。
送る必要のある情報は、やりとりする音声と動画ファイルのタイプ・音声や動画ストリーミング用のIP・プロトコルの候補などで、これらを全て含むものをSDP(Session Description Protocol)といいます。また、SDPを送信して接続の交渉を行うことをSession Negotiationと呼びます。
自身のSDPはLocalDescription、通信相手のSDPはRemoteDescriptionと呼び、それぞれ保存しておくことでWebRTCが確立できます。
これらを踏まえて、再度手順を示します。
- 共有シグナリングチャネルをたてる
- ICEによって通信経路を確立する
- 共有シグナリングチャネルを通じてお互いのSDPを送り合い、LocalDescriptionとRemoteDescriptionを保存する
- 正常に情報交換が完了すれば接続完了。データのやりとりができるようになる。
最後に
ここまで読んだらまずは簡単に実装してみることをお勧めします。
SDPのやりとりやICEのやりとりのシーケンスに関しては文章を読むより実装したほうが理解が早いと思います。(あくまで個人の意見ですが)
もう少し踏み入った話(SFUにjanusgateway使うとか)や、ハンズオンみたいなのもやりたいので気が向いたら書きます〜