Open6

webrtcH4cKS: ~ FaceTime finally faces WebRTC – implementation deep dive (日本語解説資料)

FaceTime について

FaceTime は Apple 製品でのみ利用できましたが、今回は Chrome や Edge といったブラウザでも利用できるようになりました。

FaceTime における E2EE について

FaceTime は仕様の詳細は公開していませんが E2EE への対応をしていると言っています。そのため、FaceTime for Web でも E2EE に対応する必要があります。

WebRTC について

FaceTime for Web は間違いなく WebRTC を利用する前提です。

Web ブラウザでの E2EE 実現について

WebRTC Encoded Transform (旧 Insertable Streams) API を利用します。
これはエンコード済みの RTP パケットを自由にいじることができる API です。

公開鍵と秘密鍵

Signal や MLS を利用はしていないようで、独自のようです。

ICE サーバ

TURN や STUN といったサーバは提供していないようです。記事には UDP のみと書いてありますが、ICE-TCP は使えると思うので正しくは UDP と TCP のみで、TLS に非対応という認識です。

ICE-Lite を利用しているようです。

SDP

SDP はハンドシェイクプロトコルです。なぜか m=application のなかで rtcp-mux / rtcp-rsize を指定しており、かなり不思議な仕様です。

これらは m=audio や m=video セクションで利用されます。

SDP Video

m=video はH.264 を利用しています。プロファイルレベル ID は 42c01f です。

SDP Video RTX

RTX というのは Retransmission の略で、Generic Nack などを利用した再送要求時の再送パケットを送るために通常とは別のペイロードを用意する仕組みです。このことで「再送パケットかどうか」を判断できるようになります。

SDP Video goog-remb

goog-remb というのは REMB という 2013 年から更新されていない RFC Draft です。
ただ WebRTC 界隈では一番よく使われています。一般的だけど仕様になっていないというめんどくさいやつです。Apple が Google が考えた仕様に引っ張られるというのは不思議な感じがします。

SDP Video RTP ヘッダー拡張

RTP ヘッダー拡張というのは RTP に付加情報をいろいろ追加できます。
abs-send-time と 3gpp:video-orientation とシンプルな二つだけです。

SDP Audio

m=audio が二つあるのがかなり特殊です。ペイロードタイプも異なり、ptime も 40 ミリ秒と 60 ミリ秒と異なっています。通常 WebRTC では ptime は 20 ミリ秒が設定されます。

ptime 40 ミリ秒の方でだけ FEC が有効になってるというのも不思議です。

SDP Audio RTP ヘッダー拡張

ssrc-audio-level に vad=off が付いています。この機能は実際対応しているのがあるのかわからない謎の機能です。

しょぼい Simulcast

SFU で Simulcast を利用する場合は rid と呼ばれる仕組みを使いますが、ここでは ssrc を複数用意することで、無理矢理 Simulcast を実現しています。力業でシンプルですが基本的にお勧めできない仕組みです。

統計情報

WebRTC は chrome://webrtc-internals という機能で細かい情報がみることができます。

DTLS の暗号

証明書には ECDSA を利用し、SRTP 暗号は AEAD_AES_256_GCM が使われています。
今までは AES-CTR だったのですが、最近 AES-GCM の方が SFU 的に効率がいいということで AES-GCM が人気です。

JavaScript setParameters

setParameters はビットレートやフレームレートなどをクライアント側で自由に変更できる仕組みです。

JavaScript E2EE

SFrame が採用されています。SFrame の提案者の一人は Google から Apple へ移動しています。

H.264 で E2EE を利用する場合は NAL ヘッダーを暗号化してしまわないようにしないといろいろ困ります。そのため H.264 で E2EE を利用する場合は先頭の数倍とを暗号化しないようにする必要があります。

感想

今後 WebRTC を利用したビジネスをやるなら ...

  • WebRTC SFU 必須
  • Simulcast は必須
  • E2EE は必須
ログインするとコメントできます