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
tatsuya
March 15, 2019
Technology
630
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
WebRTCを知ろう!
2019/3/15 サポーターズ勉強会 「WebRTCを知ろう!」
講師: 山川 達也 (NTTビズリンク)
tatsuya
March 15, 2019
Other Decks in Technology
See All in Technology
AIにシークレットを見せない、WSL2で安全な開発環境
yazm
0
300
20261017福岡devIO 「AIは"良いダッシュボード"を作れるか?
jtakeda
0
140
AIがコードを書く時代に、エンジニアは何で自分の価値を証明するのか / In an era where AI writes code how do engineers prove their value
carta_engineering
3
1.1k
SAENM ~Jupyterで残すPoCの試行錯誤、未来の自分と仲間を助ける記録!~
terapyon
0
110
今さら理解するウェブフォントver.2026
takanorip
3
770
Webの常識が通じないHTMLメールのダークモード
teamlab
PRO
0
120
大型犬好きによるPugの紹介
yamanoku
1
160
USB PDを使ってスマホを労わりたい
raspython3
0
180
『SAR衛星データ解析入門』のご紹介とその応用
syuchimu
0
120
TinyGoでオブザーバビリティ?OpenTelemetryはTinyGoで使えるのか / Is OpenTelemetry available in TinyGo environment?
ymotongpoo
2
140
1つのリクエストを追って理解する - llm-dのP/D分離
akhino
1
160
分析の民主化を支えるメタデータ整備の実践
kakehashi
PRO
4
1.4k
Featured
See All Featured
What's in a price? How to price your products and services
michaelherold
247
13k
How to Talk to Developers About Accessibility
jct
2
580
svc-hook: hooking system calls on ARM64 by binary rewriting
retrage
2
630
How to Grow Your eCommerce with AI & Automation
katarinadahlin
PRO
2
330
The innovator’s Mindset - Leading Through an Era of Exponential Change - McGill University 2025
jdejongh
PRO
1
380
Building AI with AI
inesmontani
PRO
1
1.3k
JavaScript: Past, Present, and Future - NDC Porto 2020
reverentgeek
52
6.1k
Impact Scores and Hybrid Strategies: The future of link building
tamaranovitovic
0
460
Building the Perfect Custom Keyboard
takai
2
910
The Spectacular Lies of Maps
axbom
PRO
1
1.1k
Testing 201, or: Great Expectations
jmmastey
46
8.3k
Redefining SEO in the New Era of Traffic Generation
szymonslowik
1
480
Transcript
WebRTCΛΖ͏! 20190315 ษڧձ NTTϏζϦϯΫגࣜձࣾɹࢁ ୡ
WebRTCΛΖ͏! Agenda WebRTCͱ WebRTCͰར༻͞ΕΔϓϩτίϧ WebRTCͷNATӽ͑ʹར༻͞ΕΔٕज़ WebRTCʹར༻͞ΕΔίʔσοΫ WebRTCʹΑΔάϧʔϓ௨ͷ࣮ݱ WebRTCσϞ
WebRTCͱ
WebRTCΛΖ͏! WebRTCͱ APIΛհͯ͠ϒϥβϞόΠϧΞϓϦʹReal-Time Communication (RTC)Λఏڙ͢ΔΦʔϓϯιʔεͷϓϩδΣ Ϋτ Google͕2011ʹϓϩδΣΫτΛ։࢝ World Wide Web
Consortium (W3C)ɾInternet Engineering Task Force (IETF) ͕ɺʑඪ४Խ
WebRTCΛΖ͏! WebRTCͱ W3CͱIETFͰඪ४Խ ᶃ ϓϩτίϧ (γάφϦϯάɺ௨৴ཱ֬ɺ҉߸ԽͳͲ) ᶄ NAT͑ͷΈ (NATɾFWΛ͑ͯP2P௨৴͢ΔΈ) ᶅ
ίʔσοΫ (ө૾ɾԻͷѹॖํࣜ) ᶆ API (Webϒϥβ͔ΒJavaScriptʹΑΓWebRTCΛ࣮ݱ) ※ᶃʙᶅ͕IETFɺᶆ͕W3C
ొਓ WebRTCΛΖ͏! WebRTCͱ Peer A Peer B STUN/TURNαʔό γάφϦϯάαʔό Webαʔό
Network
ొਓ WebRTCΛΖ͏! WebRTCͱ Peer A Peer B STUN/TURNαʔό γάφϦϯάαʔό Webαʔό
Network WebRTCΛར༻͢Δ WebϖʔδΛ࣮ ௨৴Λ։࢝͢ΔͨΊʹඞ ཁͳใͷަΛհ NATɾϑΝΠΞΥʔϧΛ͑ͯ ௨৴ͷཱ֬Λ͢ΔͨΊͷϓϩτίϧ
WebRTCΛࢧ͑Δ ϓϩτίϧ
WebRTCΛΖ͏! WebRTCΛࢧ͑Δϓϩτίϧ ϝσΟΞ σʔλ γάφϦϯά
WebRTCΛΖ͏! WebRTCΛࢧ͑Δϓϩτίϧ ϝσΟΞ σʔλ γάφϦϯά ө૾ɾԻσʔλ ͖ͳσʔλ (ςΩετνϟοτͳͲ)
WebRTCΛΖ͏! WebRTCΛࢧ͑Δϓϩτίϧ ϝσΟΞ σʔλ γάφϦϯά ө૾ɾԻσʔλ ͖ͳσʔλ (ςΩετνϟοτͳͲ)
ొਓ WebRTCΛΖ͏! WebRTCΛࢧ͑Δϓϩτίϧ -γάφϦϯά- Peer A Peer B STUN/TURNαʔό γάφϦϯάαʔό
Webαʔό Network WebRTCΛར༻͢Δ WebϖʔδΛ࣮ NATɾϑΝΠΞΥʔϧΛ͑ͯ ௨৴ͷཱ֬Λ͢ΔͨΊͷϓϩτίϧ ௨৴Λ։࢝͢ΔͨΊʹඞ ཁͳใͷަΛհ
WebRTCΛΖ͏! WebRTCΛࢧ͑Δϓϩτίϧ -γάφϦϯά- SDP ɹSession Description Protocol
WebRTCΛΖ͏! WebRTCΛࢧ͑Δϓϩτίϧ -γάφϦϯά- SDP ௨৴Λ։࢝͢ΔͨΊʹඞཁͳใΛهࡌ͢Δϓϩτίϧɻ ྫ͑ɺ༻͢Δө૾ɾԻͷίʔσοΫ(ѹॖํࣜ)ͳͲ WebSocketͳͲΛར༻͠ɺγάφϦϯάαʔόΛհͯ͠ ֤ΫϥΠΞϯτಉ࢜Ͱަ
WebRTCΛΖ͏! WebRTCΛࢧ͑Δϓϩτίϧ ϝσΟΞ σʔλ γάφϦϯά ө૾ɾԻσʔλ ͖ͳσʔλ (ςΩετνϟοτͳͲ)
WebRTCΛΖ͏! WebRTCΛࢧ͑Δϓϩτίϧ -SRTP- SRTP ɹSecure Real-time Transport Protocol
WebRTCΛΖ͏! WebRTCΛࢧ͑Δϓϩτίϧ -SRTP- SRTP ɹSecure Real-time Transport Protocol Secure+RTP
WebRTCΛΖ͏! WebRTCΛࢧ͑Δϓϩτίϧ -SRTP- SRTP ө૾ԻΛϦΞϧλΠϜʹૹड৴͢Δϓϩτίϧ RTPύέοτͷϖΠϩʔυ෦ (ө૾ɾԻσʔλ)Λ҉߸Խ ҉߸Խʹ͏伴DTLS (ޙड़) Λ༻͍ͯऔಘ
WebRTCΛΖ͏! WebRTCΛࢧ͑Δϓϩτίϧ -DTLS- DTLS ɹDatagram Transpor Layer Security
WebRTCΛΖ͏! WebRTCΛࢧ͑Δϓϩτίϧ -DTLS- DTLS ɹDatagram Transpor Layer Security Datagram(UDPͷD)+TLS
WebRTCΛΖ͏! WebRTCΛࢧ͑Δϓϩτίϧ -DTLS- DTLS σʔλάϥϜ (UDP) ͚ͷ҉߸Խํࣜ ϝσΟΞνϟωϧͰɺDTLS伴ަͷͨΊʹ͓ͬͯΓ ҉߸ԽࣗମSRTPΛར༻ (DTLS-SRTP)
WebRTCΛΖ͏! WebRTCΛࢧ͑Δϓϩτίϧ ϝσΟΞ σʔλ γάφϦϯά ө૾ɾԻσʔλ ͖ͳσʔλ (ςΩετνϟοτͳͲ)
ొਓ WebRTCΛΖ͏! WebRTCΛࢧ͑Δϓϩτίϧ -STUN/TURN- Peer A Peer B STUN/TURNαʔό γάφϦϯάαʔό
Webαʔό Network WebRTCΛར༻͢Δ WebϖʔδΛ࣮ ௨৴Λ։࢝͢ΔͨΊʹඞ ཁͳใͷަΛհ NATɾϑΝΠΞΥʔϧΛ͑ͯ ௨৴ͷཱ֬Λ͢ΔͨΊͷϓϩτίϧ
WebRTCΛΖ͏! WebRTCΛࢧ͑Δϓϩτίϧ -STUN/TURN- STUN ɹSession Traversal Utilities for NATs
WebRTCΛΖ͏! WebRTCΛࢧ͑Δϓϩτίϧ -STUN/TURN- STUN NATԼʹ͋ΔPC͕NATͷ֎ଆ͔Βݟͨࣗͷάϩʔό ϧIPΞυϨεΛऔಘ͢ΔͨΊͷϓϩτίϧ
WebRTCΛΖ͏! WebRTCΛࢧ͑Δϓϩτίϧ -STUN/TURN- STUN NAT NAT ࢲͷάϩʔόϧIPΞυϨ εͱϙʔτ൪߸ʁ ࢲͷάϩʔόϧIPΞυ Ϩεͱϙʔτ൪߸ʁ
Peer A Peer B STUNαʔό ϓϥΠϕʔτIP ΞυϨε192.168.1.1 ϓϥΠϕʔτIP ΞυϨε 172.16.1.1
WebRTCΛΖ͏! WebRTCΛࢧ͑Δϓϩτίϧ -STUN/TURN- STUN NAT NAT AͷάϩʔόϧIPΞυϨεͱ ϙʔτ൪߸ 100.100.100.100:5000/UDP ͩΑ!
BͷάϩʔόϧIPΞυϨεͱ ϙʔτ൪߸ 200.200.200.200:6000/UDP ͩΑ! Peer A Peer B STUNαʔό ϓϥΠϕʔτIP ΞυϨε192.168.1.1 ϓϥΠϕʔτIP ΞυϨε 172.16.1.1 ࢲͷάϩʔόϧIPΞυϨ εͱϙʔτ൪߸ʁ ࢲͷάϩʔόϧIPΞυ Ϩεͱϙʔτ൪߸ʁ
WebRTCΛΖ͏! WebRTCΛࢧ͑Δϓϩτίϧ -STUN/TURN- TURN ɹTraversal Using Replay around NAT
WebRTCΛΖ͏! WebRTCΛࢧ͑Δϓϩτίϧ -STUN/TURN- TURN ϐΞಉ࢜ͷ௨৴Λதܧ͢ΔͨΊͷϓϩτίϧ STUNʹΑΓP2P௨৴ͷཱ͕֬Ͱ͖ͳ͔ͬͨ߹ͷ࠷ऴखஈ
WebRTCΛΖ͏! WebRTCΛࢧ͑Δϓϩτίϧ -STUN/TURN- TURN NAT NAT Peer A Peer B
TURNαʔό STUNͷใͰBͱ P2PଓͰ͖ͳ͔ͬͨͧ STUNͷใͰAͱ P2PଓͰ͖ͳ͔ͬͨͧ
WebRTCΛΖ͏! WebRTCΛࢧ͑Δϓϩτίϧ -STUN/TURN- TURN NAT NAT Peer A Peer B
TURNαʔό AͱBͷ௨৴Λதܧ͢Δͧʂ
WebRTCΛΖ͏! WebRTCΛࢧ͑Δϓϩτίϧ -ICE- ICE ɹInteractive Connective Establishment
WebRTCΛΖ͏! WebRTCΛࢧ͑Δϓϩτίϧ -ICE- ICE STUNTURNΛར༻͠ɺ௨৴ܦ࿏ީิ (ICE Candidate)͔ Βదͳ௨৴ܦ࿏Λબ͢ΔΈ
WebRTCΛΖ͏! WebRTCΛࢧ͑Δϓϩτίϧ -ICE- ICE ௨৴ܦ࿏ީิ (ICE Candidate) STUN: άϩʔόϧIPΞυϨεͱϙʔτ൪߸ TURN:
TURNαʔόͷάϩʔόϧIPΞυϨεͱϢʔβͷ ͨΊʹׂΓͯΒΕͨϙʔτ൪߸
WebRTCΛΖ͏! WebRTCΛࢧ͑Δϓϩτίϧ -ICE- ICE ؆қಈ࡞ϑϩʔ 1) ಉҰͷϓϥΠϕʔτωοτϫʔΫʹ͋ΔՄೳੑΛߟྀ͠ɺϓϥ ΠϕʔτIPΞυϨεͱϙʔτ൪߸ͰP2PଓΛࢼΈΔ 2) ଓͰ͖ͳ͍߹ɺSTUNαʔόͰऔಘͨ͠ใʹج͖ͮɺ૬ख
ͷάϩʔόϧIPΞυϨεͱϙʔτ൪߸ʹΑΔP2PଓΛࢼΈΔ 3) ͦΕͰଓͰ͖ͳ͍߹TURNαʔόΛܦ༝ͨ͠ଓΛࢼΈΔ
ᶃ ॳظSDPΛަ͢Δ WebRTCΛΖ͏! WebRTCΛࢧ͑Δϓϩτίϧ -௨৴ཱ֬ϑϩʔ- NAT NAT Peer A Peer
B ϓϥΠϕʔτNW άϩʔόϧNW γάφϦϯάαʔό SDPΛૹ৴ʂ AͷSDP͕དྷͨʂ
ᶃ ॳظSDPΛަ͢Δ WebRTCΛΖ͏! WebRTCΛࢧ͑Δϓϩτίϧ -௨৴ཱ֬ϑϩʔ- NAT NAT Peer A Peer
B ϓϥΠϕʔτNW άϩʔόϧNW γάφϦϯάαʔό BͷSDP͕དྷͨʂ SDPΛૹ৴ʂ
ᶄ STUN/TRUNΛར༻ͯ͠௨৴ܦ࿏ީิ(ICE Candidate)Λऩ ू͠ɺγάφϦϯάαʔόΛհͯ͠ަ͢Δ WebRTCΛΖ͏! WebRTCΛࢧ͑Δϓϩτίϧ -௨৴ཱ֬ϑϩʔ- NAT NAT PC
A PC B ϓϥΠϕʔτNW άϩʔόϧNW STUN/TURNαʔό γάφϦϯάαʔό ࢲͷάϩʔόϧIPΞυϨε ͱϙʔτ൪߸ʁ ࢲͷάϩʔόϧIPΞυϨε ͱϙʔτ൪߸ʁ
ᶄ STUN/TRUNΛར༻ͯ͠௨৴ܦ࿏ީิ(ICE Candidate)Λऩ ू͠ɺγάφϦϯάαʔόΛհͯ͠ަ͢Δ WebRTCΛΖ͏! WebRTCΛࢧ͑Δϓϩτίϧ -௨৴ཱ֬ϑϩʔ- NAT NAT Peer
A Peer B ϓϥΠϕʔτNW άϩʔόϧNW STUNαʔό γάφϦϯάαʔό AͷάϩʔόϧIPΞυϨεͱ ϙʔτ൪߸ 100.100.100.100:5000/UDP ͩΑ! BͷάϩʔόϧIPΞυϨεͱ ϙʔτ൪߸ 200.200.200.200:6000/UDP ͩΑ!
ᶄ STUN/TRUNΛར༻ͯ͠௨৴ܦ࿏ީิ(ICE Candidate)Λऩ ू͠ɺγάφϦϯάαʔόΛհͯ͠ަ͢Δ WebRTCΛΖ͏! WebRTCΛࢧ͑Δϓϩτίϧ -௨৴ཱ֬ϑϩʔ- NAT NAT Peer
A Peer B ϓϥΠϕʔτNW άϩʔόϧNW STUNαʔό γάφϦϯάαʔό γάφϦϯάαʔόʹࣗͷใ ૹΖɻ͍ͭͰʹ௨৴૬खͷใڭ ͑ͯΒ͓ʂ γάφϦϯάαʔόʹࣗͷใ ૹΖɻ͍ͭͰʹ௨৴૬खͷใڭ ͑ͯΒ͓ʂ
ᶄ STUN/TRUNΛར༻ͯ͠௨৴ܦ࿏ީิ(ICE Candidate)Λऩ ू͠ɺγάφϦϯάαʔόΛհͯ͠ަ͢Δ WebRTCΛΖ͏! WebRTCΛࢧ͑Δϓϩτίϧ -௨৴ཱ֬ϑϩʔ- NAT NAT Peer
A Peer B ϓϥΠϕʔτNW άϩʔόϧNW STUNαʔό γάφϦϯάαʔό Aͱ௨৴͕ͨͬͯ͠ΔBͷ ใૹΔΑ! Bͱ௨৴͕ͨͬͯ͠ΔAͷ ใૹΔΑ!
ᶅ ಉҰͷϓϥΠϕʔτωοτϫʔΫʹ͋ΔՄೳੑΛߟྀ͠ɺ ϓϥΠϕʔτIPΞυϨεͱϙʔτ൪߸ͰP2PଓΛࢼΈΔ WebRTCΛΖ͏! WebRTCΛࢧ͑Δϓϩτίϧ -௨৴ཱ֬ϑϩʔ- NAT Peer A Peer
B ϓϥΠϕʔτNW άϩʔόϧNW ࣮ಉ͡ωοτϫʔΫ ʹ͍ͨΑʂ ·͔͡ʂʂ
ᶅ ಉҰͷϓϥΠϕʔτωοτϫʔΫʹ͋ΔՄೳੑΛߟྀ͠ɺ ϓϥΠϕʔτIPΞυϨεͱϙʔτ൪߸ͰP2PଓΛࢼΈΔ WebRTCΛΖ͏! WebRTCΛࢧ͑Δϓϩτίϧ -௨৴ཱ֬ϑϩʔ- Peer A Peer B
ϓϥΠϕʔτNW άϩʔόϧNW ࣮ಉ͡ωοτϫʔΫ ʹ͍ͨΑʂ ·͔͡ʂʂ NAT P2P௨৴։࢝
ᶆ ܨ͕Βͳ͔ͬͨΒɺSTUNαʔόͰऔಘͨ͠ใʹجͮ ͖ɺ૬खͷάϩʔόϧIPΞυϨεͱϙʔτ൪߸ʹΑΔ P2PଓΛࢼΈΔ WebRTCΛΖ͏! WebRTCΛࢧ͑Δϓϩτίϧ -௨৴ཱ֬ϑϩʔ- NAT NAT Peer
A Peer B ϓϥΠϕʔτNW άϩʔόϧNW STUNαʔό γάφϦϯάαʔό ܨ͕ͬͨʂ ܨ͕ͬͨʂ P2P௨৴։࢝
ᶇ ͦΕͰܨ͕Βͳ͔ͬͨΒɺTURNαʔόΛܦ༝ͨ͠ଓ ΛࢼΈΔ WebRTCΛΖ͏! WebRTCΛࢧ͑Δϓϩτίϧ -௨৴ཱ֬ϑϩʔ- NAT NAT Peer A
Peer B ϓϥΠϕʔτNW άϩʔόϧNW TURNαʔό γάφϦϯάαʔό ܨ͕Βͳ͍ʂ ܨ͕Βͳ͍ʂ
ᶇ ͦΕͰܨ͕Βͳ͔ͬͨΒɺTURNαʔόΛܦ༝ͨ͠ଓ ΛࢼΈΔ WebRTCΛΖ͏! WebRTCΛࢧ͑Δϓϩτίϧ -௨৴ཱ֬ϑϩʔ- NAT NAT Peer A
Peer B ϓϥΠϕʔτNW άϩʔόϧNW TURNαʔό γάφϦϯάαʔό ֎͔Βͷ௨৴Λ؆୯ʹ௨͞ͳ͍ͧɻ ※NATʹ9छྨͷఆ͕ٛ͋Δ (RFC 5780) NATͷΈ߹ΘͤʹΑͬͯ͑Εͳ͍ ߹͕͋Δ
ᶇ ͦΕͰܨ͕Βͳ͔ͬͨΒɺTURNαʔόΛܦ༝ͨ͠ଓ ΛࢼΈΔ WebRTCΛΖ͏! WebRTCΛࢧ͑Δϓϩτίϧ -௨৴ཱ֬ϑϩʔ- NAT NAT Peer A
Peer B ϓϥΠϕʔτNW άϩʔόϧNW TURNαʔό γάφϦϯάαʔό ࠷ऴखஈʂ ࠷ऴखஈʂ ௨৴։࢝ ύέοτதܧ͢Δͧʂ
WebRTCΛΖ͏! WebRTCΛࢧ͑Δϓϩτίϧ -ICE- ICE Vanilla ICEͱTrickle ICEͷ2छྨ͕ଘࡏ Peer A Peer
B ϓϥΠϕʔτNW άϩʔόϧNW γάφϦϯάαʔό NAT NAT Vanilla or Trickle?
WebRTCΛΖ͏! WebRTCΛࢧ͑Δϓϩτίϧ Vanilla ICE શͯͷICE Candidate͕ग़ἧ͔ͬͯΒSDPʹؚΊͯަ͢ Δํࣜ ICE CandidateSDPʹؚ·ΕΔͷͰใަ͕Ұԟ෮Ͱ ࡁΉ
ީิΛݟ͚ͭऴ͑ΔͷΛͨͳ͚Ε͍͚ͳ͍ͨΊɺ௨ ৴ཱ֬·Ͱʹ͔͔Δ͕࣌ؒ͘ͳΔ
WebRTCΛΖ͏! WebRTCΛࢧ͑Δϓϩτίϧ -ICE- Vanilla ICE NAT NAT Peer A Peer
B P2P௨৴։࢝ SDP ICE Candidate SDP ICE Candidate
WebRTCΛΖ͏! WebRTCΛࢧ͑Δϓϩτίϧ -ICE- Trickle ICE ॳظSDPΛަ͠ɺICE CandidateΛൃݟ͢Δͨͼʹ४͡ ަ͢Δํࣜ શͯͷICE CandidateΛऩू͢ΔલʹP2P௨৴ʹޭ͢Δ
Մೳੑ͕͋Δ ௨৴ཱ͕֬ૣ͘ͳΔՄೳੑ͕͋Δ͕ɺܦ࿏ใΛަ͢ Δճଟ͘ͳΔ
WebRTCΛΖ͏! WebRTCΛࢧ͑Δϓϩτίϧ -ICE- Trickle ICE NAT NAT Peer A Peer
B ॳظSDP ॳظSDP ICE Candidate ICE Candidate ɾ ɾ ɾ ICE Candidate P2P௨৴։࢝ ICE Candidate ɾ ɾ ɾ
WebRTCͷNATӽ͑ ʹར༻͞ΕΔٕज़
WebRTCΛΖ͏! WebRTCͷNATӽ͑ʹར༻͞ΕΔٕज़ UDPϗʔϧύϯνϯά ௨৴ܦ࿏্ʹ͋ΔNATFirewallͷಈ࡞ҎԼ ᶃ ͔Β֎ͷ௨৴ΛڐՄ ᶄ ֎͔Βͷ௨৴ɺ͔Β֎ͷ௨৴͕͋ͬͨ߹ʹڐՄ →
NATFirewall্ʹϚοϐϯά͕Ͱ͖Δɻ͜Ε͕ϗʔϧͱ ݺΕΔ ͜ͷϚοϐϯάΛ௨ͬͯP2P௨৴Λཱ֬͢Δٕज़
WebRTCΛΖ͏! WebRTCͷNATӽ͑ʹར༻͞ΕΔٕज़ UDPϗʔϧύϯνϯά NAT NAT Peer A Peer B PC
AͱPC Bؒͷ௨৴ͷϚοϐϯά͕Ͱ͖Δ
WebRTCΛΖ͏! WebRTCͷNATӽ͑ʹར༻͞ΕΔٕज़ UDPϗʔϧύϯνϯά Ϛοϐϯά͕ͳ͍ͨΊϒϩοΫ NAT NAT Peer A Peer B
PC AͱPC Bؒͷ௨৴ͷϚοϐϯά͕Ͱ͖Δ
WebRTCΛΖ͏! WebRTCͷNATӽ͑ʹར༻͞ΕΔٕज़ UDPϗʔϧύϯνϯά Ϛοϐϯά͕ͳ͍ͨΊϒϩοΫ PC AͱPC Bؒͷ௨৴ͷϚοϐϯά͕Ͱ͖Δ NAT Peer A
PC AͱPC Bؒͷ௨৴ͷϚοϐϯά͕Ͱ͖Δ NAT Peer B
WebRTCΛΖ͏! WebRTCͷNATӽ͑ʹར༻͞ΕΔٕज़ UDPϗʔϧύϯνϯά Ϛοϐϯά͕ͳ͍ͨΊϒϩοΫ Ϛοϐϯά͕͋ΔͨΊNATΛ௨ա NAT NAT PC AͱPC Bؒͷ௨৴ͷϚοϐϯά͕Ͱ͖Δ
PC AͱPC Bؒͷ௨৴ͷϚοϐϯά͕Ͱ͖Δ Peer A Peer B
UDPϗʔϧύϯνϯά NAT NAT WebRTCΛΖ͏! WebRTCͷNATӽ͑ʹར༻͞ΕΔٕज़ Ϛοϐϯά͕ͳ͍ͨΊϒϩοΫ Ϛοϐϯά͕͋ΔͨΊNATΛ௨ա Ϛοϐϯά͕͋ΔͨΊNATΛ௨ա Peer A
Peer B PC AͱPC Bؒͷ௨৴ͷϚοϐϯά͕Ͱ͖Δ PC AͱPC Bؒͷ௨৴ͷϚοϐϯά͕Ͱ͖Δ
WebRTCʹར༻͞ΕΔ ίʔσοΫ
WebRTCΛΖ͏! WebRTCʹར༻͞ΕΔίʔσοΫ ίʔσοΫͱ σʔλͷѹॖɾ৳ு͢ΔஔιϑτΣΞ ө૾ԻͷσʔλΛѹॖ͢Δ͜ͱʹΑΓ௨৴σʔλ ྔΛݮ
WebRTCΛΖ͏! WebRTCʹར༻͞ΕΔίʔσοΫ ө૾ίʔσοΫ छྨ ཧ৫ ରԠϒϥβ ࢀߟใ VP8 Google Chrome,Firefox,
Safari,Edge සൟʹར༻͞Ε͍͕ͯͨ ࠷ۙVP9ʹஔ͖Θ͖͍ͬͯͯΔ VP9 Google Chrome,Firefox VP8ͷఔͷϏοτϨʔτͰಉ࣭Λ ࣮ݱͰ͖Δ͕CPU༻͕ߴ͍ H.264/AVC MPEG LA Chrome,Firefox, Safari,Edge VP8ͱಉఔͷ࣭ հͨ͠ө૾ίʔσοΫͰ࠷ݹ͍ AV1 AOM Alliance for Open Media 2019 ޙʹରԠ༧ఆ
WebRTCΛΖ͏! WebRTCʹར༻͞ΕΔίʔσοΫ ԻίʔσοΫ छྨ ཧ৫ ରԠϒϥβ ࢀߟใ Opus IETF Chrome,Firefox,
Safari,Edge සൟʹར༻͞Ε͍ͯΔ G.711 CCITT Chrome,Firefox Safari,Edge Opusͱൺֱ͠ɺ࣭͕͍ ԻίʔσοΫͷதͰࡦఆ͞Εͨͷ͕ඇ ৗʹݹ͍ ͦͷଞɺiLBC,iSAC,G.722Λαϙʔτ͢Δϒϥβ͋Δ͕ɺOpus͕ओྲྀ
WebRTCʹΑΔ άϧʔϓ௨ͷ࣮ݱ
WebRTCΛΖ͏! WebRTCʹΑΔάϧʔϓ௨ͷ࣮ݱ ԕִίϛϡχέʔγϣϯαʔϏεΛ࣮ݱ͢Δ্Ͱɺάϧʔϓ௨ ඞਢػೳ ϑϧϝογϡଓ SFU (Selective Forwarding Unit) MCU
(Multi-point Control Unit)
WebRTCΛΖ͏! WebRTCʹΑΔάϧʔϓ௨ͷ࣮ݱ ϑϧϝογϡଓ ଓ͢Δͯ͢ͷͱP2P௨৴Λཱ֬ ෳͷө૾ɾԻΛૹड৴͢ΔͨΊෛՙ͕ඇৗʹߴ͍ ଆͰϨΠΞτΛܾఆ ৴αʔόϨε
WebRTCΛΖ͏! WebRTCʹΑΔάϧʔϓ௨ͷ࣮ݱ SFU αʔόʹࣗө૾Λૹ৴͠ɺαʔό͕֤ʹө૾Λ৴ ෳͷө૾ɾԻΛड৴͢ΔͨΊɺड৴࣌ͷෛՙ͕ߴ͍ ଆͰϨΠΞτΛܾఆ ޙड़ͷMCUͱൺֱ͠ɺαʔόͷෛՙΊ SFU
WebRTCΛΖ͏! WebRTCʹΑΔάϧʔϓ௨ͷ࣮ݱ MCU αʔόʹࣗө૾Λૹ৴͠ɺαʔό͕֤ʹө૾Λ৴ ϨΠΞταʔόଆͰܾఆ͠ɺ߹͞Εͨө૾Λड৴͢ΔͨΊɺ ෛՙ͍ ө૾ɾԻΛ߹ɾ৴͢Δɺαʔόͷෛՙ͕ඇৗʹߴ͍ MCU
WebRTCσϞ
ߏਤ WebRTCΛΖ͏! WebRTCσϞ -ߏਤ- Ξμϓλʔ 8FCαʔό γάφϦϯάαʔό Nginx (Web) Node.js
(γάφϦϯά) Vagrant box 2ͭͷFirefoxؒͰP2P 456/536/ 4LZ8BZ
WebRTCΛΖ͏! WebRTCσϞ -API- ຊσϞͰ༻ͨ͠API MediaDevices.getUserMedia()ϝιουͰࣗΧϝϥө૾ɺ͓ΑͼࣗϚΠΫԻΛऔಘ γάφϦϯά։࢝࣌ɺRTCPeerConnectionΦϒδΣΫτΛੜ createOffer() (Offerଆ), createAnswer() (Answerଆ)ϝιουͰɺSDPΛੜ
setLocalDescription() (ࣗͷSDP), setRemoteDescription() (૬ख͔ΒૹΒΕ͖ͯͨSDP)ϝιου ͰɺSDPΛRTCPeerConnectionʹηοτ setLocalDescription()ʹΑΓSDP͕ηοτ͞ΕΔͱɺICE CandidateΛࣗಈతʹऩू։࢝͠ɺݟ͔ͭ ΔͱonicecandidateΠϕϯτ͕ඇಉظͰൃՐ ૬खͷICE CandidateΛड৴ͨ͠ΒɺaddIceCandidate()ϝιουͰɺRTCPeerConnectionʹηοτ addTrack()ϝιουͰɺࣗө૾ɾԻTrackΛՃɻWebRTCͰɺө૾ɾԻ͕Trackͱ͍͏୯ҐͰ ϝσΟΞετϦʔϜʹؚ·Ε͍ͯΔ ૬खͷө૾ɾԻTrackͷड৴ͰontrackΠϕϯτ͕ൃՐ MediaStream.getTracks()ϝιουͰɺө૾ɾԻTrackΛऔಘ HTMLMediaElement.play()ϝιουͰɺө૾ɾԻΛ࠶ੜ
END