QUIC DataChannels: рдкрд╣рд▓реЗ рдЪрд░рдг


QUIC- рдЖрдзрд╛рд░рд┐рдд рдбреЗрдЯрд╛рдЪреИрдирд▓реНрд╕ рдХреЛ рд╡рд░реНрддрдорд╛рди SCTP рдкрд░рд┐рд╡рд╣рди рдХрд╛ рдПрдХ рд╡рд┐рдХрд▓реНрдк рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИред Google WebRTC рдХрд╛рд░реНрдп рд╕рдореВрд╣ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЙрдирдХреЗ рд╕рд╛рде рдкреНрд░рдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реИ:


рдЖрдЗрдпреЗ рдЗрд╕реЗ рднреА рдЖрдЬрдорд╛рддреЗ рд╣реИрдВред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рдЯреЗрдХреНрд╕реНрдЯ рдЯреНрд░рд╛рдВрд╕рдорд┐рд╢рди рдХреЗ рд▓рд┐рдП рдПрдХ рд╡реЗрдмрдЖрд░рдЯреАрд╕реА рдЪреИрдирд▓ рдХреЗ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд╕рдорд╛рди рдПрдХ-рдкреЗрдЬ рдХрд╛ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдмрдирд╛рдПрдВрдЧреЗ - рдпрд╣ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдХрд╛рдо рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рдЙрджрд╛рд╣рд░рдг рд╣реИ (рд╕рд░реНрд╡рд░реЛрдВ рдХреЗ рдмрд┐рдирд╛), рдЬреЛ, рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд╡реЗрдмрдЖрд░рдЯреАрд╕реА рдбрд┐рдЬрд┐рдЯрд▓ рдЪреИрдирд▓ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреА рддреБрд▓рдирд╛ рдХрд░рдирд╛ рдЖрд╕рд╛рди рдмрдирд╛ рджреЗрдЧрд╛ред

рдЖрд░рдВрдн рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ, рдЖрдЗрдП DataChannel рдХреА рдореВрд▓ рдмрд╛рддреЗрдВ рдпрд╛рдж рдХрд░реЗрдВред

рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ DataChannel рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ


WebRTC рдХреЗ рдбреЗрдЯрд╛рдЪреИрдирд▓реНрд╕ рдкреНрд░рддрд┐рднрд╛рдЧрд┐рдпреЛрдВ рдХреЛ рдордирдорд╛рдиреЗ рдбреЗрдЯрд╛ рдХрд╛ рдЖрджрд╛рди-рдкреНрд░рджрд╛рди рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреЗ рд╣реИрдВред рд╡реЗ рджреЛрдиреЛрдВ рд╡рд┐рд╢реНрд╡рд╕рдиреАрдп рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ - рдЬреЛ рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рддреЗ рд╕рдордп рдмрд╣реБрдд рдЙрдкрдпреЛрдЧреА рд╣реЛрддреЗ рд╣реИрдВ - рдФрд░ рдЕрд╡рд┐рд╢реНрд╡рд╕рдиреАрдп, рдЬреЛ рдЦреЗрд▓реЛрдВ рдореЗрдВ рдкрджреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рдХреЗ рд▓рд┐рдП рд╕реНрд╡реАрдХрд╛рд░реНрдп рд╣реИред рдПрдкреАрдЖрдИ RTCPeerConnection рдХрд╛ рдПрдХ рд╡рд┐рд╕реНрддрд╛рд░ рд╣реИ рдФрд░ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ:

 const dc = pc.createDataChannel("some label string"); // ,    тАУ ,   тАУ //    send dc.send("some string"); //    otherPc.addEventListener('datachannel', e => { const channel = e.channel; channel.onmessage = event => { console.log('received', event.data); }); }); 

рдЖрдзрд┐рдХрд╛рд░рд┐рдХ WebRTC рдирдореВрдиреЗ рдкреГрд╖реНрда рдкрд░ рддрд╛рд░ рдФрд░ рдмрд╛рдЗрдирд░реА рдбреЗрдЯрд╛ рднреЗрдЬрдиреЗ рдХреЗ рдЙрджрд╛рд╣рд░рдг рд╣реИрдВред

