WebRTC音声通話ずビデオ通話で2぀のブラりザヌがどのように䞀臎するか







ネタバレありえない。 圌らのために、開発者はそれを行いたす。



Flashが䜕幎も前に殺され始めたずき、ブラりザゲヌムだけでなく被害を受けたした。 Flashは埓来、音声通話やビデオ通話で匷力でした。マむク、カメラ、スピヌカヌぞの盎接アクセス、UDPパケットを凊理する機胜。 HTML5では、WebRTCテクノロゞヌが代わりになりたした。 数ヶ月前に぀いにSafariずEdgeに䞊陞したもの。 これで、iPhoneで開いおいるWebペヌゞから別のWebペヌゞ、たずえば、Linux䞊のFirefox Quantumで開いおいるWebペヌゞに電話をかけるこずができたす。



FlashにないWebRTCの機胜の1぀は、ブラりザヌ間のP2P接続の可胜性です。 しかし、ピアツヌピアが機胜するには、プログラマヌが苊しむ必芁がありたす。 ブラりザがUDPパケットを送信する堎所に぀いおどのように同意するか、および開発者がそれで䜕をすべきかに぀いお-カットの䞋で。



「アラヌム」-圌らが話さないようにするこず



ほずんどのWebRTCチュヌトリアルには、同じWiFiに接続されおいる堎合に、iPhoneからWindowsラップトップぞのビデオ通話を行う際の、Flashのクヌルな亀換、ブラりザヌからの音声通話ずビデオ通話、ピアツヌピアず10メガバむトのビデオストリヌムに関する遅延のない話がありたす。 コヌドずしお、圌らは通垞、それがいかに単玔かを説埗力をもっお実蚌するJavaScriptの数行を瀺したす。



秘Theは、WebRTCのラッパヌが通垞実蚌されるこずです。 このようなラッパヌは、 RTCPeerConnectionずMediaDevices.getUserMediaを腞の開発者から隠すこずに加えお、PubNub、Twilio、たたはVoximplantなど、独自のクラりドずテクノロゞヌスタックを䜿甚する2぀のブラりザヌ間のすべおの通信を開発者から隠したす。 開発者のために仕事をするのは良いこずです。 しかし、技術スタックを単玔化しお、「ボンネット内」で発生するプロセスの誀解が期限を砎り、解決策や「技術的問題」を解決するずきに時限爆匟を怍えるこずがよくありたす。









このストヌリヌは、WebRTCでのシグナリング、私たちや他の䌁業が行う方法、既成のサヌビスを䜿甚せずにれロから゜リュヌションを䜜成する堎合の方法に぀いお説明しおいたす。



P2Pコヌルにサヌバヌが必芁な理由



「ピアツヌピア」ずいうフレヌズを聞いお、私たちは通垞トレントを思い出したす。 䞭倮サヌバヌがないようです。 WebRTCの「シグナリング」ずは䜕ですか。たた、サヌバヌはどこにありたすか



WebRTCずJavaScriptコヌドを䜿甚しおWebペヌゞを䜜成したずしたす。 WiFiに接続された3台のラップトップで開き、最初のラップトップから3番目のラップトップぞのビデオ通話を行いたす。 最初のラップトップのWebRTCは、3番目に接続する必芁があるこずをどのように認識したすか WebRTC開発者の代わりに䜕をしたすか



最初に思い぀いた方法は、最初のラップトップのWebRTCを3番目のラップトップのIPアドレスに送信し、UDPパケットを送信させるこずでした。 ただし、この方法は、䞡方のデバむスが同じネットワヌクに接続されおおり、このネットワヌクで盞互からのパケットの受信が蚱可されおいる堎合にのみ機胜したすサプラむズ-ホテルや䌚議堎でのパブリックWiFiはほずんどの堎合蚱可されたせん。 しかし、1぀ではなく3぀のWiFiアクセスポむントがある堎合はどうでしょうか。 たた、3台のラップトップはすべお異なるアクセスポむントに接続され、同じ仮想IPアドレス「192.168.0.5」などを持っおいたす。 最初のラップトップで実行されおいるブラりザはどこにパケットを送信する必芁がありたすか



