High Performance Browser Networking 輪読会の資料です。
WebRTCHigh Performance BrowserNetworking ྠಡձ@yosuke_furukawa
View Slide
WebRTCWeb Real-Time Communication
ฉ͍ͨ΄͏͕͍͍ͭ
Web x Realtimeͷྺ࢙2005: Ajax ੜ2006: Comet͕Ajaxͱͱʹݟ͞ΕΔ2006: ServerSentEvents ఏҊ։࢝2011: WebSocket͕ग़ͯ͘Δ2012: WebRTC *(new!!)
WebRTCͱ?WebRTCϒϥβ্ͰϦΞϧλΠϜίϛϡχέʔγϣϯʢRTCʣΛՄೳʹ͢ΔΣϒͷͨΊͷϑϨʔϜϫʔΫ!ΣϒͰͷߴ࣭ͳίϛϡχέʔγϣϯͷͨΊԻʗϏσΦνϟοτΞϓϦέʔγϣϯͰར༻͞ΕΔωοτϫʔΫɾԻɾө૾ίϯϙʔωϯτͳͲͷجຊతͳߏཁૉؚ͕·ΕΔ (ࢀߟจݙ: WebRTCͱ͔ษڧձ ͋ΜͲ͏͢͠)
WebRTC͕ఏڙ͢ΔAPI- MediaStream : ԻಈըͷετϦʔϜऔಘ- RTCPeerConnection: Իಈըͷ௨৴- DataChannel: ҙͷΞϓϦέʔγϣϯσʔλͷ௨৴
MediaStream
MediaStreamΛࢧ͑Δٕज़- ԻɾಈըॲཧΤϯδϯ- getUserMedia API
ԻɾಈըॲཧΤϯδϯ
ԻɾಈըॲཧΤϯδϯԻɾಈըॲཧΤϯδϯ͜ͷຊͰઐൣғ֎ɻԻɾಈըॲཧΛ࣮ݱ͢ΔʹɺίʔσοΫɺΤίʔআڈɺϊΠζϦμΫγϣϯɺը૾ิਖ਼ͱ͍ͬͨॲཧΛϒϥβ͕ػೳͱͯ࣋ͭ͠ඞཁ͕͋Δɻ
ԻɾಈըॲཧΤϯδϯ͜Ε͚ͩͷػೳΛ༻ҙ͢Δඞཁ͕͋Δɻ
getUserMedia
getUserMediaԻಈըΛStreamͱͯ͠ड͚औΔJavaScriptͷAPIɻ͜ΕΛMediaStreamͱݺͿɻ͜ΕΛvideoλάʹͤࣗͷಈը࠶ੜɻ͜ΕΛRTCPeerConnectionʹͤWebRTCͷετϦʔϜΛૹΔ͜ͱ͕Մೳɻ
getUserMedia<br/>navigator.getUserMedia = ( navigator.getUserMedia ||<br/>navigator.webkitGetUserMedia ||<br/>navigator.mozGetUserMedia ||<br/>navigator.msGetUserMedia);<br/>var constraints = {<br/>audio: true,<br/>video: true<br/>}<br/>navigator.getUserMedia(constraints, gotStream, logError);<br/>function gotStream(stream) {<br/>var video = document.querySelector('video');<br/>video.src = window.URL.createObjectURL(stream);<br/>video.play();<br/>}<br/>function logError(error) { console.log(error); }<br/>
DEMO
MediaStreamͷ·ͱΊ-ԻɾಈըॲཧΤϯδϯ͕ϒϥβʹଘࡏ͍ͯ͠ΔɺΤίʔɺϊΠζॲཧಈըίʔσοΫͱ͍ͬͨϝσΟΞͷॲཧϒϥβͰ࣮ݱ͞ΕΔ(ศར)ɻ-औಘ͢ΔʹgetUserMediaΛ͏
RTCPeerConnection
RTCPeerConnectionͱP2PଓΛཱ֬ͤ͞ΔͨΊͷॲཧͱͦΕΛҡ࣋͠ଓ͚ΔͨΊͷॲཧΛఏڙ͢Δػೳɻ
RTCPeerConnectionͱP2PଓΛཱ֬ͤ͞ΔͨΊͷॲཧͱͦΕΛҡ࣋͠ଓ͚ΔͨΊͷॲཧΛఏڙ͢Δػೳɻ35$Λߦ͏ͨΊɺ6%1ͰߦΘΕΔɻ 8FCʹ6%1͕ʂ
RTCPeerConnectionͱP2PଓΛཱ֬ͤ͞ΔͨΊͷॲཧͱͦΕΛҡ࣋͠ଓ͚ΔͨΊͷॲཧΛఏڙ͢Δػೳɻ35$1FFS$POOFDUJPO͜͜ͷ
RTCPeerConnection API1. SDP (P2PωΰγΤʔτ࣌ͷσʔλϑΥʔϚοτ)2. ICE protocol (NATΛ͑ͯP2Pଓཱ֬ҡ࣋͢ΔͨΊ)- STUN- TURN3. DTLS (௨৴҉߸Խ)4. SRTP, SCTP (ετϦʔϜଟॏԽɺ੍ޚɺϑϩʔ੍ޚ)
RTCPeerConnection API- RTCPeerConnectionͷͨΊͷAPIࣗମγϯϓϧɹ
RTCPeerConnection API- RTCPeerConnectionͷͨΊͷAPIࣗମγϯϓϧɹΠϯλϑΣʔε35$1FFS$POOFDUJPOɹΛ௨ͯ͠-PDBM3FNPUFTUSFBNTʹଓ͢Δ͚ͩ
RTCPeerConnection API- RTCPeerConnectionͷͨΊͷAPIࣗମγϯϓϧɹͨͩதͰͬͯΔ͜ͱෳࡶ /"5τϥόʔαϧΛߦ͏*$&ϫʔΫϑϩʔཧ ϐΞؒͷࣗಈΩʔϓΞϥΠϒ ϩʔΧϧετϦʔϜͷมԽه ϦϞʔτετϦʔϜͷมԽه ετϦʔϜ࠶ωΰγΤʔγϣϯ ΦϑΝʔੜɺΞϯαʔडྖ"1* ݱࡏͷঢ়ଶϦΫΤετ"1*
P2PଓΛཱ֬ͦͦଓཱ֬ͱ?
P2PଓΛཱ֬ͦͦଓཱ֬ͱ? (HTTPͷ߹)MJTUFOQVCMJD*11035 1VCMJD*11035ΛΫϥΠΞϯτ͕͍ͬͯͯ αʔόʔ͕ଓΛ͍ͬͯͯ ͦ͜ʹଓΛཁٻ͠ʹߦ͘
P2PଓΛཱ֬ͦͦଓཱ֬ͱ? (WebRTCͷ߹)*11035 8FC35$ͷ߹*11035͔Βͳ͍ ͔ͬͨ͠ͱͯ͠૬ख͕ଓΛཁٻͯ͠ΔͱݶΒͳ͍ /"5ʹΑ͔ͬͯΕΔՄೳੑ͋Δػ/"5 /"5
P2PଓΛཱ֬ଓཱ֬͢ΔͨΊʹΔ͜ͱɻ*11035 8FC35$ͷ߹*11035͔Βͳ͍ ͔ͬͨ͠ͱͯ͠૬ख͕ଓΛཁٻͯ͠ΔͱݶΒͳ͍ /"5ʹΑ͔ͬͯΕΔՄೳੑ͋Δػ/"5 /"5
P2PଓΛཱ֬P2Pଓͷ։࢝ҙਤΛ૬खʹ͑ͯɺ౸ணύέοτΛػ͢Δ
P2PଓΛཱ֬P2Pଓͷ։࢝ҙਤΛ૬खʹ͑ͯɺ౸ணύέοτΛػ͢Δ͜ΕΛγάφϦϯάͱ͍͏
P2PଓΛཱ֬WebRTCγάφϦϯάࣗΞϓϦέʔγϣϯʹґଘ͢ΔɻͳͷͰγάφϦϯάͷτϥϯεϙʔτͱϓϩτίϧͷબࣗ༝
SDP
Session DescriptionProtocol
ͭ·Γηογϣϯهड़༻ϓϩτίϧ
Sesssion DescriptionProtocol (SDP)WebRTC༻ͷηογϣϯهड़༻ϓϩτίϧ
Sesssion DescriptionProtocol (SDP)͋·Γҙࣝ͢Δ͜ͱແ͍͕ɺύέοτΩϟϓνϟϨϕϧͰૹ৴͞Ε͍ͯΔ༰͕͔Δɻ
Sesssion DescriptionProtocol (SDP)ηογϣϯهड़͕ަ͞ΕΔͱϝοηʔδͷަ͕ՄೳʹͳΔSDPͰऔಘ͢Δͷ:ετϦʔϜͷλΠϓ(Իɺಈը)ίʔσοΫͳͲͷઃఆ૬खͷIPͱPORT!
ICE
Interactive ConnectionEstablishment
ICEP2P௨৴ͷͨΊʹ͑ͳ͍ͱ͍͚ͳ͍น (NAT͑)ICE͕ఏڙͯ͘͠ΕΔͷ௨৴ܦ࿏ͷཱ֬*11035 8FC35$ͷ߹૬खͷ*11035͔Βͳ͍ ͔ͬͨ͠ͱͯ͠/"5ʹΑ͔ͬͯΕΔՄೳੑ͋Δػ/"5 /"5
ICEP2P௨৴ͷͨΊʹ͑ͳ͍ͱ͍͚ͳ͍น (NAT͑)ICE͕ఏڙͯ͘͠ΕΔͷ௨৴ܦ࿏ͷཱ֬*11035 8FC35$ͷ߹૬खͷ*11035͔Βͳ͍ ͔ͬͨ͠ͱͯ͠/"5ʹΑ͔ͬͯΕΔՄೳੑ͋Δػ/"5 /"5͜ΕΛղܾ͢Δखஈ
ICEͷલʹNATτϥόʔαϧʹ͍͓ͭͯ͞Β͍͓ͯ͘͠ɻ
NATτϥόʔαϧNATʹprivate IP/PORTͱpublic IP/PORTͷΈ߹Θ͕ͤॻ͔Ε͍ͯΔΤϯτϦ͕͋Δɻ
NATτϥόʔαϧNATʹprivate IP/PORTͱpublic IP/PORTͷΈ߹Θ͕ͤॻ͔Ε͍ͯΔΤϯτϦ͕͋Δɻ͜ͷΤϯτϦʹॻ͔Ε͍ͯͳ͍*11035ͷΈ߹Θͤͩͱ/"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ͷ༁ςʔϒϧʹ*11035ͷΛࡌͤΔʹҰ୴/"5͔Β֎ʹϦΫΤετΛ͓͘Δඞཁ͕͋Δɻ
STUNࣗͷIPͱPORT͕֎͔ΒݟΔͱͳΜͳͷ͔͍߹ΘͤΔɻ
STUNࣗͷIPͱPORT͕֎͔ΒݟΔͱͳΜͳͷ͔͍߹ΘͤΔɻ͜͏͢Δ͜ͱͰ/"5ͷ༁ςʔϒϧʹࣗͷ*11035ΛࡌͤΔࣄ͕Ͱ͖Δɻ·ͨ456/͔Βड͚ͨࣗͷ1VCMJD*1ͱ1035Λ ଞͷϐΞʹͤ௨৴͢Δ͜ͱ͕Ͱ͖Δɻ
TURNSTUNΛͬͯଓͰ͖ΔͱݶΒͳ͍ɺͦͦUDPΛϒϩοΫ͢ΔϑΝΠΞΥʔϧ͕͋ͬͨΒ݁ہଓͰ͖ͳ͍ɻͦ͏͍͏࣌ʹ͏ͷ͕TURN
TURNSTUNΛͬͯଓͰ͖ΔͱݶΒͳ͍ɺͦͦUDPΛϒϩοΫ͢ΔϑΝΠΞΥʔϧ͕͋ͬͨΒ݁ہଓͰ͖ͳ͍ɻͦ͏͍͏࣌ʹ͏ͷ͕TURNதؒͷ563/αʔόʔ͕σʔλΛ5$16%1ͰϦϨʔͤ͞Δɻ11Ͱͳ͍͕ɺ ࣮֬ʹͭͳ͕Δɻ
ICEICESTUN/TURNͱ͍ͬͨܦ࿏બΛ࣮ࢪ͢Δ·ͣࣗͷϩʔΧϧ*1Λ04ʹ͍߹ΘͤΔ
ICE456/αʔόʹࣗͷ*11035Λ͍߹ΘͤΔɻ456/
ICE456/ʹܨ͕Βͳ͔ͬͨΒ563/ΛͬͯϦϨʔͤ͞Δ456/✗563/
ICEP2P௨৴ͷͨΊʹ͑ͳ͍ͱ͍͚ͳ͍น (NAT͑)456/ʹܨ͕Βͳ͔ͬͨΒ563/ΛͬͯϦϨʔͤ͞Δ456/✗563/ࣗಈͰ456/ɺ563/ͷΓ͚Λͯ͘͠ΕΔɻศརɻ
ICEICEʹ͕͋Δɻॳظଓʹ͕͔͔࣌ؒΔɻଓܦ࿏͕ܾ·Δ·Ͱ͔͔࣌ؒΓա͗Δɻ456/✗563/
ͦ͜Ͱ Trickle ICE
Trickle ICESTUN, TURNͷީิݕࡧͱಉ࣌ʹγάφϦϯάνϟωϧΛͬͯࣗͷ௨৴ܦ࿏Λૹ৴͠ɺݟ͔ͭͬͨஈ֊ͰͦΕΛ͏ɻSTUN/TURNͷશܦ࿏͕ܾ·ΔͷΛͭඞཁ͕ͳ͍ɻ
Trickle ICESTUN, TURNͷީิݕࡧͱಉ࣌ʹγάφϦϯάνϟωϧΛͬͯࣗͷ௨৴ܦ࿏Λૹ৴͠ɺݟ͔ͭͬͨஈ֊ͰͦΕΛ͏ɻSTUN/TURNͷશܦ࿏͕ܾ·ΔͷΛͭඞཁ͕ͳ͍ɻީิΛݟ͚ͭͳ͕Βಉ࣌ʹγάφϦϯάνϟωϧͰܦ࿏ΛૹΓɺީิ͕ݟ͔͔ͭͬͨΒଓΛࢼΈΔͷͰॳظଓ͕ૣ͘ͳΔɻ
࣮ࡍʹಈ͔ͦ͏DEMOhttp://simplewebrtc.com/demo.html
ͪͳΈʹ
chromeͩͱWebRTCͷ௨৴ঢ়گҎԼͷίϚϯυΛurlϑΥʔϜʹଧͭͱݟΕΔɻchrome://webrtc-internals
DTLS
D (Datagram) + TLS
WebRTCͰɺUDPͷ௨৴Λ҉߸Խ͢ΔͷʹDTLSΛ͍ͬͯΔ
DTLSUDPॱෆಉͰύέϩεΛڐ༰͢Δ͕ɺTLSڐ༰͠ͳ͍ɻDTLS෦Ͱ͜ΕΛ͙ͨΊʹ෦ʹγʔέϯε൪߸ͱϑϥάϝϯτΦϑηοτɺͦͯ͠λΠϜΞτ࣍ͷ࠶ૹͷΈΛఏڙ͍ͯ͠Δɻ
DTLSγʔέϯε൪߸ϑϥάϝϯτΦϑηοτ
DTLSύέοτ࣌ؒʹฦ৴͕ͳ͔ͬͨΒ࠶ૹ
DTLSύέοτ࣌ؒʹฦ৴͕ͳ͔ͬͨΒ࠶ૹ6%1্Ͱಈ͘%5-4͕ͩɺ جຊ5$1ͰͬͯΔ͜ͱʹ͍ۙ
SRTP
Secure Realtime TransportProtocol
SRTPIUUQXXXTMJEFTIBSFOFUJXBTIJXFCSUDNFFUVQS
SRTPUJNFTUBNQTFRVFODFOVNCFSແࢹʂʂ
SRTP4FRVFODF/VNCFSͱ5JNFTUBNQΛ࣋ͭ
SCTP
Stream ControlTransmission Protocol
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ͷ༷ࢠ)
DataChannel
DataChannelϐΞؒͷΞϓϦέʔγϣϯσʔλΛΓͱΓ͢ΔʔͭɻํੑΛ࣋ͭɻͬͱ͜͜·Ͱདྷͨײ͋Δɻ
Μ?
ํੑ?
WebSocket
DataChannel࣮DataChannel APIWebSocket APIͱͦͬ͘Γɺͦͯ͠ҙਤతʹࣅͤͯΔɻ
DataChannelvar 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);};!
WebSocketvar 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);}
WebSocketvar 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 /"5563/ 4JHOBMJOH4FSWFS/"5Λ͑ΔͨΊͷ456/ 563/ɻ*$&"HFOUͰΓ͚ΔɺՄೳͩͬͨΒΛ5SJDLMF*$&Λ͏ɻ84 44&ͷϨΠςϯγͷαʔόʔΛ࡞Δɻଓཱ֬ޙ%BUB$IBOOFM্ͰͷγάφϦϯάΛߦ͏ࣄΛߟྀ͢ΔɻͪΌΜͱଳҬ෯ʹҙ͢ΔɻσʔλͳΔ͘খ͘͢͞ΔɻదͳϝσΟΞ੍ݶΛઃ͚Δɻ%BUB$IBOOFMͷόοϑΝσʔλࢹ͓͖ͯ͠ɺωοτϫʔΫϦϯΫͷঢ়گʹదԠͤ͞Δɻ෦త৴པੑͷ͋Δ৴ͳΒ࠶ૹΧϯτͱλΠϜΞτΛదʹઃఆ͢Δɻ
456//"5 /"5563/ 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/!