DataChannel SCTP рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред рдпрд╣ рдСрдбрд┐рдпреЛ рдФрд░ рд╡реАрдбрд┐рдпреЛ рд╕реНрдЯреНрд░реАрдо рдХреЗ рд▓рд┐рдП RTP рдЯреНрд░рд╛рдВрд╕рдкреЛрд░реНрдЯ рдХреЗ рд╕рдорд╛рдирд╛рдВрддрд░ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рдпреВрдбреАрдкреА рдХреЗ рд╡рд┐рдкрд░реАрдд, рдЬреЛ рдЖрдорддреМрд░ рдкрд░ рдСрдбрд┐рдпреЛ рдФрд░ рд╡реАрдбрд┐рдпреЛ рд╕реНрдЯреНрд░реАрдо рджреНрд╡рд╛рд░рд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдПрд╕рд╕реАрдЯреАрдкреА рдХрдИ рдЕрдиреНрдп рд╕реБрд╡рд┐рдзрд╛рдПрдБ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ, рдЬреИрд╕реЗ рдПрдХрд▓ рдХрдиреЗрдХреНрд╢рди рдпрд╛ рд╡рд┐рд╢реНрд╡рд╕рдиреАрдп рдкрд░ рдорд▓реНрдЯреАрдкреНрд▓реЗрдХреНрд╕рд┐рдВрдЧ рдЪреИрдирд▓, рдЖрдВрд╢рд┐рдХ рд░реВрдк рд╕реЗ рд╡рд┐рд╢реНрд╡рд╕рдиреАрдп (рдпрд╛рдиреА рд╡рд┐рд╢реНрд╡рд╕рдиреАрдп, рд▓реЗрдХрд┐рди рдЕрд╡реНрдпрд╡рд╕реНрдерд┐рдд) рдФрд░ рдЕрд╡рд┐рд╢реНрд╡рд╕рдиреАрдп рдореЛрдбред

Google рдиреЗ 2012 рдореЗрдВ QUIC рдкреЗрд╢ рдХрд┐рдпрд╛ (рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдЗрддрд┐рд╣рд╛рд╕ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдФрд░ рдЗрд╕рдХреА рдмрд╛рд░реАрдХрд┐рдпреЛрдВ рдХреЛ рд╣рдорд╛рд░реА рдЕрдиреНрдп рд╕рд╛рдордЧреНрд░реА - рдЕрдиреБрд╡рд╛рджрдХ рдХреЗ рдиреЛрдЯ рдореЗрдВ рдкрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ)ред WebRTC рдХреА рддрд░рд╣, QUIC рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХреЛ IETF рдХреЗ рд╡рд┐рдВрдЧ рдХреЗ рддрд╣рдд рднреА рд▓рд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рдФрд░ рдЕрдм HTTP / 3 рд╣реИ ред QUIC рдореЗрдВ рдХрдИ рдорд╣рд╛рди рдирд╡рд╛рдЪрд╛рд░ рд╣реИрдВ, рдЬреИрд╕реЗ: рдХрдо рд╡рд┐рд▓рдВрдмрддрд╛, рднреАрдбрд╝ рдирд┐рдпрдВрддреНрд░рдг рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдмреИрдВрдбрд╡рд┐рдбреНрде рдЧрдгрдирд╛, рдкреНрд░рддреНрдпрдХреНрд╖ рджреЗрд░реА рд╕реБрдзрд╛рд░ (FEC) рдФрд░ рддреЗрдЬреА рд╕реЗ рд░реЛрд▓рд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЕрдВрддрд░рд┐рдХреНрд╖ (рдХрд░реНрдиреЗрд▓ рдХреЗ рдмрдЬрд╛рдп) рдореЗрдВ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрдиред

