webrtcH4cKS: ~ FaceTime finally faces WebRTC – implementation deep dive (日本語解説資料)
FaceTime finally faces WebRTC - implementation deep dive - webrtcHacks
Apple が iOS 15 で搭載する Chrome や Edge で利用可能になる FaceTime for Web の解析記事を読むためにそもそも知識がかなり必要なので、そのための資料です。
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 は必須