読者です 読者をやめる 読者になる 読者になる

鈴木うどんの横須賀おもしろ生活

撮った写真や思ったことや技術ネタなど。出来るだけ大きなディスプレイで見ると良いと思う。ここでの発言は個人の見解であり、所属する組織の公式見解ではありません。

WebRTCにおけるNAT越えの課題へのアプローチ

技術ネタ

WebRTCにおけるNAT越えの課題へのアプローチ - Qiita に移転しました。

実はずっとWebRTCをウォッチしていたので大局的な話を書いた

Programing 技術ネタ

WebRTCについての話を社内勉強会でしてきたを見て、自分も何かを書いてみようかと思った。使い方やAPIの詳細について書かれた記事は多いが、大局的な話題を書いた記事はあまり見かけないので、そのような観点から公知になっている情報を中心に書いていこうと思う。

する話

  • 僕のWebRTCの解釈
  • 既存の通信技術との違い
  • WebRTCのシグナリングの特徴点
  • 今のWebRTCの情報源
  • 今のWebRTCの妥当な使い道

しない話

  • VoIPデバイスとの相互接続のしかた
  • 効果的な使い方
  • 効果的なコード

とても長い本文

WebRTCとは何かといえば、たとえばHTML5周辺技術であるとか様々な見方があるが、僕はテレフォニーの世界感をWebブラウザ上に移殖したフレームワークだと認識している。WebRTCは、サーバとクライアントからなる三角形構造あるいは台形構造を構成する。 VoIP Architecture それらは、かつてのIP電話プロトコルであるH.323SIPを彷彿させる。これらのプロトコルと同じように、WebRTCではシグナリングチャネルの上で能力交換を行ってP2Pメディアやデータ転送のためのセッションを確立する。さらに、そこで使われるNAT超えホールパンチの仕組みやデータやメディア転送に使われるプロトコルIP電話と全く同じものを利用する。

WebRTCと既存のテレフォニーの仕組みで最も異なる点は、シグナリングプロトコルを規定しない(ことを規定した)という点だろう。Webブラウザが備えている通信プロトコル(現状ではHTTPやWebSocket)上なら、いずれの方式を用いても構わない。これまで、専用のROAPというプロトコルを規定(と実装を)していたこともあったが、電話のような通話のユースケースにしか対応できないため、JSEPと呼ばれる新たなプロトコルが別のレイヤで規定されることになった。

WebRTCのシグナリングにまつわるJSEPは、プロトコルと呼ばれているにも関わらず、SIPなどと比較して極めてAPIに近い、JavaScriptと通信スタックの間に挟まれたプロトコルだ。セッション記述の交換やICEエージェントのステートマシンは通信スタックを内包するブラウザに任されるが、セッション開始(session initiation)までのシーケンスとステートマシンはプログラマが完全に定義しなくてはならない。その見返りとして、サービスの細かな要件に合致する、これまででは不可能な、ユニークな構成のアプリケーションの実現が可能となった。一方で、多くのサービス事業者は単純な通話やP2Pデータ通信が実現できれば十分かもしれない。繰り返しになるが、WebRTCはいかなるプロトコルシグナリングとして用いてることも許容しているから、SIPのような既存のプロトコルを用いても良い。JavaScriptによるSIPの実装としてsipML5JSSIPが存在しており、それらを用いることもできる。標準化されたプロトコルにこだわりが無ければ、シンプルに設計されており、ドキュメントも整備されているPeer.jsのようなラッパライブラリが実装の大きな助けとなるだろう。

WebRTCは、まだまだ新しいフレームワークであり、まとまった情報源は未だ限られている。日本語に翻訳された書籍では、ハイパフォーマンスブラウザネットワーキングのWebRTCの章に驚くほど効果的にコンパクトにまとまった情報が掲載されている。もし英語の書籍でも構わないのであれば、O'ReillyのReal-Time Communication with WebRTC: Peer-to-Peer in the Browserが存在しているが、あまりに短すぎるように感じた。WebRTC: APIs and RTCWEB Protocols of the HTML5 Real-Time Webは、網羅性こそ他より秀ているが、情報があまりに整理されていないため、読むのに苦労する。しかし、筆者らは標準化に深く関わったメンバであり、諸々の経緯を知るには良い情報源かもしれない。数多くのドラフトへの参照は、確定していない最新の情報を追うのに役に立つだろう。一方で、深い技術の話題では間違った情報が散見され、それらが誤解や理解の妨げとなるかもしれないと感じた。その他に、discuss-webrtcのMLなどのような書籍以外の情報を参考にするのも構わないが、まとまった情報として参照するにはあまりに雑多だろう。残念ながら、今すぐに、ある程度まとまった、しかも正確な情報を得るにはW3CあるいはIETFのドラフトや、既に標準化を終えたRFCを読む他無いのかもしれない。しかし、継続的に最新のドラフトを追ったりRFCを読んだりする行為は、あまりに対象とする数が大きすぎるため、大きな苦労が伴う。場合によっては、最新の実装の動作を確認するだけであったり、利用法を確認するだけで十分な場合もあるだろう。その場合は、Googleの提供するデモサイトであるappRTCに最新のブラウザからアクセスしたり、そのコードを読むことが効果的だ。