QUIC WebRTC рдХреЗ рд▓рд┐рдП RTCP рдХрд╛ рд╡рд┐рдХрд▓реНрдк рд╣реЛ рд╕рдХрддрд╛ рд╣реИ - рдЬреИрд╕реЗ DataChannel рдХреЗ рд▓рд┐рдП рдкрд░рд┐рд╡рд╣рдиред рд╡рд░реНрддрдорд╛рди рдкреНрд░рдпреЛрдЧ ICCP рдкрд░рд┐рд╡рд╣рди рдХреЗ рдПрдХ рдЕрд▓рдЧ рд╕рдВрд╕реНрдХрд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ RTCPeerConnection API ( рдФрд░ SDP! ) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╕реЗ рдмрдЪрдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд░рд╣рд╛ рд╣реИред рдЗрд╕реЗ рдПрдХ рдЖрднрд╛рд╕реА рдХрдиреЗрдХреНрд╢рди рдХреЗ рд░реВрдк рдореЗрдВ рд╕реЛрдЪреЗрдВ рдЬреЛ рдереЛрдбрд╝реА рд╕реБрд░рдХреНрд╖рд╛ рдФрд░ рдмрд╣реБрдд рд╕реЗ рдПрдирдПрдЯреА рдЯреНрд░реИрд╡рд░реНрд╕рд▓ рдЬреЛрдбрд╝рддрд╛ рд╣реИред

рдиреАрдЪреЗ рджрд┐рдП рдЧрдП рд╡реАрдбрд┐рдпреЛ рдореЗрдВ, рдХреНрд░реЛрдо рдиреЗрдЯрд╡рд░реНрдХрд┐рдВрдЧ рдЯреАрдо рдХреЗ рдЗрдпрд╛рди рд╕реНрд╡рд┐рдЯ рдЗрд╕ рдЕрд╡рдзрд╛рд░рдгрд╛ рдХреЛ рдмрддрд╛рддреЗ рд╣реИрдВред рдФрд░ рдпрджреНрдпрдкрд┐ рдпрд╣ рднрд╛рд╖рдг рдХрдИ рд╕рд╛рд▓ рдкреБрд░рд╛рдирд╛ рд╣реИ, рдлрд┐рд░ рднреА рдпрд╣ рд╡рд┐рд╖рдп рдкрд░ рдЕрддрд┐рд░рд┐рдХреНрдд рдЬрд╛рдирдХрд╛рд░реА рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ:


QUIC рдХреЗ рд╕рд╛рде рдкрд╣рд▓рд╛ рдХрджрдо


рд╕реМрднрд╛рдЧреНрдп рд╕реЗ, 2015 рдХреЗ рд▓реЗрдЦ рдХреЗ рдЕрдзрд┐рдХрд╛рдВрд╢ рдХреЛрдб рдкреНрд░рд╛рд╕рдВрдЧрд┐рдХ рдмрдиреЗ рд╣реБрдП рд╣реИрдВ рдФрд░ рдЖрд╕рд╛рдиреА рд╕реЗ рдирдП рдПрдкреАрдЖрдИ рдХреЗ рд▓рд┐рдП рдЕрдиреБрдХреВрд▓ рд╣реИрдВред рдЪрд▓рд┐рдП рдЗрд╕рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рддреЗ рд╣реИрдВред

рдпрд╣рд╛рдБ рд╕реЗ рдХреЛрдб рдХреНрд▓реЛрди рдХрд░реЗрдВ рдпрд╛ рдЗрд╕реЗ рдпрд╣рд╛рдБ рдЖрдЬрд╝рдорд╛рдПрдБред рдХреГрдкрдпрд╛ рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдкреНрд░рдпреЛрдЧ рдХреЛ рд╕реНрдерд╛рдиреАрдп рд╕реНрддрд░ рдкрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреНрд░реЛрдо (рд╕рдВрд╕реНрдХрд░рдг 73+ рдЕрдм рдХреИрдирд░реА рд╣реИ) рдХреЛ рд╡рд┐рд╢реЗрд╖ рдЭрдВрдбреЗ рдХреЗ рд╕рд╛рде рдЪрд▓рд╛рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП:

 google-chrome-unstable --enable-blink-features=RTCQuicTransport,RTCIceTransportExtension 

