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
tatsuya
March 15, 2019
Technology
0
570
WebRTCを知ろう!
2019/3/15 サポーターズ勉強会 「WebRTCを知ろう!」
講師: 山川 達也 (NTTビズリンク)
tatsuya
March 15, 2019
Tweet
Share
Other Decks in Technology
See All in Technology
Postman v10リリース後を振り返る
nagix
0
170
本当のAWS基礎
toru_kubota
0
490
Next'24 事例セッションの紹介とクラウド資格を活用したキャリア形成について語りMuscle
yasumuusan
1
430
EMとして2023年度に頑張ったこと / What we did well in FY2023 as a EM
pauli
1
160
元インフラエンジニアに成る / Human Resources to Human Relations
bobtani
4
890
Kernel MemoryでAzure OpenAI Serviceとお手軽データソース連携
mitsuzono
1
180
どうするコスト最適化のトレードオフ
tetsuyaooooo
1
490
生産性向上チームの紹介
cybozuinsideout
PRO
1
860
MapLibreとAmazon Location Service
dayjournal
1
150
家族アルバム みてねにおけるGrafana活用術 / Grafana Meetup Japan Vol.1 LT
isaoshimizu
1
280
開発生産性向上サービスを作るFindyが自分たちで開発生産性を爆上げした組織づくりの歩み / Findy's path to boosting its own development productivity 2024-04-17
ma3tk
3
610
コードを書く隙間を見つけて生きていく技術/Findy 思考の現在地
fujiwara3
27
5.8k
Featured
See All Featured
Fight the Zombie Pattern Library - RWD Summit 2016
marcelosomers
227
16k
How STYLIGHT went responsive
nonsquared
92
4.8k
Building a Modern Day E-commerce SEO Strategy
aleyda
17
6.4k
We Have a Design System, Now What?
morganepeng
43
6.7k
Pencils Down: Stop Designing & Start Developing
hursman
117
11k
Building Flexible Design Systems
yeseniaperezcruz
319
37k
[RailsConf 2023] Rails as a piece of cake
palkan
23
3.9k
Designing for humans not robots
tammielis
248
25k
RailsConf 2023
tenderlove
4
540
The MySQL Ecosystem @ GitHub 2015
samlambert
243
12k
WebSockets: Embracing the real-time Web
robhawkes
59
7k
It's Worth the Effort
3n
180
27k
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