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
Sponsored
·
Your Podcast. Everywhere. Effortlessly.
Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.
→
tatsuya
March 15, 2019
Technology
0
620
WebRTCを知ろう!
2019/3/15 サポーターズ勉強会 「WebRTCを知ろう!」
講師: 山川 達也 (NTTビズリンク)
tatsuya
March 15, 2019
Tweet
Share
Other Decks in Technology
See All in Technology
プロポーザルに込める段取り八分
shoheimitani
1
290
セキュリティについて学ぶ会 / 2026 01 25 Takamatsu WordPress Meetup
rocketmartue
1
310
データの整合性を保ちたいだけなんだ
shoheimitani
8
3.1k
【Ubie】AIを活用した広告アセット「爆速」生成事例 | AI_Ops_Community_Vol.2
yoshiki_0316
1
100
Data Hubグループ 紹介資料
sansan33
PRO
0
2.7k
茨城の思い出を振り返る ~CDKのセキュリティを添えて~ / 20260201 Mitsutoshi Matsuo
shift_evolve
PRO
1
320
外部キー制約の知っておいて欲しいこと - RDBMSを正しく使うために必要なこと / FOREIGN KEY Night
soudai
PRO
12
5.5k
登壇駆動学習のすすめ — CfPのネタの見つけ方と書くときに意識していること
bicstone
3
120
仕様書駆動AI開発の実践: Issue→Skill→PRテンプレで 再現性を作る
knishioka
2
670
Oracle Cloud Observability and Management Platform - OCI 運用監視サービス概要 -
oracle4engineer
PRO
2
14k
2026年、サーバーレスの現在地 -「制約と戦う技術」から「当たり前の実行基盤」へ- /serverless2026
slsops
2
250
フルカイテン株式会社 エンジニア向け採用資料
fullkaiten
0
10k
Featured
See All Featured
We Analyzed 250 Million AI Search Results: Here's What I Found
joshbly
1
730
My Coaching Mixtape
mlcsv
0
48
SEOcharity - Dark patterns in SEO and UX: How to avoid them and build a more ethical web
sarafernandez
0
120
Code Review Best Practice
trishagee
74
20k
Un-Boring Meetings
codingconduct
0
200
Organizational Design Perspectives: An Ontology of Organizational Design Elements
kimpetersen
PRO
1
190
Pawsitive SEO: Lessons from My Dog (and Many Mistakes) on Thriving as a Consultant in the Age of AI
davidcarrasco
0
67
Templates, Plugins, & Blocks: Oh My! Creating the theme that thinks of everything
marktimemedia
31
2.7k
技術選定の審美眼(2025年版) / Understanding the Spiral of Technologies 2025 edition
twada
PRO
117
110k
Getting science done with accelerated Python computing platforms
jacobtomlinson
2
120
Raft: Consensus for Rubyists
vanstee
141
7.3k
Gemini Prompt Engineering: Practical Techniques for Tangible AI Outcomes
mfonobong
2
280
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