こんにちは。アジャストの渕上です。

「WebRTC」という技術が何なのか気になっていたのですが、
ハイパフォーマンス ブラウザネットワーキング――ネットワークアプリケーションのためのパフォーマンス最適化
という書籍が良著という意見を多く目にしたため、年末に読んでみました。
今回はかんたんに、読書メモ&書籍の紹介をしたいと思います。

※下記の内容には私の勘違いなど含まれるかもしれません。ご指摘いただければ幸いです。

WebRTCとは

ブラウザ(クライアント)同士を直接(P2P)接続してデータの送受信を行う仕組みです。
、、が、実際はネットワークの状況などによって直接接続できない場合も多く、
その場合はデータをリレーするサーバが必要になってくるようです。

ブラウザ実装状況

気になる各ブラウザの実装状況ですが、
現時点でWebRTCに対応しているブラウザは、下記のとおりです。

  • Firefox
  • Google Chrome
  • Opera

スマートフォンでWebRTCを利用する場合、
Android端末であればChrome/Firefoxのいずれかで利用することができますが、
iOS端末ではアプリの開発が必要になってくるようです。

ブラウザ同士をどうやってつなぐの?

ブラウザ同士を直接接続するためには、接続相手のアドレスが認識できなければなりません。
ここでいきなり問題が発生します。

たとえば、Webサーバにアクセスしてきた端末同士をWebRTCでつなぐプログラムを組むとします。

PCやスマホなど、通常の端末が知っている自分のアドレスはほとんどの場合、
自分の属するネットワーク内でのプライベートIPアドレスであり、
グローバルIPアドレスではありません。

同様にWebサーバが知ることのできる接続元のIPアドレスは、ほとんどの場合、
端末がインターネットに接続するのに経由したゲートウェイのIPアドレスであって、
端末のアドレスではありません。

WebRTCでP2P接続をするためには、これらの情報でなく、
NATによって変換された後のIPアドレス、ポート番号を相手に伝える必要があります。
そこで、”シグナリング”という手法の出番になります。

シグナリングって何?

※ ここから特に理解に自信がありません。間違いがあればご指摘下さい!!

“シグナリング”とは、自分へ直接接続するための情報を相手に伝える行為のことを指しているようです。

  1. それぞれ自分のNAT変換後のアドレス情報を入手する
  2. 入手したアドレス情報を相手に伝える(Webサーバ経由で、WebSocketなどで通知する)

上記のような手順でそれぞれのブラウザ(クライアント)が
相手の接続情報を知ることができれば、接続の確立が可能になります。

では、どのようにNAT変換後のIPアドレス:ポートを知ることができるのでしょうか。
その為に用意されているのが、STUNというプロトコルです。

STUNって何?

STUNは(Session Traversal Utilities for NAT)の略称です。
NAT変換後のIPアドレスとポート番号をレスポンスします。

ただし、ネットワークの構成やファイアウォールのルールによっては、

STUNで手に入れた情報では接続が確立できない場合
STUNで情報を入手できない場合

があり、

その場合にはTURNという仕組みを使って接続を試みることができます。

TURNって何?

TURNは(Traversal Using Relay aroud NAT)の略称です
STUN リレーするための中継点として動作します。

TURNではパケットがサーバを通るため、STUNより余計にリソースを食うことになります。
(データセンタの回線、TURNサーバの処理能力 etc…)

STUNで接続可能なのにTURNを選ぶようなことはしたくないですよね。
WebRTCでは複数の候補から接続方法を選ぶためのAPIが実装されており、ICEとよばれています。

アプリケーション側ではJavascriptAPIのICEエージェントに
複数のSTUN,TURNサーバ候補の定義を渡すことができ、任意の順番に接続を試みることができるそうです。

感想

この書籍でWebRTCに触れられている分量は数十ページ程度の分量ですが、
コンパクトにまとめられており、とても読みやすかったです。

今回紹介したシグナリングの話題の他にも、

  • 多対多通信時のネットワークモデル
  • WebRTCを利用したアプリケーションで気遣うべきポイント

などの話題も触れられており、
私のように「WebRTCとは何ぞや???」という疑問を持っている方には、
おすすめの書籍だと思いました。

WebRTCの章以外はまだナナメ読みした程度なのですが、
XMLHttpRequest,WebSocket,HTTP,TCP,,,,
などWebアプリにかかわる通信の話題を一通り取り扱っているため、
通して読むととても勉強になりそうです。

一方で具体的な実装方法については細かく紹介されてはいないので、
「手っ取り早くWebRTCを使ったサンプルコードが欲しい!」
という目的には向いていないかもしれません。