この状況では呌び出しは行われないず想定できたすが、いずれの堎合も、䞡方のラップトップのブラりザヌが盞互に通信できる「実際の」IPアドレスを持぀倖郚サヌバヌが必芁です。 しかし、WebRTCの䜜成者は、音声ずビデオはトラフィック集玄型の通信であり、䜕癟䞇人ものSkype for WebたたはGoogleハングアりトナヌザヌがパブリックサヌバヌを介しお電話をかけるず、これらのサヌバヌがバヌストするこずを感じたした。 WebRTCの䜜成者は、䞡方のデバむスに仮想IPアドレスがあり、盎接パケットを亀換できない堎合でも、NATを「パンチ」しおP2P接続を確立する機胜をテクノロゞに付䞎したした。 回収は同じ「アラヌム」でした。 開発者は、2番目のデバむスたたは倖郚サヌバヌのWebRTC IPアドレスを単に送信するこずはできたせん。 圌は、䞡方のブラりザがネットワヌクを慎重に怜査し、互いに同意するのを手䌝う必芁がありたす。 このために、圌は圌のSignaling Serverを必芁ずしたす。



オファヌ、アンサヌ、ICE候補、その他の恐ろしい蚀葉



それでは、2぀のブラりザ間のビデオコヌルは開発者の芳点からどのように芋えたすか



  1. 最初のブラりザヌで必芁なJavaScriptオブゞェクトの準備ず䜜成がすべお完了した埌、WebRTCメ゜ッドcreateOfferが呌び出され、SDP圢匏のテキストパッケヌゞたたは、将来、APIのoRTCバヌゞョンが「クラシック」オブゞェクトを取埗する堎合はJSONシリアラむズ可胜オブゞェクトを返したす。 このパッケヌゞには、開発者が必芁ずするコミュニケヌションの皮類に関する情報が含たれおいたす。音声、ビデオ、たたはデヌタの送信、どのコヌデックが存圚するか-このストヌリヌ党䜓
  2. そしお今-アラヌム。 開発者はどういうわけか 本圓に、仕様に曞かれおいたすこのテキストパッケヌゞの提䟛を2番目のブラりザヌに枡す必芁がありたす。 たずえば、むンタヌネット䞊で独自のサヌバヌを䜿甚し、䞡方のブラりザヌからWebSocket接続する
  3. 2番目のブラりザヌでオファヌを受け取った埌、開発者はsetRemoteDescriptionメ゜ッドを䜿甚しおWebRTCにオファヌを枡したす。 次に、createAnswerメ゜ッドを呌び出したす。このメ゜ッドは、同じテキストパケットをSDP圢匏で返したすが、2番目のブラりザヌに察しお、最初の受信パケットを考慮に入れたす
  4. シグナリングの継続開発者は応答テキストパケットを最初のブラりザヌに返したす
  5. 開発者は、最初のブラりザヌで回答を受け取った埌、すでに述べたsetRemoteDescriptionメ゜ッドを䜿甚しおWebRTCに枡したす。その埌、䞡方のブラりザヌのWebRTCは最小限の盞互認識を行いたす。 接続できたすか ああ、いや。 実際、すべおが始たったばかりです
  6. 䞡方のブラりザヌのWebRTCは、ネットワヌク接続の状態の調査を開始したす実際、暙準ではこれを行うタむミングが瀺されおおらず、倚くのブラりザヌでは、WebRTCは察応するオブゞェクトを䜜成した盎埌にネットワヌクの調査を開始し、接続時に䞍芁な遅延が発生しないようにしたす。 開発者が最初の手順でWebRTCオブゞェクトを䜜成したずき、少なくずもSTUNサヌバヌのアドレスを枡す必芁がありたす。 これは、「私のIPずは䜕か」ずいうUDPパケットに応答しお、このパケットを受信したIPアドレスを送信するサヌバヌです。 WebRTCはSTUNサヌバヌを䜿甚しお「倖郚」IPアドレスを取埗し、それを「内郚」IPアドレスず比范しお、NATがあるかどうかを確認したす。 もしそうなら、どのNATリバヌスポヌトがUDPパケットのルヌティングに䜿甚したすか
  7. 時々、䞡方のブラりザのWebRTCは、onicecandidateコヌルバックを呌び出し、すでに銎染みのあるSIPパケットに2番目の接続参加者の情報を送信したす。 このパッケヌゞには、内郚および倖郚IPアドレス、接続詊行、NATが䜿甚するポヌトなどに関する情報が含たれおいたす。 開発者は、シグナリングを䜿甚しおこれらのパケットをブラりザ間で転送したす。 送信されたパケットは、 addIceCandidateメ゜ッドを䜿甚しおWebRTCに送信されたす
  8. しばらくするず、WebRTCはピアツヌピア接続を確立したす。 たたは、NATが干枉する堎合は䜿甚できたせん。 このような堎合、開発者はTURNサヌバヌのアドレスを送信できたす。これは倖郚接続芁玠ずしお䜿甚されたす。䞡方のブラりザヌは、音声たたはビデオを含むUDPパケットを送信したす。 STUNサヌバヌが無料で芋぀かる堎合たずえば、Googleにある堎合、自分でTURNサヌバヌを䞊げる必芁がありたす。 そのようにテラバむトのビデオトラフィックを自分自身に枡すこずに誰も興味がない


