Upgrade to Pro — share decks privately, control downloads, hide ads and more …

WebRTCを知ろう!

tatsuya
March 15, 2019

 WebRTCを知ろう!

2019/3/15 サポーターズ勉強会 「WebRTCを知ろう!」
講師: 山川 達也 (NTTビズリンク)

tatsuya

March 15, 2019
Tweet

Other Decks in Technology

Transcript

  1. WebRTCΛ஌Ζ͏! WebRTCͱ͸ W3CͱIETFͰඪ४Խ ᶃ ϓϩτίϧ (γάφϦϯάɺ௨৴ཱ֬ɺ҉߸ԽͳͲ) ᶄ NAT௒͑ͷ࢓૊Έ (NATɾFWΛ௒͑ͯP2P௨৴͢Δ࢓૊Έ) ᶅ

    ίʔσοΫ (ө૾ɾԻ੠ͷѹॖํࣜ) ᶆ API (Webϒϥ΢β͔ΒJavaScript౳ʹΑΓWebRTCΛ࣮ݱ) ※ᶃʙᶅ͕IETFɺᶆ͕W3C
  2. ొ৔ਓ෺ WebRTCΛ஌Ζ͏! WebRTCͱ͸ Peer A Peer B STUN/TURNαʔό γάφϦϯάαʔό Webαʔό

    Network WebRTCΛར༻͢Δ WebϖʔδΛ࣮૷ ௨৴Λ։࢝͢ΔͨΊʹඞ ཁͳ৘ใͷަ׵Λ஥հ NATɾϑΝΠΞ΢ΥʔϧΛ௒͑ͯ ௨৴ͷཱ֬Λ͢ΔͨΊͷϓϩτίϧ
  3. ొ৔ਓ෺ WebRTCΛ஌Ζ͏! WebRTCΛࢧ͑Δϓϩτίϧ -γάφϦϯά- Peer A Peer B STUN/TURNαʔό γάφϦϯάαʔό

    Webαʔό Network WebRTCΛར༻͢Δ WebϖʔδΛ࣮૷ NATɾϑΝΠΞ΢ΥʔϧΛ௒͑ͯ ௨৴ͷཱ֬Λ͢ΔͨΊͷϓϩτίϧ ௨৴Λ։࢝͢ΔͨΊʹඞ ཁͳ৘ใͷަ׵Λ஥հ
  4. ొ৔ਓ෺ WebRTCΛ஌Ζ͏! WebRTCΛࢧ͑Δϓϩτίϧ -STUN/TURN- Peer A Peer B STUN/TURNαʔό γάφϦϯάαʔό

    Webαʔό Network WebRTCΛར༻͢Δ WebϖʔδΛ࣮૷ ௨৴Λ։࢝͢ΔͨΊʹඞ ཁͳ৘ใͷަ׵Λ஥հ NATɾϑΝΠΞ΢ΥʔϧΛ௒͑ͯ ௨৴ͷཱ֬Λ͢ΔͨΊͷϓϩτίϧ
  5. 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Ξυ Ϩεͱϙʔτ൪߸͸ʁ
  6. WebRTCΛ஌Ζ͏! WebRTCΛࢧ͑Δϓϩτίϧ -STUN/TURN- TURN NAT NAT Peer A Peer B

    TURNαʔό STUNͷ৘ใͰBͱ P2P઀ଓͰ͖ͳ͔ͬͨͧ STUNͷ৘ใͰAͱ P2P઀ଓͰ͖ͳ͔ͬͨͧ
  7. ᶃ ॳظSDPΛަ׵͢Δ WebRTCΛ஌Ζ͏! WebRTCΛࢧ͑Δϓϩτίϧ -௨৴ཱ֬ϑϩʔ- NAT NAT Peer A Peer

    B ϓϥΠϕʔτNW άϩʔόϧNW γάφϦϯάαʔό SDPΛૹ৴ʂ AͷSDP͕དྷͨʂ
  8. ᶃ ॳظSDPΛަ׵͢Δ WebRTCΛ஌Ζ͏! WebRTCΛࢧ͑Δϓϩτίϧ -௨৴ཱ֬ϑϩʔ- NAT NAT Peer A Peer

    B ϓϥΠϕʔτNW άϩʔόϧNW γάφϦϯάαʔό BͷSDP͕དྷͨʂ SDPΛૹ৴ʂ
  9. ᶄ STUN/TRUNΛར༻ͯ͠௨৴ܦ࿏ީิ(ICE Candidate)Λऩ ू͠ɺγάφϦϯάαʔόΛհͯ͠ަ׵͢Δ WebRTCΛ஌Ζ͏! WebRTCΛࢧ͑Δϓϩτίϧ -௨৴ཱ֬ϑϩʔ- NAT NAT PC

    A PC B ϓϥΠϕʔτNW άϩʔόϧNW STUN/TURNαʔό γάφϦϯάαʔό ࢲͷάϩʔόϧIPΞυϨε ͱϙʔτ൪߸͸ʁ ࢲͷάϩʔόϧIPΞυϨε ͱϙʔτ൪߸͸ʁ
  10. ᶄ 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 ͩΑ!
  11. ᶄ STUN/TRUNΛར༻ͯ͠௨৴ܦ࿏ީิ(ICE Candidate)Λऩ ू͠ɺγάφϦϯάαʔόΛհͯ͠ަ׵͢Δ WebRTCΛ஌Ζ͏! WebRTCΛࢧ͑Δϓϩτίϧ -௨৴ཱ֬ϑϩʔ- NAT NAT Peer

    A Peer B ϓϥΠϕʔτNW άϩʔόϧNW STUNαʔό γάφϦϯάαʔό γάφϦϯάαʔόʹࣗ෼ͷ৘ใ ૹΖɻ͍ͭͰʹ௨৴૬खͷ৘ใڭ ͑ͯ΋Β͓ʂ γάφϦϯάαʔόʹࣗ෼ͷ৘ใ ૹΖɻ͍ͭͰʹ௨৴૬खͷ৘ใڭ ͑ͯ΋Β͓ʂ
  12. ᶄ STUN/TRUNΛར༻ͯ͠௨৴ܦ࿏ީิ(ICE Candidate)Λऩ ू͠ɺγάφϦϯάαʔόΛհͯ͠ަ׵͢Δ WebRTCΛ஌Ζ͏! WebRTCΛࢧ͑Δϓϩτίϧ -௨৴ཱ֬ϑϩʔ- NAT NAT Peer

    A Peer B ϓϥΠϕʔτNW άϩʔόϧNW STUNαʔό γάφϦϯάαʔό Aͱ௨৴͕ͨͬͯ͠ΔBͷ ৘ใૹΔΑ! Bͱ௨৴͕ͨͬͯ͠ΔAͷ ৘ใૹΔΑ!
  13. ᶇ ͦΕͰ΋ܨ͕Βͳ͔ͬͨΒɺTURNαʔόΛܦ༝ͨ͠઀ଓ ΛࢼΈΔ WebRTCΛ஌Ζ͏! WebRTCΛࢧ͑Δϓϩτίϧ -௨৴ཱ֬ϑϩʔ- NAT NAT Peer A

    Peer B ϓϥΠϕʔτNW άϩʔόϧNW TURNαʔό γάφϦϯάαʔό ֎͔Βͷ௨৴Λ؆୯ʹ͸௨͞ͳ͍ͧɻ ※NATʹ͸9छྨͷఆ͕ٛ͋Δ (RFC 5780) NATͷ૊Έ߹ΘͤʹΑͬͯ͸௒͑Εͳ͍ ৔߹͕͋Δ
  14. ᶇ ͦΕͰ΋ܨ͕Βͳ͔ͬͨΒɺTURNαʔόΛܦ༝ͨ͠઀ଓ ΛࢼΈΔ WebRTCΛ஌Ζ͏! WebRTCΛࢧ͑Δϓϩτίϧ -௨৴ཱ֬ϑϩʔ- NAT NAT Peer A

    Peer B ϓϥΠϕʔτNW άϩʔόϧNW TURNαʔό γάφϦϯάαʔό ࠷ऴखஈʂ ࠷ऴखஈʂ ௨৴։࢝ ύέοτதܧ͢Δͧʂ
  15. WebRTCΛ஌Ζ͏! WebRTCΛࢧ͑Δϓϩτίϧ -ICE- ICE Vanilla ICEͱTrickle ICEͷ2छྨ͕ଘࡏ Peer A Peer

    B ϓϥΠϕʔτNW άϩʔόϧNW γάφϦϯάαʔό NAT NAT Vanilla or Trickle?
  16. WebRTCΛ஌Ζ͏! WebRTCΛࢧ͑Δϓϩτίϧ -ICE- Vanilla ICE NAT NAT Peer A Peer

    B P2P௨৴։࢝ SDP ICE Candidate SDP ICE Candidate
  17. WebRTCΛ஌Ζ͏! WebRTCΛࢧ͑Δϓϩτίϧ -ICE- Trickle ICE NAT NAT Peer A Peer

    B ॳظSDP ॳظSDP ICE Candidate ICE Candidate ɾ ɾ ɾ ICE Candidate P2P௨৴։࢝ ICE Candidate ɾ ɾ ɾ
  18. 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 ೥ޙ൒ʹରԠ༧ఆ
  19. WebRTCΛ஌Ζ͏! WebRTCʹར༻͞ΕΔίʔσοΫ Ի੠ίʔσοΫ छྨ ؅ཧ૊৫ ରԠϒϥ΢β ࢀߟ৘ใ Opus IETF Chrome,Firefox,

    Safari,Edge සൟʹར༻͞Ε͍ͯΔ G.711 CCITT Chrome,Firefox Safari,Edge Opusͱൺֱ͠ɺ඼࣭͕௿͍ Ի੠ίʔσοΫͷதͰ΋ࡦఆ͞Εͨͷ͕ඇ ৗʹݹ͍ ͦͷଞɺiLBC,iSAC,G.722Λαϙʔτ͢Δϒϥ΢β΋͋Δ͕ɺOpus͕ओྲྀ
  20. 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()ϝιουͰɺө૾ɾԻ੠Λ࠶ੜ
  21. END