#はじめに
音声や映像配信といったリアルタイム通信インフラに従事しており、WebRTCが気になったので調べてみました。
ちょうど一か月ほど前に標準規格入りをし、今後さらなる発展が臨めることからも今のうちに学んでおきたいと考え、記録していこうと考えています。普段からネットワークに取り組んでいるので、結構すんなりコンセプトを理解できました。
#WebRTCとは
WebRTCとは「Web Real-Time Communication」の略称です。
HTML5で新しく策定されたAPIの規格で、ウェブブラウザやモバイルアプリでリアルタイム通信(音声や動画など)を実現するための技術(オープンソース)になります。
WebRTCにおけるAPIの仕様は以下サイトに詳しく記載されています。
https://developer.mozilla.org/ja/docs/Web/API/WebRTC_API
様々なAPIを組み合わせることにより、音声の変換や映像のキャプチャ、画像処理や顔検出なんかもできるようになります。これらAPIはどんどん変わっていくので、チェックが必要です。
また、このWebRTCは様々なシーンで利用されており、特にWeb会議やオンライン動画配信などが挙げられます。
将来的にも利用シーンが広がっていくことが予想されており、遠隔医療やIoT分野、AR/VR分野などにも利用されると考えられています。
##P2P通信
WebRTCはブラウザやアプリ間で動画や音声などのリアルタイム通信を実現します。このブラウザやアプリの通信はP2P(ピアツーピア)通信で行います。
一般的な通信は所謂サーバ・クライアントモデルと言って、サービス(処理を行う)を提供するサーバと、サービスをリクエストするクライアントで構成され、サーバを介してお互いが通信し合います。
P2Pでは、サーバ・クライアントモデルのようにサーバを介して通信を行うのではなく、サーバを介さずクライアント同士がつながることで処理を行います。
メリットとしてはメッシュ構造でつなぐことによりダウンタイムがなくなる(ゼロダウンタイムになる)ことや、よりリアルタイムな通信を実現できることが挙げられ、有名なところではブロックチェーン技術においてもこのP2Pモデルで通信が行われています。
##シグナリングサーバ
P2Pで通信を行うと言っても、予め通信相手の情報(IPアドレスやポート番号)を知っている必要があります。ですので、P2P通信を行う前にVoIPなどでよく出てくる「シグナリング」というものを行います。
シグナリングとは、ダイヤルを発信した後に着信した相手が受話器を上げるまでの間に行われる情報のやり取りで、相手のIPアドレスやポート番号を知るために行われます。
WebRTCにおいても、このシグナリングを行う「シグナリングサーバ」が必要になります。このシグナリングサーバによってこれから通信を行う相手の情報を取得しています。
このシグナリングにおいてやりとりする情報を見ていきます。
####・ ICE ( Interactive Connectivity Establishment )
クライアント間でP2P通信を行う場合、それぞれのクライアント(デバイス)が存在するネットワークにおいてNATが設定されていると、そのクライアント同士はP2P通信ができない状況になります。
ここでNATについて簡単に説明をします。NATとは「Network Address Translation」のことで、組織内などのLANで使われるIPヘッダ内のプライベートIPアドレスをインターネットで使われるIPヘッダ内のグローバルIPアドレスへ変換する用途で使われます。主にLANとインターネットの境界に存在するルータで実装されます。
ICEでは、NAT配下の端末やネットワークにダイレクトに到達できない問題を解決し(これをNAT越えと言います)、P2P接続するための経路を決定します。
ICEには、「STUN」と「TURN」というサーバサイドの技術が登場します。これについては深い内容になりますので、以下のサイトを参照すると良いと思います。非常にわかりやすい内容になっています。
https://qiita.com/okyk/items/a405f827e23cb9ef3bde
####・ SDP ( Session Description Protocol )
P2Pを行うにも、相手と所在位置(IPアドレス、ポート番号)を共有したり、送受信するデータ形式などを予め決めておかなければいけません。そこで、SDPはシグナリングを行うブラウザ同士で交換する情報のフォーマットを規定します。
それぞれのブラウザの情報を示し、文字列で表現されます。
内容は以下の通りです。
・メディアの種類(音声、映像)、メディアの形式(コーデック)
・IPアドレス、ポート番号
・P2Pのデータ転送プロトコル(WebRTCではSecure RTP)
・通信で使用する帯域
##まとめ
WebRTCをオンプレで実現しようとするとハードルが高いなと個人的に感じています。
今後は実装を通して、より理解を深めていきたいと思います。
(個人的にAWSのKinesis Video Streamsが気になります)
##参照
https://udemy.benesse.co.jp/development/blockchain/p2p.html
https://blog.ivrpowers.com/post/technologies/what-is-stun-turn-server/
https://www.slideshare.net/iwashi86/webrtc-for-sdp