完成したプラットフォヌムを䜿甚するず、これらすべおのニュアンスを隠すこずができたす。 Web SDKは、WebRTCを正しく構成し、SDPパケットにパッチを適甚し、VoximplantクラりドぞのWebSocket接続をサポヌトし、さらに倚くの詳现を凊理したす。 そしおもちろん、独自のSTUNサヌバヌずTURNサヌバヌがあり、どのような堎合でも接続が行われたす。 しかし、ニュアンスを隠しお自分でやるこずはできたせん ブラりザで利甚可胜なAPIにより、以䞋のように、さたざたな方法でアラヌムを䜜成できるようになりたした。



動䜜しない単玔なHTTPリク゚ストシグナリング



最初に思い浮かぶのは、最も単玔なHTTPサヌバヌず、ブラりザヌ偎からのxmlHttpRequest / fetchです。 悲しいかな、それは教科曞の「こんにちは䞖界」に察しおのみ機胜したす。 実際には、サヌバヌは非垞に倚くのリク゚ストから萜ちたす。 これは非垞に頻繁に実行する必芁があるため、「接続」をクリックするこずで、ナヌザヌは「接続を確立する」ために数分間埅たないようにしたす。 たた、WebRTCはリアルタむムのストヌリヌであり、オファヌ/アンサヌ/アむスを非垞に迅速に送信する必芁があるため、頻繁に行う必芁がありたす。 数秒の遅延でさえ、「䜕も起こらない」ずいうWebRTCのシグナルずしお機胜し、その埌、゚ンゞンは接続の確立を詊行しなくなりたす。 たたは、「ロングポヌリング」手法を詊すこずもできたすが、実際にはうたく機胜せず、䞭間のむンタヌネットむンフラストラクチャはそのような「遅い」HTTPリク゚ストを䞭断するこずを奜みたす。









WebSockets Signaling 最も効果的 な 戊略が有甚



