Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
WebRTC (概要から中の仕組みまで)
Search
Yosuke Furukawa
PRO
October 08, 2014
Programming
9
9.1k
WebRTC (概要から中の仕組みまで)
High Performance Browser Networking 輪読会の資料です。
Yosuke Furukawa
PRO
October 08, 2014
Tweet
Share
More Decks by Yosuke Furukawa
See All by Yosuke Furukawa
Node.js, Deno, Bun 最新動向とその所感について
yosuke_furukawa
PRO
5
2.4k
Welcome JSConf.jp 2024
yosuke_furukawa
PRO
1
3.8k
tc39 x jsconf.jp Panel Discussion 2024
yosuke_furukawa
PRO
0
200
Removing Corepack
yosuke_furukawa
PRO
9
1.5k
JavaScript Runtime とはなにか
yosuke_furukawa
PRO
15
2.7k
Strip Types と Storage
yosuke_furukawa
PRO
4
380
Module Harmony について
yosuke_furukawa
PRO
3
1.6k
LTのやり方
yosuke_furukawa
PRO
16
2.4k
AppRouter Panel Talk
yosuke_furukawa
PRO
3
770
Other Decks in Programming
See All in Programming
はじめてのIssueOps - GitHub Actionsで実現するコメント駆動オペレーション
tmknom
7
2k
CIBMTR振り返り+敗北から学ぶコンペの取り組み方反省
takanao
1
360
TCAを用いたAmebaのリアーキテクチャ
dazy
0
260
やっと腹落ち「スプリント毎に動くモノをリリースする」〜ゼロから始めるメガバンクグループのアジャイル実践〜
sasakendayo
0
290
Rubyと自由とAIと
yotii23
6
2k
エンジニアに許された特別な時間の終わり
watany
82
69k
DenoでOpenTelemetryに入門する
yotahada3
1
140
Webフレームワークとともに利用するWeb components / JSConf.jp おかわり
spring_raining
1
170
Boost Your Web Performance with Hyperdrive
chimame
1
180
もう一人で悩まない! 個の知見をチームの知見にする3つの習慣と工夫 / Into team knowledge.
honyanya
3
410
Devin入門 〜月500ドルから始まるAIチームメイトとの開発生活〜 / Introduction Devin 〜Development With AI Teammates〜
rkaga
5
2k
Amazon Bedrockマルチエージェントコラボレーションを諦めてLangGraphに入門してみた
akihisaikeda
1
190
Featured
See All Featured
Into the Great Unknown - MozCon
thekraken
35
1.7k
The Art of Delivering Value - GDevCon NA Keynote
reverentgeek
11
1.4k
Designing on Purpose - Digital PM Summit 2013
jponch
117
7.1k
Automating Front-end Workflow
addyosmani
1369
200k
Sharpening the Axe: The Primacy of Toolmaking
bcantrill
40
2k
Gamification - CAS2011
davidbonilla
80
5.2k
A designer walks into a library…
pauljervisheath
205
24k
CoffeeScript is Beautiful & I Never Want to Write Plain JavaScript Again
sstephenson
160
15k
Faster Mobile Websites
deanohume
306
31k
Keith and Marios Guide to Fast Websites
keithpitt
411
22k
Creating an realtime collaboration tool: Agile Flush - .NET Oxford
marcduiker
28
2k
Done Done
chrislema
182
16k
Transcript
WebRTC High Performance Browser Networking ྠಡձ @yosuke_furukawa
WebRTC Web Real-Time Communication
None
ฉ͍ͨ΄͏͕͍͍ͭ
Web x Realtimeͷྺ࢙ 2005: Ajax ੜ 2006: Comet͕Ajaxͱͱʹݟ͞ΕΔ 2006: ServerSentEvents
ఏҊ։࢝ 2011: WebSocket͕ग़ͯ͘Δ 2012: WebRTC *(new!!)
WebRTCͱ? WebRTCϒϥβ্Ͱ ϦΞϧλΠϜίϛϡχέʔγϣϯʢRTCʣ ΛՄೳʹ͢ΔΣϒͷͨΊͷϑϨʔϜϫʔΫ ! ΣϒͰͷߴ࣭ͳίϛϡχέʔγϣϯͷͨΊ ԻʗϏσΦνϟοτΞϓϦέʔγϣϯ Ͱར༻͞ΕΔωοτϫʔΫɾԻɾө૾ίϯϙʔωϯτͳͲͷجຊ తͳߏཁૉؚ͕·ΕΔ
(ࢀߟจݙ: WebRTCͱ͔ษڧձ ͋ΜͲ͏͢͠)
WebRTC͕ఏڙ͢ΔAPI - MediaStream : ԻಈըͷετϦʔϜऔಘ - RTCPeerConnection: Իಈըͷ௨৴ - DataChannel:
ҙͷΞϓϦέʔγϣϯσʔλͷ௨ ৴
WebRTC͕ఏڙ͢ΔAPI - MediaStream : ԻಈըͷετϦʔϜऔಘ - RTCPeerConnection: Իಈըͷ௨৴ - DataChannel:
ҙͷΞϓϦέʔγϣϯσʔλͷ௨ ৴
MediaStream
MediaStreamΛࢧ͑Δٕज़ - ԻɾಈըॲཧΤϯδϯ - getUserMedia API
ԻɾಈըॲཧΤϯδϯ
ԻɾಈըॲཧΤϯδϯ ԻɾಈըॲཧΤϯδϯ͜ͷຊͰઐൣғ֎ɻ ԻɾಈըॲཧΛ࣮ݱ͢ΔʹɺίʔσοΫɺΤίʔ আڈɺϊΠζϦμΫγϣϯɺը૾ิਖ਼ͱ͍ͬͨॲཧ Λϒϥβ͕ػೳͱͯ࣋ͭ͠ඞཁ͕͋Δɻ
ԻɾಈըॲཧΤϯδϯ
ԻɾಈըॲཧΤϯδϯ ͜Ε͚ͩͷػೳΛ ༻ҙ͢Δඞཁ͕͋Δɻ
getUserMedia
getUserMedia ԻಈըΛStreamͱͯ͠ड͚औΔJavaScriptͷAPIɻ͜ΕΛ MediaStreamͱݺͿɻ ͜ΕΛvideoλάʹͤࣗͷಈը࠶ੜɻ ͜ΕΛRTCPeerConnectionʹͤWebRTCͷετϦʔϜΛ ૹΔ͜ͱ͕Մೳɻ
getUserMedia <video autoplay></video> <script> navigator.getUserMedia = ( navigator.getUserMedia || navigator.webkitGetUserMedia
|| navigator.mozGetUserMedia || navigator.msGetUserMedia); var constraints = { audio: true, video: true } navigator.getUserMedia(constraints, gotStream, logError); function gotStream(stream) { var video = document.querySelector('video'); video.src = window.URL.createObjectURL(stream); video.play(); } function logError(error) { console.log(error); } </script>
DEMO
MediaStreamͷ·ͱΊ -ԻɾಈըॲཧΤϯδϯ͕ϒϥβʹଘࡏ͍ͯ͠ ΔɺΤίʔɺϊΠζॲཧಈըίʔσοΫͱ͍ͬͨ ϝσΟΞͷॲཧϒϥβͰ࣮ݱ͞ΕΔ(ศར)ɻ -औಘ͢ΔʹgetUserMediaΛ͏
WebRTC͕ఏڙ͢ΔAPI - MediaStream : ԻಈըͷετϦʔϜऔಘ - RTCPeerConnection: Իಈըͷ௨৴ - DataChannel:
ҙͷΞϓϦέʔγϣϯσʔλͷ௨ ৴
RTCPeerConnection
RTCPeerConnectionͱ P2PଓΛཱ֬ͤ͞ΔͨΊͷॲཧͱͦΕΛҡ࣋͠ଓ ͚ΔͨΊͷॲཧΛఏڙ͢Δػೳɻ
RTCPeerConnectionͱ P2PଓΛཱ֬ͤ͞ΔͨΊͷॲཧͱͦΕΛҡ࣋͠ଓ ͚ΔͨΊͷॲཧΛఏڙ͢Δػೳɻ
RTCPeerConnectionͱ P2PଓΛཱ֬ͤ͞ΔͨΊͷॲཧͱͦΕΛҡ࣋͠ଓ ͚ΔͨΊͷॲཧΛఏڙ͢Δػೳɻ 35$Λߦ͏ͨΊɺ6%1Ͱ ߦΘΕΔɻ 8FCʹ6%1͕ʂ
RTCPeerConnectionͱ P2PଓΛཱ֬ͤ͞ΔͨΊͷॲཧͱͦΕΛҡ࣋͠ଓ ͚ΔͨΊͷॲཧΛఏڙ͢Δػೳɻ 35$1FFS$POOFDUJPO͜͜ͷ
RTCPeerConnection API 1. SDP (P2PωΰγΤʔτ࣌ͷσʔλϑΥʔϚοτ) 2. ICE protocol (NATΛ͑ͯP2Pଓཱ֬ҡ࣋͢ΔͨΊ) -
STUN - TURN 3. DTLS (௨৴҉߸Խ) 4. SRTP, SCTP (ετϦʔϜଟॏԽɺ੍ޚɺϑϩʔ੍ޚ)
RTCPeerConnection API - RTCPeerConnectionͷͨΊͷAPIࣗମγϯϓϧɹ
RTCPeerConnection API - RTCPeerConnectionͷͨΊͷAPIࣗମγϯϓϧɹ ΠϯλϑΣʔε 35$1FFS$POOFDUJPO ɹΛ௨ͯ͠-PDBM3FNPUF TUSFBNTʹଓ͢Δ͚ͩ
RTCPeerConnection API - RTCPeerConnectionͷͨΊͷAPIࣗମγϯϓϧɹ ͨͩதͰͬͯΔ͜ͱ ෳࡶ /"5τϥόʔαϧΛߦ͏*$&ϫʔ Ϋϑϩʔཧ
ϐΞؒͷࣗಈΩʔϓΞϥΠϒ ϩʔΧϧετϦʔϜͷมԽه ϦϞʔτετϦʔϜͷมԽه ετϦʔϜ࠶ωΰγΤʔγϣϯ ΦϑΝʔੜɺΞϯαʔडྖ"1* ݱࡏͷঢ়ଶϦΫΤετ"1*
P2PଓΛཱ֬ ͦͦଓཱ֬ͱ?
P2PଓΛཱ֬ ͦͦଓཱ֬ͱ? (HTTPͷ߹) MJTUFO QVCMJD*1 1035 1VCMJD*11035ΛΫϥΠΞϯτ͕͍ͬͯͯ αʔόʔ͕ଓΛ͍ͬͯͯ
ͦ͜ʹଓΛཁٻ͠ʹߦ͘
P2PଓΛཱ֬ ͦͦଓཱ֬ͱ? (WebRTCͷ߹) *1 1035 8FC35$ͷ߹*11035͔Βͳ͍ ͔ͬͨ͠ͱͯ͠૬ख͕ଓΛཁٻͯ͠ΔͱݶΒͳ͍
/"5ʹΑ͔ͬͯΕΔՄೳੑ͋Δ ػ /"5 /"5
P2PଓΛཱ֬ ଓཱ֬͢ΔͨΊʹΔ͜ͱɻ *1 1035 8FC35$ͷ߹*11035͔Βͳ͍ ͔ͬͨ͠ͱͯ͠૬ख͕ଓΛཁٻͯ͠ΔͱݶΒͳ͍
/"5ʹΑ͔ͬͯΕΔՄೳੑ͋Δ ػ /"5 /"5
P2PଓΛཱ֬ P2Pଓͷ։࢝ҙਤΛ૬खʹ͑ͯɺ౸ணύ έοτΛػ͢Δ
P2PଓΛཱ֬ P2Pଓͷ։࢝ҙਤΛ૬खʹ͑ͯɺ౸ணύ έοτΛػ͢Δ ͜ΕΛγάφϦϯάͱ͍͏
P2PଓΛཱ֬ WebRTCγάφϦϯάࣗΞϓϦέʔ γϣϯʹґଘ͢ΔɻͳͷͰγάφϦϯάͷτ ϥϯεϙʔτͱϓϩτίϧͷબࣗ༝
RTCPeerConnection API 1. SDP (P2PωΰγΤʔτ࣌ͷσʔλϑΥʔϚοτ) 2. ICE protocol (NATΛ͑ͯP2Pଓཱ֬ҡ࣋͢ΔͨΊ) -
STUN - TURN 3. DTLS (௨৴҉߸Խ) 4. SRTP, SCTP (ετϦʔϜଟॏԽɺ੍ޚɺϑϩʔ੍ޚ)
SDP
Session Description Protocol
ͭ·Γηογϣϯهड़༻ϓ ϩτίϧ
Sesssion Description Protocol (SDP) WebRTC༻ͷηογϣϯهड़༻ϓϩτίϧ
Sesssion Description Protocol (SDP) ͋·Γҙࣝ͢Δ͜ͱແ͍͕ɺύέοτΩϟϓ νϟϨϕϧͰૹ৴͞Ε͍ͯΔ༰͕͔Δɻ
Sesssion Description Protocol (SDP) ηογϣϯهड़͕ަ͞ΕΔͱϝοηʔδͷަ͕ՄೳʹͳΔ SDPͰऔಘ͢Δͷ: ετϦʔϜͷλΠϓ(Իɺಈը) ίʔσοΫͳͲͷઃఆ ૬खͷIPͱPORT !
RTCPeerConnection API 1. SDP (P2PωΰγΤʔτ࣌ͷσʔλϑΥʔϚοτ) 2. ICE protocol (NATΛ͑ͯP2Pଓཱ֬ҡ࣋͢ΔͨΊ) -
STUN - TURN 3. DTLS (௨৴҉߸Խ) 4. SRTP, SCTP (ετϦʔϜଟॏԽɺ੍ޚɺϑϩʔ੍ޚ)
ICE
Interactive Connection Establishment
ICE P2P௨৴ͷͨΊʹ͑ͳ͍ͱ͍͚ͳ͍น (NAT͑) ICE͕ఏڙͯ͘͠ΕΔͷ௨৴ܦ࿏ͷཱ֬ *1 1035 8FC35$ͷ߹૬खͷ*11035͔Βͳ͍
͔ͬͨ͠ͱͯ͠/"5ʹΑ͔ͬͯΕΔՄೳੑ͋Δ ػ /"5 /"5
ICE P2P௨৴ͷͨΊʹ͑ͳ͍ͱ͍͚ͳ͍น (NAT͑) ICE͕ఏڙͯ͘͠ΕΔͷ௨৴ܦ࿏ͷཱ֬ *1 1035 8FC35$ͷ߹૬खͷ*11035͔Βͳ͍
͔ͬͨ͠ͱͯ͠/"5ʹΑ͔ͬͯΕΔՄೳੑ͋Δ ػ /"5 /"5 ͜ΕΛղܾ͢Δखஈ
ICEͷલʹNATτϥόʔαϧʹ ͍͓ͭͯ͞Β͍͓ͯ͘͠ɻ
NATτϥόʔαϧ NATʹprivate IP/PORTͱpublic IP/PORTͷΈ߹ Θ͕ͤॻ͔Ε͍ͯΔΤϯτϦ͕͋Δɻ
NATτϥόʔαϧ NATʹprivate IP/PORTͱpublic IP/PORTͷΈ߹ Θ͕ͤॻ͔Ε͍ͯΔΤϯτϦ͕͋Δɻ ͜ͷΤϯτϦʹॻ͔Ε͍ͯͳ͍*1 1035ͷΈ߹Θͤͩͱ/"5֎͔Β ΞΫηεͯ͠/"5ʹಧ͔ͳ͍
NATτϥόʔαϧ NATʹprivate IP/PORTͱpublic IP/PORTͷΈ߹ Θ͕ͤॻ͔Ε͍ͯΔΤϯτϦ͕͋Δɻ ͪͳΈʹ͜ͷΤϯτϦͷू߹Λ USBOTMBUJPOUBCMF ༁ςʔϒϧ ͱ ݺͿ
NATτϥόʔαϧ NATʹprivate IP/PORTͱpublic IP/PORTͷΈ߹ Θ͕ͤॻ͔Ε͍ͯΔΤϯτϦ͕͋Δɻ ٯʹݴ͑͜͜ʹॻ͔Ε͍ͯΔ Έ߹Θ͕͔ͤΕ/"5ͷϐΞ ʹΞΫηεՄೳ
NATτϥόʔαϧ NATʹprivate IP/PORTͱpublic IP/PORTͷΈ߹ Θ͕ͤॻ͔Ε͍ͯΔΤϯτϦ͕͋Δɻ ͨͩ͠ɺ/"5෦ͷ*11035Λ શͯอ͍࣋ͯ͠ΔΘ͚Ͱͳ͍ɻ ΞΫηε͕༗Δʹ༁ςʔϒϧʹ Ճ͍ͯ͠Δɻ
NATτϥόʔαϧ NATʹprivate IP/PORTͱpublic IP/PORTͷΈ߹ Θ͕ͤॻ͔Ε͍ͯΔΤϯτϦ͕͋Δɻ ͭ·Γɺ/"5ͷ༁ςʔϒϧʹ*1 1035ͷΛࡌͤΔʹҰ୴/"5͔ Β֎ʹϦΫΤετΛ͓͘Δඞཁ͕ ͋Δɻ
STUN ࣗͷIPͱPORT͕֎͔ΒݟΔͱͳΜͳͷ͔͍߹Θ ͤΔɻ
STUN ࣗͷIPͱPORT͕֎͔ΒݟΔͱͳΜͳͷ͔͍߹Θ ͤΔɻ ͜͏͢Δ͜ͱͰ/"5ͷ༁ςʔϒϧʹࣗͷ*1 1035ΛࡌͤΔࣄ͕Ͱ͖Δɻ ·ͨ456/͔Βड͚ͨࣗͷ1VCMJD*1ͱ1035Λ ଞͷϐΞʹͤ௨৴͢Δ͜ͱ͕Ͱ͖Δɻ
TURN STUNΛͬͯଓͰ͖ΔͱݶΒͳ͍ɺͦͦ UDPΛϒϩοΫ͢ΔϑΝΠΞΥʔϧ͕͋ͬͨΒ݁ ہଓͰ͖ͳ͍ɻͦ͏͍͏࣌ʹ͏ͷ͕TURN
TURN STUNΛͬͯଓͰ͖ΔͱݶΒͳ͍ɺͦͦ UDPΛϒϩοΫ͢ΔϑΝΠΞΥʔϧ͕͋ͬͨΒ݁ ہଓͰ͖ͳ͍ɻͦ͏͍͏࣌ʹ͏ͷ͕TURN தؒͷ563/αʔόʔ͕σʔλΛ5$16%1 ͰϦϨʔͤ͞Δɻ11Ͱͳ͍͕ɺ ࣮֬ʹͭͳ͕Δɻ
ICE ICESTUN/TURNͱ͍ͬͨܦ࿏બΛ࣮ࢪ͢Δ ·ͣࣗͷϩʔΧϧ*1Λ 04ʹ͍߹ΘͤΔ
ICE 456/αʔόʹࣗͷ*1 1035Λ͍߹ΘͤΔɻ 456/
ICE 456/ʹܨ͕Βͳ͔ͬͨΒ 563/ΛͬͯϦϨʔͤ͞Δ 456/ ✗ 563/
ICE P2P௨৴ͷͨΊʹ͑ͳ͍ͱ͍͚ͳ͍น (NAT͑) 456/ʹܨ͕Βͳ͔ͬͨΒ 563/ΛͬͯϦϨʔͤ͞Δ 456/ ✗ 563/ ࣗಈͰ456/ɺ563/ͷΓ ͚Λͯ͘͠ΕΔɻศརɻ
ICE ICEʹ͕͋Δɻॳظଓʹ͕͔͔࣌ؒΔɻ ଓܦ࿏͕ܾ·Δ·Ͱ࣌ؒ ͔͔Γա͗Δɻ 456/ ✗ 563/
ͦ͜Ͱ Trickle ICE
Trickle ICE STUN, TURNͷީิݕࡧͱಉ࣌ʹγάφϦϯάνϟω ϧΛͬͯࣗͷ௨৴ܦ࿏Λૹ৴͠ɺݟ͔ͭͬͨஈ֊ ͰͦΕΛ͏ɻSTUN/TURNͷશܦ࿏͕ܾ·ΔͷΛ ͭඞཁ͕ͳ͍ɻ
Trickle ICE STUN, TURNͷީิݕࡧͱಉ࣌ʹγάφϦϯάνϟω ϧΛͬͯࣗͷ௨৴ܦ࿏Λૹ৴͠ɺݟ͔ͭͬͨஈ֊ ͰͦΕΛ͏ɻSTUN/TURNͷશܦ࿏͕ܾ·ΔͷΛ ͭඞཁ͕ͳ͍ɻ ީิΛݟ͚ͭͳ͕Βಉ࣌ʹγάφϦϯάνϟ ωϧͰܦ࿏ΛૹΓɺީิ͕ݟ͔͔ͭͬͨΒ ଓΛࢼΈΔͷͰॳظଓ͕ૣ͘ͳΔɻ
࣮ࡍʹಈ͔ͦ͏ DEMO http://simplewebrtc.com/demo.html
ͪͳΈʹ
chromeͩͱWebRTCͷ௨৴ঢ়گҎԼͷ ίϚϯυΛurlϑΥʔϜʹଧͭͱݟΕΔɻ chrome://webrtc-internals
RTCPeerConnection API 1. SDP (P2PωΰγΤʔτ࣌ͷσʔλϑΥʔϚοτ) 2. ICE protocol (NATΛ͑ͯP2Pଓཱ֬ҡ࣋͢ΔͨΊ) -
STUN - TURN 3. DTLS (௨৴҉߸Խ) 4. SRTP, SCTP (ετϦʔϜଟॏԽɺ੍ޚɺϑϩʔ੍ޚ)
DTLS
D (Datagram) + TLS
WebRTCͰɺUDPͷ௨৴Λ҉ ߸Խ͢ΔͷʹDTLSΛ͍ͬͯΔ
DTLS UDPॱෆಉͰύέϩεΛڐ༰͢Δ͕ɺTLSڐ༰͠ ͳ͍ɻ DTLS෦Ͱ͜ΕΛ͙ͨΊʹ෦ʹγʔέϯε൪ ߸ͱϑϥάϝϯτΦϑηοτɺͦͯ͠λΠϜΞτ ࣍ͷ࠶ૹͷΈΛఏڙ͍ͯ͠Δɻ
DTLS γʔέϯε൪߸ ϑϥάϝϯτΦϑηοτ
DTLS ύέοτ ࣌ؒʹฦ৴͕ͳ͔ͬͨΒ࠶ૹ
DTLS ύέοτ ࣌ؒʹฦ৴͕ͳ͔ͬͨΒ࠶ૹ 6%1্Ͱಈ͘%5-4͕ͩɺ جຊ5$1ͰͬͯΔ͜ͱʹ͍ۙ
RTCPeerConnection API 1. SDP (P2PωΰγΤʔτ࣌ͷσʔλϑΥʔϚοτ) 2. ICE protocol (NATΛ͑ͯP2Pଓཱ֬ҡ࣋͢ΔͨΊ) -
STUN - TURN 3. DTLS (௨৴҉߸Խ) 4. SRTP, SCTP (ετϦʔϜଟॏԽɺ੍ޚɺϑϩʔ੍ޚ)
SRTP
Secure Realtime Transport Protocol
SRTP IUUQXXXTMJEFTIBSFOFUJXBTIJXFC SUDNFFUVQS
SRTP
SRTP UJNFTUBNQ TFRVFODFOVNCFS ແࢹʂʂ
SRTP
SRTP
SRTP 4FRVFODF/VNCFSͱ 5JNFTUBNQΛ࣋ͭ
SCTP
Stream Control Transmission Protocol
SCTP
SCTP ͭͷΤϯυϙΠϯτؒͰҰͭͷଓͷ্Ͱ ಠཱͨ͠ෳͷσʔλΛૹΔ͜ͱ͕Ͱ͖Δ
͋Ε͜ΕͲ͔ͬͰฉ͍ͨ͜ͱ ແ͍???
http2
http2ͱSCTPɺϨΠϠʔҧ ͏͚ͲࢼΈࣅ͍ͯΔɻ
SCTPTCP/UDPͱಉ͡ϨΠϠʔ (τϥϯεϙʔτ)ͷϓϩτίϧ
ίϥϜɿૉͷSCTPͷ ࣮ࡍࠓͷTCP/UDPΛશͯSCTPʹͨ͠ΒͲ͏͔ɺͱ͍͏આ͋Δɻ HTTP2.0͕࣮ݱ͠Α͏ͱ͍ͯ͠ΔͷSCTPΛhttpͷϨΠϠͰ࣮ݱ͠Α͏ͱ͍ͯ͠ΔͷͰɺ SCTP͕࠾༻Ͱ͖ͨΒhttp2ͷͷ΄ͱΜͲ͕ࣗಈతʹղܾ͞ΕΔɻ (ͳ͓ɺGoogleͦΕͰෆຬͳͨΊɺQUICΛ࡞༷ͬͨɻ) ͔͠͠ɺطଘͷϧʔλNATσόΠεSCTPΛϕʔεʹ͍ͯ͠ͳ͍ɻ͔ͩΒΠϯλʔωοτ্ ͰSCTPΛجຊʹ͢Δ͜ͱࠓͷͱ͜Ζເޠɻ ͨͩ͠ɺ෦ωοτϫʔΫͳΒ͑Δɻ࣮ࡍʹSCTPΒ͍ͬͯͯɺLTEΛѻ͍ͬͯΔ ΩϟϦΞ෦ͷσʔλ௨৴SCTPͰ͋ΓɺΠϯλʔωοτΛྲྀ࣌͢ʹTCP/UDPʹมͯ͠
͍Δɻ (ͱɺॻ͔Ε͍ͯΔͷͷ࣮ࡍʹೝূαʔόͷҰ෦Ͱ͏ఔͰجຊTCPͷ༷ࢠ)
WebRTC͕ఏڙ͢ΔAPI - MediaStream : ԻಈըͷετϦʔϜऔಘ - RTCPeerConnection: Իಈըͷ௨৴ - DataChannel:
ҙͷΞϓϦέʔγϣϯσʔλͷ௨ ৴
DataChannel
DataChannel ϐΞؒͷΞϓϦέʔγϣϯσʔλΛΓͱΓ ͢Δʔͭɻ ํੑΛ࣋ͭɻͬͱ͜͜·Ͱདྷͨײ͋Δɻ
Μ?
DataChannel ϐΞؒͷΞϓϦέʔγϣϯσʔλΛΓͱΓ ͢Δʔͭɻ ํੑΛ࣋ͭɻͬͱ͜͜·Ͱདྷͨײ͋ Δɻ
ํੑ?
WebSocket
DataChannel ࣮DataChannel APIWebSocket APIͱ ͦͬ͘Γɺͦͯ͠ҙਤతʹࣅͤͯΔɻ
DataChannel var peerConnection = new RTCPeerConnection(); ! var dataChannel =
peerConnection.createDataChannel("myLabel", dataChannelOptions); ! dataChannel.onopen = function () { dataChannel.send("Hello World!"); }; ! dataChannel.onclose = function () { console.log("The Data Channel is Closed"); }; ! dataChannel.onerror = function (error) { console.log("Data Channel Error:", error); }; ! dataChannel.onmessage = function (event) { console.log("Got Data Channel Message:", event.data); }; !
WebSocket var webSocket = new WebSocket(‘ws://echo.websocket.org/'); ! ! webSocket.onopen =
function(){ console.log("Connection Opened"); } webSocket.onclose = function(){ console.log("Connection Closed"); } webSocket.onerror = function(evt){ console.log("The following error occurred: " + evt.data); } webSocket.onmessage = function(evt){ console.log("The following data was received:" + evt.data); }
WebSocket var webSocket = new WebSocket(‘ws://echo.websocket.org/'); ! ! webSocket.onopen =
function(){ console.log("Connection Opened"); } webSocket.onclose = function(){ console.log("Connection Closed"); } webSocket.onerror = function(evt){ console.log("The following error occurred: " + evt.data); } webSocket.onmessage = function(evt){ console.log("The following data was received:" + evt.data); } ΫϦιπ
DataChannelͱWebSocket ͷҧ͍ - WebSocketTCPɺDataChannelUDP, DTLS, SCTPͷ3ͭͷϓϩτίϧͷ্Ͱಈ࡞͢ Δɻ
DataChannelͱWebSocket ͷҧ͍ - ͭ·ΓDataChannel৴པੑɺॱংอূΛ ୲อ͢Δ͜ͱ୲อ͠ͳ͍͜ͱͰ͖Δɺઃ ఆՄೳɻ
DataChannel ଞͷݴ༿Ͱݴ͏ͱDataChannelͷಛ 1. ෦త৴པੑΛఏڙͰ͖Δɻ - ࠶ૹճ੍ݶΛઃ͚ͯͦΕҎ্ϛεͬͨΒఘΊΔ - λΠϜΞτظؒΛઃ͚ͯͦΕҎ্ϛεͬͨΒఘΊΔ 2. ॱෆಉʹσʔλΛड͚͢͜ͱͰ͖Δɻ
DataChannel ଞͷݴ༿Ͱݴ͏ͱDataChannelͷಛ 1. ෦త৴པੑΛఏڙͰ͖Δɻ - ࠶ૹճ੍ݶΛઃ͚ͯͦΕҎ্ϛεͬͨΒఘΊΔ - λΠϜΞτظؒΛઃ͚ͯͦΕҎ্ϛεͬͨΒఘΊΔ 2. ॱෆಉʹσʔλΛड͚͢͜ͱͰ͖Δɻ
5$1͔Β6%1·Ͱͷ৴པੑͱޮ ͷτϨʔυΦϑΛબͰ͖Δ
ٯʹݴ͑
ઃఆΊΜͲ͍ ƅ㱼ƅ)
DataChannel ύέοτϩεͷཱ֬ͱϐΞؒͷϨΠςϯγ༧ଌͰ ͖ͳ͍ɻͦͷͨΊɺ࠶ૹΧϯλλΠϜΞτͷ ઃఆʹ࠷దղଘࡏ͠ͳ͍ɻ ! ͠৴པੑͷ͍νϟωϧͰ࠷ྑͷ݁ՌΛಘ͚ͨ ΕɺϝοηʔδΛখ͘͢͞Δ͜ͱͩɻ
DataChannel ύέοτϩεͷཱ֬ͱϐΞؒͷϨΠςϯγ༧ଌͰ ͖ͳ͍ɻͦͷͨΊɺ࠶ૹΧϯλλΠϜΞτͷ ઃఆʹ࠷దղଘࡏ͠ͳ͍ɻ ! ͠৴པੑͷ͍νϟωϧͰ࠷ྑͷ݁ՌΛಘ͚ͨ ΕɺϝοηʔδΛখ͘͢͞Δ͜ͱͩɻ ઃఆঢ়گʹԠͯ͡ରԠ͠ͳͯ͘ ͳΒͳ͍ɺಛʹ࠷దղͳ͍ɻ
WebRTCͷϢʔεέʔεͱ ύϑΥʔϚϯε
WebRTCͰέΞ͢Δ͜ͱ - ͱΓ͋͑ͣҰ൪ଳҬ෯ ͍͘Βѹॖ͍ͯ͠ΔͱݴͬͯଳҬ৯͏ɻ ! HDΫΦϦςΟͩͱ1.2MbpsͷଳҬ͕ඞཁ શੈքతʹฏۉଳҬ෯3.1Mbps͔͠ͳ͍ HDετϦʔϜΛૹΔͳΒ࠷Ͱ3.5G+ ͷଓ͕ඞཁ
WebRTCͰέΞ͢Δ͜ͱ ࣍ʹγάφϦϯάαʔόʔ͕ඞཁ γάφϦϯάʹϨΠςϯγΛ͘͢Δ͜ͱ͕ෆՄܽɻ ͦͷͨΊWebSocketXHRɺSSEͱ͍ͬͨଓΛҡ࣋͢Δαʔό͕ඞ ཁʹͳΔɻ Φϓγϣϯͱͯ͠DataChannelΛ͏͜ͱͰϐΞؒͷଓཱ֬ޙWS ͷΘΓʹDataChannelͰݞΘΓͰ͖Δɻ ͜͏͢ΔͱγάφϦϯάαʔόʔͷෛՙ͕ݮΔɻ
WebRTCͰέΞ͢Δ͜ͱ ࠷ޙʹSTUNͱTURNͷαʔό͕ඞཁ NATϓϥΠϕʔτωοτϫʔΫ্ʹ΄΅࣮֬ʹଘࡏ͢Δɻ STUNαʔόstundͱ͍͏ਓؾͷOpenSourceαʔό͕͋ΔͷͰݕ౼͢Δ ͜ͱɻ UDPΛϒϩοΫ͍ͯ͠Δڥ͕͋Δ͜ͱߟ͑ΔͱTURNͷಋೖඞཁʹ ͳΔɻTURNʹܨ͕ΔͱTCPͱಉ༷ͷଓํࣜʹͳΔͨΊɺ΄ͱΜͲUDP ͷྑ͞ಘΒΕͳ͍ɻ࠷ऴखஈͱͯ͠ݕ౼͢Δ͜ͱɻ
ͱ͍͏Θ͚Ͱߟ͑ͳ͖Ό͍͚ͳ ͍͜ͱଟ͍ɻ
ͬ͟ͱ্͛Δͱ
456/ /"5 /"5 563/ 4JHOBMJOH4FSWFS /"5Λ͑ΔͨΊͷ456/ 563/ɻ *$&"HFOUͰΓ͚ΔɺՄೳͩͬ ͨΒΛ5SJDLMF*$&Λ͏ɻ 84
44&ͷϨΠςϯγͷαʔόʔΛ ࡞Δɻଓཱ֬ޙ%BUB$IBOOFM্Ͱͷ γάφϦϯάΛߦ͏ࣄΛߟྀ͢Δɻ ͪΌΜͱଳҬ෯ʹҙ͢Δɻ σʔλͳΔ͘খ͘͢͞Δɻ దͳϝσΟΞ੍ݶΛઃ͚Δɻ %BUB$IBOOFMͷόοϑΝσʔλࢹ͓͖ͯ͠ɺωοτϫʔΫϦϯΫͷঢ়گ ʹదԠͤ͞Δɻ ෦త৴པੑͷ͋Δ৴ͳΒ࠶ૹΧϯτͱλΠϜΞτΛదʹઃఆ͢Δɻ
456/ /"5 /"5 563/ 4JHOBMJOH4FSWFS /"5Λ͑ΔͨΊͷ456/ 563/ɻ *$&"HFOUͰΓ͚ΔɺՄೳͩͬ ͨΒΛ5SJDLMF*$&Λ͏ɻ 84
44&ͷϨΠςϯγͷαʔόʔΛ ࡞Δɻଓཱ֬ޙ%BUB$IBOOFM্Ͱͷ γάφϦϯάΛߦ͏ࣄΛߟྀ͢Δɻ ͪΌΜͱଳҬ෯ʹҙ͢Δɻ σʔλͳΔ͘খ͘͢͞Δɻ దͳϝσΟΞ੍ݶΛઃ͚Δɻ %BUB$IBOOFMͷόοϑΝσʔλࢹ͓͖ͯ͠ɺωοτϫʔΫϦϯΫͷঢ়گ ʹదԠͤ͞Δɻ ෦త৴པੑͷ͋Δ৴ͳΒ࠶ૹΧϯτͱλΠϜΞτΛదʹઃఆ͢Δɻ )BQQZ8FC35$-*'&
ࢀߟจݙ http://www.amazon.co.jp/hpbn/dp/4873116767 ! http://www.html5rocks.com/en/tutorials/webrtc/infrastructure/ ! http://www.html5rocks.com/ja/tutorials/webrtc/datachannels/ ! http://simpl.info/rtcdatachannel/ ! http://www.slideshare.net/iwashi86/20140801-web-rtcmeetup3r3
! https://docs.google.com/presentation/d/ 1MkvmX6Gvb1cRATdwF4RFBtol8NgdnblwlwikDnFhT10/present#slide=id.p ! http://html5experts.jp/mganeko/5554/ ! http://iwashi.co/2014/05/13/trickleice/ !