ICE рдкрд░рд┐рд╡рд╣рди рд╕реЗрдЯрдЕрдк


RTCIceTransport рд╡рд┐рдирд┐рд░реНрджреЗрд╢ ORTC рдкрд░ рдЖрдзрд╛рд░рд┐рдд рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╕реЗрдЯрдЕрдк рдкреБрд░рд╛рдиреЗ рдХреЛрдб рдХреЗ рд╕рдорд╛рди рд╣реИ:

 const ice1 = new RTCIceTransport(); ice1.onstatechange = function() { console.log('ICE transport 1 state change', ice1.state); }; const ice2 = new RTCIceTransport(); ice2.onstatechange = function() { console.log('ICE transport 2 state change', ice2.state); }; //  ICE- ice1.onicecandidate = function(evt) { console.log('1 -> 2', evt.candidate); if (evt.candidate) { ice2.addRemoteCandidate(evt.candidate); } }; ice2.onicecandidate = function(evt) { console.log('2 -> 1', evt.candidate); if (evt.candidate) { ice1.addRemoteCandidate(evt.candidate); } }; //  ICE- ice1.start(ice2.getLocalParameters(), 'controlling'); ice2.start(ice1.getLocalParameters(), 'controlled'); ice1.gather(iceOptions); ice2.gather(iceOptions); 

рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдЗрд╕ API рдореЗрдВ ORTC рдХреЗ рд╡рд┐рдкрд░реАрдд RTCIceGatherer рдирд╣реАрдВ рд╣реИред рдХреНрдпреЛрдВрдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЖрдИрд╕реАрдИ рдкрд░рд┐рд╡рд╣рди рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд╕рдм рдХреБрдЫ рд╣реИред

QUIC рдкрд░рд┐рд╡рд╣рди рдХреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рдирд╛


 const quic1 = new RTCQuicTransport(ice1); quic1.onstatechange = function() { console.log('QUIC transport 1 state change', quic1.state); }; const quic2 = new RTCQuicTransport(ice2); quic2.onstatechange = function() { console.log('QUIC transport 2 state change', quic2.state); }; //     QUIC quic2.addEventListener('quicstream', (e) => { console.log('QUIC transport 2 got a stream', e.stream); receiveStream = e.stream; }); 

рдпрд╣рд╛рдВ, рдкреНрд░рдорд╛рдгрдкрддреНрд░ рд╡рд┐рдирд┐рд░реНрджреЗрд╢ рдЖрдзрд╛рд░рд┐рдд рдкреНрд░рдорд╛рдгреАрдХрд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рд╡рд┐рдирд┐рд░реНрджреЗрд╢ рд╕реЗ рдкреНрд░рд╕реНрдерд╛рди рдХрд░рддрд╛ рд╣реИред рдЗрд╕рдХреЗ рдмрдЬрд╛рдп, рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рдХреБрдВрдЬреА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬреИрд╕рд╛ рдХрд┐ Google рдбреЗрд╡рд▓рдкрд░реНрд╕ рдкреЛрд╕реНрдЯ рдХрд╣рддрд╛ рд╣реИ :
RTCQuicTransport рдХрдиреЗрдХреНрд╢рди рдХреЛ API рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рдХреБрдВрдЬреА рд╕реЗ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдореВрд▓ рдорд╛рдиреНрдпрддрд╛ рдХреЛ рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рд╣рдо рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдЗрд╕ рдПрдкреАрдЖрдИ рдХреЗ рд▓рд┐рдП рдпреЛрдЬрдирд╛ рдирд╣реАрдВ рдмрдирд╛рддреЗ рд╣реИрдВред рдЗрд╕реЗ рд╕реНрд╡-рд╣рд╕реНрддрд╛рдХреНрд╖рд░рд┐рдд рдкреНрд░рдорд╛рдгрдкрддреНрд░реЛрдВ рдХреЛ рдорд╛рдиреНрдп рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рджреВрд░рд╕реНрде рдкреНрд░рдорд╛рдгрдкрддреНрд░ рд╕рдВрдХреЗрдд рджреНрд╡рд╛рд░рд╛ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ - рдЬрдм QUIC рдХреНрд░реЛрдорд┐рдпрдо рдореЗрдВ рдЗрд╕рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд░рддрд╛ рд╣реИред
рдЕрдм рддрдХ, рдЗрддрдирд╛ рдЕрдЪреНрдЫрд╛ред