WebRTCを䜿甚するほずんどの゜リュヌションは、シグナリングにWebSocketを䜿甚したす。 このプロトコルは、すでに䜿甚されおいるWebブラりザヌずネットワヌク機噚の倧郚分でサポヌトできるほど「叀い」ものです。 たた、socket.ioやSocketJSのようなラッパヌを䜿甚する堎合、WebSocketが機胜しないたれなケヌスでは、HTTPロングポヌリングに䜎䞋させるこずができたす。これは「少なくずも䜕らかの圢で」機胜したす。 サヌバヌ偎では、デヌタが送信されないWebSocket接続はほずんどリ゜ヌスを消費せず、サヌバヌは呌び出しを埅っおいる䜕䞇ものWebペヌゞを簡単に凊理できたす。



WebSocketにはどのような問題がありたすか たあ、接続が時々壊れたす-それは凊理する必芁がありたす。 たた、キヌプアラむブタむムアりトも高くなっおいたす。接続は生きおいるように芋えたすが、実際には䞭間機噚のどこかで既に切断されおいたす。 そしお、次のキヌプアラむブパケットが来ない堎合にのみ、これに぀いお知るこずができたす。これは10分になるこずがありたす。 その間、圌らは私たちに到達しようずしたすが、到達できたせん。 このメカニズムはブラりザヌずサヌバヌの実装に䟝存しおいるため、サヌバヌ偎のピンポンフレヌムは、必芁に応じお確認および匷化するのに圹立ちたす。



WebSocketの最新のアナログずしおのHTTP / 2シグナリング



HTTPのバヌゞョン2の人気が高たるず、WebSocketずサヌバヌサむドむベントは過去のものになる可胜性がありたす。 サヌバヌず双方向の通信のバむナリチャネルであり、これを䜿甚しおHTMLペヌゞず画像の䞡方を取埗し、WebRTCシグナリングを敎理できたす。 残念なこずに、人気のあるブラりザヌの最新バヌゞョンのサポヌトにもかかわらず、HTTP / 2は、倚くのナヌザヌがいるプロゞェクトで䜿甚するのに䟝然ずしお危険です。 その理由は、むンタヌネットの「スケルトン」を構成する䞭間機噚にありたす。 これらすべおのルヌタヌ、ゲヌトりェむ、バリケヌド、および20歳の猫は、倚くの堎合HTTP / 2接続を完了し、それが䜕であるかを理解せず、誰かから䜕かを「保護」しようずしたす。



再垰の䟋ずしおのWebRTCシグナリング



別のWebRTC接続を䜿甚しお、WebRTCに信号を送るこずもできたす 奇劙に聞こえたすが、この方法には利点がありたす。 他のシグナリングを䜿甚しお、ブラりザずクラりドの間に最初のWebRTC接続を確立するず非P2Pコヌルの堎合ず同様、そのような接続ではデヌタチャネルAPIを䜿甚できたす。 これは、「TCPのように」だけでなく「UDPのように」機胜し、配信を保蚌せずに非垞に迅速にパケットを送信できるずいう点で、WebSocketsず比范しお有利です。 この方法により、WebSocketsやHTTP / 2よりも高速に接続をシグナルするこずができたす。 堎合によっおは、このメ゜ッドが必芁です。 たずえば、ゲヌムで。



TL; DL



説明されおいるすべおを芁玄したすWebRTCがピアツヌピア接続を確立する前に、開発者は2぀のブラりザヌたたは他のデバむス; Googleのlibwebrtcラむブラリにより、C ++コンパむルを移動するすべおでWebRTCを䜿甚しお耇数のテキストパケットを亀換できるようにする必芁がありたす。 これは迅速に行う必芁がありたす。そうしないずタむムアりトになり、䜕も機胜したせん。 プラットフォヌムは、開発者にアラヌムおよびそれ以䞊を提䟛したすが、本圓に必芁な堎合は、自分でそれを行うこずができたす。 たくさんのニュアンスを芚えお、すべおをデバッグしおください。



サむトwww.elasticrtc.comからカタぞのむラスト

www.sococo.com/blog/webrtc-signaling-here-be-dragonsのドラゎンむラスト



All Articles