https://webrtc.org/native-code/native-apis/
グローバル領域に2つのスレッドが存在する
- signaling thread
- コールバックを呼び出すスレッド
- アプリケーションは、ブロックすることなくコールバックを戻すこと
- worker thread
- データストリームといった、リソースを集中的に処理するスレッド
- Stream APIs webrtc/pc/mediastream.h
- PeerConnection APIs webrtc/pc/peerconnection.h
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でインスタンス化されている。
webrtc/pc/webrtcsdp.h, webrtc/pc/webrtcsdp.cc ICE も含んでいる。
/home/yota/oss/webrtc-checkout/src/webrtc/pc/peerconnectioninterface_unittest.cc 2138 行名 TEST_F(PeerConnectionInterfaceTest, CreateSubsequentRecvOnlyOffer) {
http://webrtc-security.github.io/report_ja/
Session Description Protocol セッション開始を宣言・維持するためのプロトコル テキストベース 以下の情報を含む
- メディア
- IPアドレスとポート
- P2Pデータ転送プロトコル
- セッション属性(名前、識別子、開始終了時間)WebRTCではほとんど利用されない
- その他のメタデータ
Interactive Connectivity Establishment(ICE) は、インターネット上でピア間の接続を維持するためのフレームワーク TURN/STUN を利用して実現する
- ペイロード部分のみ暗号化される。ヘッダー部分は平文
- SDES
- SDP属性に平文でセキュリティパラメータや鍵が渡される
- SDPの通信経路が暗号化されていないと盗聴される恐れがある
- DTLS-SRTP
- メディアストリーム中で鍵交換を行う
- 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で設定する。
OpenSSLでDTLSを使う方法
DTLS で接続した後に、SRTPで使う証明書は、 "EXTRACTOR-dtls_srtp" ラベルで抽出する。 RFC5764 に記載あり
WebRTC SRTP decryption
http://tkengo.github.io/blog/2015/12/01/https-details/
OSSのSFU用ライブラリ
Q. SDP生成方法は?
- lib/webrtc/RTCPeerConnection/RTCPeerConnectionPlanB.js
- _createLocalDescriptionで生成している。
- RTCRtpTransceiver.toObjectMedia で icecandidate を含んだSDPを生成。これをofferのSDPとしてピアに送信している。
https://webrtcglossary.com/rtcp-mux/ Audio/VideowとRTCPとRTPの対応表が分かりやすかった。
https://astaxie.gitbooks.io/build-web-application-with-golang/ja/08.1.html
http://qiita.com/voluntas/items/63cb73e4c9373e726a34
http://www.can.mydns.jp/~ryo/rfc/rfc5389-ja.txt
STUN について
STUNエージェント: STUNクライアントかSTUNサーバーのいずれか。 トランスポートアドレス: IPアドレスと(UDPやTCPポート番号などの)ポート番号の組み合わせ。
https://tools.ietf.org/html/rfc5763
DTLS-SRTP のパケット
STUN connectivity-check