それでは、このようなリアルタイム通信を実現するWebRTCが、今日のWeb上のサービスで活用可能かといえば、正直なところ、すこし及ばないというのが現状だ。JavaScriptAPIを規定するW3Cの標準化はかなり終わりが見えてきたが、勧告となるまではまだまだ時間がかかりそうである。さらに、プロトコルを規定するIETFでは、未だにビデオコーデックについて揉めているという始末である。しかしながら、Webの取組みであるからして、実装は意欲的に進行しており、FirefoxChromeではかなり早い段階から利用することが可能となっている。(逆に考えれば、クリーンなWindowsMacAndroidiOSでは使えないということでもあり、HTML5関連技術にありがちな「専用ソフトウェア不要」という触れ込みは今のところ実現されていないが…。)ここで気をつけなければならないのは、ピア同士のUAが同一となる場合比較的容易であるが、異なるUA間で接続する場合では、独特のノウハウが必要であるし、そのノウハウはいずれ使い物にならなくなる可能性が高いということである。apprtcの今日の実装を観測すると、サーバのレイヤでブラウザを判定して実行するJavaScriptのコードに変更を加えているようだ。 他に、通話アプリケーションを実現するとなると、必ず「待受け」の問題が付きまとう。Skypeなどのネイティブアプリケーションと違って、ブラウザはバックグラウンドで動作する能力を持っていない。 それに、モバイルデバイスの場合ではシグナリングチャネルのコネクションを維持することがバッテリー消費に大きなインパクトを与えるだろう。この問題に対してW3CPush APIとして議論が進んでいるが、そのゴールは遠く霞んでいる。

では、現状WebRTCを活用したサービスがまったくありえないかと言われれば、そんなことはなく、必ず同一のUI同士が通信しあう形態に限れば問題ないのだ。WWWにおいてそんな前提はありえないと思われる方が多いかもしれないが、WebRTCは必ずしもブラウザを用いなければならないフレームワークではなく、独自のソフトウェアに用いても構わない。WebRTCの公式サイトでは、ブラウザに組み込むためのWebRTCのコードサンプルが公開されている。このコードサンプルは、おそらくChromeで用いられているものと同様で、完全なNAT超えの仕組みと、各種コーデックを持つ高性能なメディアスタックを備えている。特にAndroid上で動作するスタックを 用いれば、Push通知サービスであるGCMと組み合わせることによって、待受け問題の解決も可能である。最近では、kindle fire の通話スタックがWebRTCを用いているのではないかという噂も存在し、実現性は決して低くないだろう。実際に実装して試したところ、3G通信を用いた場合にGCMの通知に数秒から十数秒の時間がかかるが、LTEを用いた場合ではむしろキャリアの通話機能よりも高速に着信が開始し通話の品質も聴感上では優れているように感じた。

以上、思いついた範囲で書いてみたが、Web開発に携わる人たちの情報源の一つとなれば幸いだ。この記事はある程度理解が進んだエンジニアに向けて書かれており、難しい用語があるかもしれない。可能な限り一次情報へのリンクを張ったつもりであるので、ぜひ活用されたい。

Web開発者の一方で、テレフォニー関係の開発者の関心はブラウザと既存VoIPデバイスとの相互接続ではないだろうか。しかし、そのようなサービス形態の実現は金銭コストの観点から極めて難しいのではないかと考えている。WebRTCはメディア転送にVoIPと全く同じ方式を用いているから相互接続は比較的容易と思われるかもしれない。しかしながら、WebRTCの全ての機能に対応している機器は滅多に存在していないので、何らかのゲートウェイが必要となる。特に、DTLS-SRTPはWebRTCで必ず用いなければならないこととなっているにもかかわらず、その対応デバイスはほとんど存在しない。更に、DTLSの復号は処理負荷が高いため、高価で高性能なゲートウェイが要求される。結果的に、何か新たなサービスを実現するために、既存のデバイスを使いまわしたり、SIPデバイスを追加した方が安価で高性能であることがほとんどだから、相互接続をしてまでサービスを行うことが有効となるケースは少ないだろう。しかも、そのような相互接続が要求されるエンタプライズでの利用にはFW通過の課題が残されている。WebRTCのメディアやデータチャネルは下位プロトコルとしてUDPを用いているが、外部とのUDPパケットのやりとりを許すエンタープライズ向けFWは極めて稀である。そのとき、最終手段としてのTURNが銀の弾丸となり得るという期待もあるが、現状ではTURNはサーバからピアへのプロトコルをUDPに限定しているため、FWに特別な設定を施したり、企業ネットワークのDMZ領域にTURNサーバを設置する等の対策が必要となる。このような課題は、既にSIPの世界で散々議論され、様々な製品が市中に溢れている。ただ、必要となった段階で過去の知見をWebRTCに適用できるように準備をしておくことは決して無駄とはならないだろう。既にテレフォニー製品の販売基板を持っているBROADSOFTDialogicなどのベンダでは、既存製品に対するWebRTCの能力の追加を試みている。

最後に、WebRTCの醍醐味は自由なシグナリングであり、そこが技術の真髄となると僕は考えている。今後、ブラウザだけにとらわれない、いままで見たことの無いようなサービスの出現が楽しみだ。

カメラを持って街に出よう

_8006398

日曜に大学の後輩と久しぶりに会って、僕が最近あんまり写真を撮っていないことに対して「うどんさんは老いで気力が湧かなくなったんじゃないですか?今どんな気持ちなんです?ん?」みたいなことを至極まっとうな口調で言われてしまい、あまりに悔しくなってしまったのでなるべくカメラを持ち歩くようにしようと強く誓った。火曜日は夕方から都内で予定があったので早めに家を出てカメラ片手に適当にブラブラしていたら彼岸花が綺麗だったので撮影した。実は街撮りでもしようと思っていたので手持ちのレンズは35mmf2だけ。準広角1本だけではおよそ花を撮る体制ではないのだけれども、普段やらないことをやるのはなかなか面白い体験だった。

しかし、最近写真を撮っていないのはそもそも出不精拗らせているだけという実情、いつまで続くかという感じ。今週末もあてもなくカメラ持ってフラフラしようと思う。

_8006389

_8006418