рдбреЗрдЯрд╛ рднреЗрдЬрдиреЗ рдФрд░ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП QUICStream


QUICStream рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ WebRTC DataChannel рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдереЛрдбрд╝рд╛ рдкреЗрдЪреАрджрд╛ рд╣реИред WHATWG рд╡рд░реНрдХрд┐рдВрдЧ рдЧреНрд░реБрдк рджреНрд╡рд╛рд░рд╛ рдмрдирд╛рдИ рдЧрдИ рд╕реНрдЯреНрд░реАрдо API ( MDN рдкрд░ рд╡рд┐рд╡рд░рдг рджреЗрдЦреЗрдВ ) рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рд▓реЗрдХрд┐рди рд▓рд╛рдЧреВ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ ред

QUIC рдкрд░рд┐рд╡рд╣рди "рдХрдиреЗрдХреНрдЯреЗрдб" рд╕реНрдерд┐рддрд┐ рдореЗрдВ рдЬрд╛рдиреЗ рдХреЗ рдмрд╛рдж рд╣реА рд╣рдо sendStream рдмрдирд╛рддреЗ рд╣реИрдВ - рдПрдХ рдЕрд▓рдЧ рд╕реНрдерд┐рддрд┐ рдореЗрдВ рдпрд╣ рдПрдХ рддреНрд░реБрдЯрд┐ рдХрд╛ рдХрд╛рд░рдг рд╣реЛрдЧрд╛:

 quic1.onstatechange = function() { console.log('QUIC transport 1 state change', quic1.state); if (quic1.state === 'connected' && !sendStream) { sendStream = quic1.createStream('webrtchacks'); //   createDataChannel. document.getElementById('sendButton').disabled = false; document.getElementById('dataChannelSend').disabled = false; } }; 

рдлрд┐рд░ рд╣рдо рд╣реИрдВрдбрд▓рд░ рдХреЛ рд╕рдмрдорд┐рдЯ рдмрдЯрди рдФрд░ рдЗрдирдкреБрдЯ рдлрд╝реАрд▓реНрдб рд╕реЗ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ: рдмрдЯрди рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рдЗрдирдкреБрдЯ рдлрд╝реАрд▓реНрдб рд╕реЗ рдЯреЗрдХреНрд╕реНрдЯ рдХреЛ Uint8Array рдореЗрдВ рдЗрдирдХреЛрдб рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рд╕реНрдЯреНрд░реАрдо рдХреЛ рд▓рд┐рдЦрд╛ рдЬрд╛рддрд╛ рд╣реИ:

 document.getElementById('sendButton').onclick = () => { const rawData = document.getElementById('dataChannelSend').value; document.getElementById('dataChannelSend').value = ''; //  Uint8Array. ,       TextEncoder. const data = encoder.encode(rawData); sendStream.write({ data, }); }; 

рдкрд╣рд▓реА рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐ рджреВрд░рд╕реНрде onquicstream рдЯреНрд░рд╛рдВрд╕рдкреЛрд░реНрдЯ рдкрд░ onquicstream рдШрдЯрдирд╛ рдХреЛ рдЯреНрд░рд┐рдЧрд░ рдХрд░реЗрдЧреА:

 //     QUIC quic2.addEventListener('quicstream', (e) => { console.log('QUIC transport 2 got a stream', e.stream); receiveStream = e.stream; receiveStream.waitForReadable(1) .then(ondata); }); 

... рдФрд░ рдлрд┐рд░ рд╣рдо рдбреЗрдЯрд╛ рдХреЗ рдкрдардиреАрдп рд╣реЛрдиреЗ рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░рддреЗ рд╣реИрдВ:
 function ondata() { const buffer = new Uint8Array(receiveStream.readBufferedAmount); const res = receiveStream.readInto(buffer); const data = decoder.decode(buffer); document.getElementById('dataChannelReceive').value = data; receiveStream.waitForReadable(1) .then(ondata); } 

receiveStream рд╕рднреА рдбреЗрдЯрд╛ рдХреЛ receiveStream рдЬрд╛рдПрдЧрд╛, рдкрд╛рда рдореЗрдВ рдбрд┐рдХреЛрдб рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ рдФрд░ рдЖрдЙрдЯрдкреБрдЯ рдлрд╝реАрд▓реНрдб рдореЗрдВ рд░рдЦрд╛ рдЬрд╛рдПрдЧрд╛ред рдФрд░ рдЗрд╕рд▓рд┐рдП рд╣рд░ рдмрд╛рд░ рдкрдардиреАрдп рдбреЗрдЯрд╛ рджрд┐рдЦрд╛рдИ рджреЗрддрд╛ рд╣реИред

рдирд┐рд╖реНрдХрд░реНрд╖ рдФрд░ рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ


рдореБрдЭреЗ рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рдпрд╣ рдЙрджрд╛рд╣рд░рдг Google рдмреНрд▓реЙрдЧ рдкрд░ рд╕рдорд╛рди рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рд╕рдордЭрдиреЗ рдореЗрдВ рдЖрд╕рд╛рди рд╣реИред рдпрд╣ рд╡рд┐рдзрд┐ рдкреА 2 рдкреА рдХрдиреЗрдХреНрд╢рди рдХреЗ рд▓рд┐рдП рд╢рд╛рдпрдж рд╣реА рдЙрдкрдпреБрдХреНрдд рд╣реИ, рдПрд╕рд╕реАрдЯреАрдкреА рдкрд░ рдбреЗрдЯрд╛рдЪреИрди рдЙрдирдХреЗ рд▓рд┐рдП рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдареАрдХ рдХрд░ рд░рд╣рд╛ рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдпрд╣ рджреВрд╕рд░реЗ рдЫреЛрд░ рдкрд░ рдПрдХ QUIC рд╕рд░реНрд╡рд░ рдХреЗ рд╕рд╛рде рд╡реЗрдм рд╕реЙрдХреЗрдЯ рдХреЗ рд▓рд┐рдП рдПрдХ рджрд┐рд▓рдЪрд╕реНрдк рд╡рд┐рдХрд▓реНрдк рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдРрд╕рд╛ рд╣реЛрдиреЗ рддрдХ, рдЖрдкрдХреЛ рдЕрд╡рд┐рд╢реНрд╡рд╕рдиреАрдп рдФрд░ рдЕрд╡реНрдпрд╡рд╕реНрдерд┐рдд рдЪреИрдирд▓реЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХрд╛ рдПрдХ рдЕрдЪреНрдЫрд╛ рддрд░реАрдХрд╛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред рдореЗрд░реА рд░рд╛рдп рдореЗрдВ, рдЙрдкрд░реЛрдХреНрдд рдкреЛрд╕реНрдЯ рдХреЗ рд╕реБрдЭрд╛рд╡ рдлреИрд╕рд▓реЛрдВ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рд╣реИрдХ рдХреА рддрд░рд╣ рдЕрдзрд┐рдХ рджрд┐рдЦрддреЗ рд╣реИрдВред

рдпрд╣ рднреА рд╕реНрдкрд╖реНрдЯ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХрд┐рд╕ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХрд╛ рдмрд╛рд╣рд░ рд╕реЗ рдЗрдВрддрдЬрд╛рд░ рдХрд░ рд░рд╣реЗ рд╣реИрдВред "рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╢реЙрд░реНрдЯрдХрдЯ рдлрд┐рд░ рд╕реЗ рдмрдирд╛рдиреЗ рдХреЗ рдмрдЬрд╛рдп рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╡рд┐рдирд┐рд░реНрджреЗрд╢ рдХрд╛ рдкрд░рд┐рдЪрдп рджреЗрдВ, рдЬреЛ рдХрдИ рд╡рд░реНрд╖реЛрдВ рддрдХ рд╣рдорд╛рд░реЗ рд╕рд╛рде рд░рд╣реЗрдЧрд╛," рдпрд╣ рдмрд╣реБрдд рд╕реНрдкрд╖реНрдЯ рд▓рдЧрддрд╛ рд╣реИред рд╕рд╛рде рд╣реА, рд╕рдореБрджрд╛рдп рдХреА рд╕рд╛рдорд╛рдиреНрдп рд░рд╛рдп WHATWG рдзрд╛рд░рд╛рдУрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреА рд╣реИ, рдЬреЛ рдПрдХ рдЕрдЬреАрдм рдкреНрд░рдХрд╛рд╢ рдбреЗрд╡рд▓рдкрд░реНрд╕ рдореЗрдВ рдбрд╛рд▓рддреА рд╣реИ рдЬреЛ рдбреЗрдЯрд╛ рдкрдврд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рдПрдкреАрдЖрдИ рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╣рддреЗ рд╣реИрдВред

рдореИрдВ рдХреНрд░реЛрдорд┐рдпрдо рдореЗрдВ SCTP рдХреЛ рдЕрддрд┐рд░рд┐рдХреНрдд рд╕реБрд╡рд┐рдзрд╛рдПрдБ рднреА рдЪрд╛рд╣реВрдВрдЧрд╛ред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, DataChannel рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдпрд╣ рдХреНрд╡реЗрд░реА - рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рдореВрд▓реНрдпрд╛рдВрдХрд┐рдд, рддреАрди рд╡рд░реНрд╖реЛрдВ рддрдХ рд▓рдЧрднрдЧ рдЕрдЫреВрддреА рд░рд╣реА рд╣реИред рдпрд╣ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╕реНрдкрд╖реНрдЯ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдХреНрдпреЛрдВ SCIC рдХрд╛рд░реНрдпреЛрдВ рдкрд░ рдЕрднреА рднреА QUIC рдкрд░ рдзреНрдпрд╛рди рдХреЗрдВрджреНрд░рд┐рдд рд╣реИ; рд╣рд╛рд▓рд╛рдБрдХрд┐, рдпрд╣ рдХрд┐рд╕реА рдХреЛ рднреА QUIC рдФрд░ рдкрд░рд┐рдгрд╛рдореЛрдВ рдкрд░ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░рдиреЗ рд╕реЗ рдирд╣реАрдВ рд░реЛрдХрдирд╛ рдЪрд╛рд╣рд┐рдПред

Voximplant рджреНрд╡рд╛рд░рд╛ рдЯрд┐рдкреНрдкрдгреА


рд╣рдорд╛рд░реЗ рд╕рд╛рдордиреЗ рдХреА рдУрд░ рд▓реАрдб рд╢рдмреНрдж рдХреЗ рд▓рд┐рдП рдПрдХ рд╢рдмреНрдж:
рд▓рдВрдмреЗ рд╕рдордп рд╕реЗ, рд╣рдорд╛рд░реЗ рдПрд╕рдбреАрдХреЗ рдХрд╛ рдЙрдкрдпреЛрдЧ рд╡реЗрдм рд╕реЙрдХреЗрдЯ рдХреЛ рд╕рдВрдХреЗрдд рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдпрд╣ рдПрдХ рдЙрддреНрдХреГрд╖реНрдЯ, рд╕рдордп-рдкрд░реАрдХреНрд╖рдгрд┐рдд рдорд╛рдирдХ рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕рдХреЗ рд╕рд╛рде рдХреБрдЫ рд╕рдорд╕реНрдпрд╛рдПрдВ рд╣реИрдВред рдкрд╣рд▓рд╛ рд╣реИ рдЯреАрд╕реАрдкреАред рдФрд░ рдЯреАрд╕реАрдкреА рдореЛрдмрд╛рдЗрд▓ рдиреЗрдЯрд╡рд░реНрдХ рдкрд░ рдЕрдЪреНрдЫрд╛ рдФрд░ рддреЗрдЬрд╝ рдирд╣реАрдВ рд╣реИ, рд╕рд╛рде рд╣реА рдпрд╣ рдиреЗрдЯрд╡рд░реНрдХ рдХреЗ рдмреАрдЪ рдШреВрдордиреЗ рдХрд╛ рд╕рдорд░реНрдерди рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рджреВрд╕рд░реЗ, рдпрд╣ рдЕрдХреНрд╕рд░ рдкрд╛рдард╛рддреНрдордХ рд╣реЛрддрд╛ рд╣реИ (рдПрдХ рджреНрд╡рд┐рдЖрдзрд╛рд░реА рдореЛрдб рднреА рд╣реИ, рд▓реЗрдХрд┐рди рдЖрдк рд╢рд╛рдпрдж рд╣реА рдХрднреА рдЗрд╕реЗ рджреЗрдЦрддреЗ рд╣реИрдВ)ред

рд╣рдордиреЗ рд╣рд╛рд▓ рд╣реА рдореЗрдВ DataChannel рдкрд░ рд╕рд┐рдЧреНрдирд▓рд┐рдВрдЧ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХрд╛ рдПрдХ рдмрдВрдж рдмреАрдЯрд╛ рдкрд░реАрдХреНрд╖рдг рд╢реБрд░реВ рдХрд┐рдпрд╛ рд╣реИред рдпрд╣ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рднреА рдЗрд╕рдХреЗ minuses рдХреЗ рдмрд┐рдирд╛ рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдЪреВрдВрдХрд┐ рдпрд╣ рдЦрд░рд╛рдм рдиреЗрдЯрд╡рд░реНрдХ рдореЗрдВ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЬрдм рдШреВрдорддреЗ рд╣реИрдВ, рддреЛ рдпрд╣ рдкрд╣рд▓реА рдирдЬрд░ рдореЗрдВ рдЬреАрдд рдЬрд╛рддрд╛ рд╣реИред рдХреНрдпрд╛ рдЖрдкрдиреЗ рдиреЗрдЯрд╡рд░реНрдХ рдмрджрд▓рд╛ рд╣реИ? рдХрдиреЗрдХреНрд╢рди рдХреЛ рдлрд┐рд░ рд╕реЗ рдмрдирд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред рдЬреНрдпрд╛рджрд╛рддрд░ рдорд╛рдорд▓реЛрдВ рдореЗрдВ ICE Restart рдпрд╛рддрд╛рдпрд╛рдд рдХреЗ рд▓рд┐рдП рдПрдХ рдирдпрд╛ рд░рд╛рд╕реНрддрд╛ рдЦреЛрдЬрдиреЗ рдореЗрдВ рдорджрдж рдХрд░реЗрдЧрд╛ред рд▓реЗрдХрд┐рди, рдЬреИрд╕рд╛ рдХрд┐ рдореИрдВрдиреЗ рдХрд╣рд╛, рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдореЗрдВ рдЕрднреА рднреА рдХрдорд┐рдпрд╛рдВ рд╣реИрдВ: рд╕рднреА рдмреНрд░рд╛рдЙрдЬрд╝рд░ рд╕рднреА рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдХрд╛ рд╕рдорд░реНрдерди рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ, рдЬреИрд╕реЗ рдХрд┐ рдЧрд╛рд░рдВрдЯреАрдХреГрдд рд╡рд┐рддрд░рдг рдФрд░ рдкреИрдХреЗрдЯ рдСрд░реНрдбрд░ рд╕рдорд░реНрдерди; рдпрд╣ рднреА рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдмреЙрдХреНрд╕ рд╕реЗ рдмрд╛рд╣рд░ рдкрд╛рда рдореЛрдб рдХреЗ рд▓рд┐рдП gzip рдХрд╛ рд╕рдорд░реНрдерди рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдЗрди рд╕рднреА рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЛ рдЖрд╡реЗрджрди рдкрдХреНрд╖ рдореЗрдВ рд╣рд▓ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

Source: https://habr.com/ru/post/hi441168/


All Articles