Skip to content

Instantly share code, notes, and snippets.

@nus
Last active May 21, 2017 14:42
Show Gist options
  • Save nus/69cafda7e526ceca3356b2301c6c83af to your computer and use it in GitHub Desktop.
Save nus/69cafda7e526ceca3356b2301c6c83af to your computer and use it in GitHub Desktop.
WebRTCメモ

WebRTC

Native APIs

https://webrtc.org/native-code/native-apis/

WebRTC のスレッドモデル

グローバル領域に2つのスレッドが存在する

  • signaling thread
  • コールバックを呼び出すスレッド
  • アプリケーションは、ブロックすることなくコールバックを戻すこと
  • worker thread
  • データストリームといった、リソースを集中的に処理するスレッド
  • Stream APIs webrtc/pc/mediastream.h
  • PeerConnection APIs webrtc/pc/peerconnection.h

SRTP の暗号化、復号化処理実装

webrtc/pc/srtpfilter.h, webrtc/pc/srtpfilter.cc にある。 libsrtpのsrtp_protectとsrtp_unprotectを利用して、暗号化と復号化している。

SrtpSession::ProtectRtpの呼び出し元がパケットを送信するモジュールに紐づく SrtpSession::UnprotectRtpの呼び出し元がパケットを受信するモジュールに紐づく

SrtpSession::ProtectRtpの呼び出し元は、webrtc/pc/channel.ccのBaseChannel::SendPacket SrtpSession::UnprotectRtpの呼び出し元は、webrtc/pc/channel.ccのBaseChannel::HandlePacket

BaseChannelは、VideoChannelおよびVoiceChannelに継承されている。

VideoChannelは、webrtc/pc/rtpreceiver.ccのVideoRtpReceiverとwebrtc/pc/rtpsender.ccのVideoRtpSenderでオブジェクトを受け取っている。 VoiceChannelは、webrtc/pc/rtpreceiver.ccのAudioRtpReceiverとwebrtc/pc/rtpsender.ccのAudioRtpSenderでオブジェクトを受け取っている。

VideoRtpReceiverは、webrtc/pc/peerconnection.ccのPeerConnection::CreateVideoReceiverでインスタンス化されている。 AudioRtpReceiverは、webrtc/pc/peerconnection.ccのPeerConnection::CreateAudioReceiverでインスタンス化されている。 VideoRtpSenderは、webrtc/pc/peerconnection.ccのPeerConnection::AddTrackでインスタンス化されている。 AudioRtpSenderは、webrtc/pc/peerconnection.ccのPeerConnection::AddTrackでインスタンス化されている。

SDP のシリアライズとデシリアライズ処理

webrtc/pc/webrtcsdp.h, webrtc/pc/webrtcsdp.cc ICE も含んでいる。

PeerConnectionFactory を使うための参考資料

/home/yota/oss/webrtc-checkout/src/webrtc/pc/peerconnectioninterface_unittest.cc 2138 行名 TEST_F(PeerConnectionInterfaceTest, CreateSubsequentRecvOnlyOffer) {

WebRTC セキュリティレポート

http://webrtc-security.github.io/report_ja/

SDP

Session Description Protocol セッション開始を宣言・維持するためのプロトコル テキストベース 以下の情報を含む

  • メディア
  • IPアドレスとポート
  • P2Pデータ転送プロトコル
  • セッション属性(名前、識別子、開始終了時間)WebRTCではほとんど利用されない 
  • その他のメタデータ

ICE

Interactive Connectivity Establishment(ICE) は、インターネット上でピア間の接続を維持するためのフレームワーク TURN/STUN を利用して実現する

SRTP

  • ペイロード部分のみ暗号化される。ヘッダー部分は平文

DTLS-SRTP 対 SDES

  • SDES
  • SDP属性に平文でセキュリティパラメータや鍵が渡される
  • SDPの通信経路が暗号化されていないと盗聴される恐れがある
  • DTLS-SRTP
  • メディアストリーム中で鍵交換を行う
  • WebRTCの使用ではサポートが必須

WebRTC w3c

https://www.w3.org/TR/webrtc/

  • RTCRtpTransceiver
  • 共通の mid を共有した RTCRtpSender と RTCRtpReceiver を結合したもの

ピアAは、RTCPeerConnectionのcreateOfferでSTUN/TURNサーバーへ問い合わせる。 createOfferの結果offerをsetLocalDescriptionで設定する。この後にofferをピアBに送る。 ピアBは、受け取ったofferをRTCPeerConnectionにofferを渡してcreateAnswerを呼び出す。 offerをsetRemoteDescriptionで設定する。 createAnswerでSTUN/TUNRサーバーへ問い合わせる。結果pranswerをsetLocalDescriptorで設定する。 この後にpranswerをピアAに返す ピアAはpraswerをsetLocalDescriptionで設定する。

DTLS

OpenSSLでDTLSを使う方法

DTLS-SRTP

DTLS で接続した後に、SRTPで使う証明書は、 "EXTRACTOR-dtls_srtp" ラベルで抽出する。 RFC5764 に記載あり

WebRTC SRTP decryption

TLS/SSL の参考

http://tkengo.github.io/blog/2015/12/01/https-details/

mediasoup

OSSのSFU用ライブラリ

Q. SDP生成方法は?

  • lib/webrtc/RTCPeerConnection/RTCPeerConnectionPlanB.js
  • _createLocalDescriptionで生成している。
  • RTCRtpTransceiver.toObjectMedia で icecandidate を含んだSDPを生成。これをofferのSDPとしてピアに送信している。

TURNS/STUNS はどの部分がセキュアになっているのか?

SDPのrtcp-muxについて

https://webrtcglossary.com/rtcp-mux/ Audio/VideowとRTCPとRTPの対応表が分かりやすかった。

Go のソケットプログラミング

https://astaxie.gitbooks.io/build-web-application-with-golang/ja/08.1.html

WebRTCのRFC

http://qiita.com/voluntas/items/63cb73e4c9373e726a34

RFC 5389

http://www.can.mydns.jp/~ryo/rfc/rfc5389-ja.txt

STUN について

STUNエージェント: STUNクライアントかSTUNサーバーのいずれか。 トランスポートアドレス: IPアドレスと(UDPやTCPポート番号などの)ポート番号の組み合わせ。

RFC 5763

https://tools.ietf.org/html/rfc5763

DTLS-SRTP のパケット

7.3. Basic Message Flow with STUN Check for NAT Case

STUN connectivity-check

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment