Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
WebRTC (概要から中の仕組みまで)
Search
Yosuke Furukawa
PRO
October 08, 2014
Programming
9.3k
9
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
WebRTC (概要から中の仕組みまで)
High Performance Browser Networking 輪読会の資料です。
Yosuke Furukawa
PRO
October 08, 2014
More Decks by Yosuke Furukawa
See All by Yosuke Furukawa
Webの地図
yosuke_furukawa
PRO
6
5.1k
XHTMLが残したもの
yosuke_furukawa
PRO
2
900
jsmini JavaScript Engine を作ってみた話
yosuke_furukawa
PRO
0
430
デザインシステムが必須の時代に
yosuke_furukawa
PRO
2
320
Node.js, Deno, Bun 最新動向とその所感について
yosuke_furukawa
PRO
10
5.4k
Welcome JSConf.jp 2024
yosuke_furukawa
PRO
1
4.9k
tc39 x jsconf.jp Panel Discussion 2024
yosuke_furukawa
PRO
0
380
Removing Corepack
yosuke_furukawa
PRO
9
2k
JavaScript Runtime とはなにか
yosuke_furukawa
PRO
15
3.2k
Other Decks in Programming
See All in Programming
技術的負債の返済は、AI時代の複利で効く投資 — 経営としての意思決定とその遂行
curekoshimizu
1
2.2k
自サークルのIdPからログアウトできるようになるまで
taiseiue
0
110
機械に任せるテスト、人が見るテスト ⽣成AIで引き直した、運⽤保守フェーズの線引き
dske104
0
160
APNsからLive Activityを開始する話
yumnumm
0
150
Unity6 URPによる海底をテーマにしたVJシステムの解説 | Unity Shader 完全に理解した 勉強会
gam0022
0
330
モデルのリファクタリングが難しいと思ったら、そもそも複雑だったのはビジネス仕様だった ? / is-the-business-domain-the-real-complexity
hatsu38
0
450
【加筆修正版】Laravel のアプリケーションをどこにデプロイするか #phpcon_ehime
akase244
0
150
AWSに止められる覚悟してますか?
morizo_1984
2
510
C#の現在地 進化の歴史と、AI時代の.NET Everywhere
neuecc
5
4.9k
MVNOの申込からeSIM開通までをiOSアプリでつなぐ- 本人確認・MNP・通信事業者基盤をまたぐ実装
satotakeshi
0
540
iOS 27でニュースアプリはどう変わる!? 〜日経電子版の新機能対応と、開発事例から〜
lynnswap
7
13k
Vue Fes Japan 2026 タイムテーブル徹底解説
448jp
1
630
Featured
See All Featured
XXLCSS - How to scale CSS and keep your sanity
sugarenia
250
1.3M
A better future with KSS
kneath
240
18k
The MySQL Ecosystem @ GitHub 2015
samlambert
251
13k
Done Done
chrislema
187
17k
Jess Joyce - The Pitfalls of Following Frameworks
techseoconnect
PRO
1
440
Designing Experiences People Love
moore
143
24k
[RailsConf 2023] Rails as a piece of cake
palkan
59
7.1k
The Anti-SEO Checklist Checklist. Pubcon Cyber Week
ryanjones
0
260
Deep Space Network (abreviated)
tonyrice
0
350
DevOps and Value Stream Thinking: Enabling flow, efficiency and business value
helenjbeal
1
400
Build The Right Thing And Hit Your Dates
maggiecrowley
39
3.5k
Pawsitive SEO: Lessons from My Dog (and Many Mistakes) on Thriving as a Consultant in the Age of AI
davidcarrasco
0
250
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/ !