áááá«ááºáž
áá»áœááºáá±á¬áºááá¯á·áá²á·áá¯áá¹ááá®
áááºážáá¡ááá®áá±ážááŸááºážáá¥ááá¬áá
áºáá¯á¡áá±ááŒáá·áºá áá»áœááºá¯ááºááá¯á·ááẠáá»á¬ážá
áœá¬áá±á¬áá
á¬ážáá°ááááºážáá
áºáá¯ááᯠáááºááá¯á·áááºááẠáá¯á¶ážááŒááºááŒá®áž ááœá±ážáá»ááºáá²á·áááºá
Teeworlds ááá±á¬ááºáá¬ááœáẠáá¯ááºáá±á¬ááºáá±áááºá
á
ááºážáááºááẠá€ááá±á¬áá»ááºááᯠá¡áá¯á¶ážááŒá¯ááẠáá¯á¶ážááŒááºáá²á·áááºá ááœááºáááºáá¯ááºááᯠáááºááá¯á· áááºáá±á¬ááºááŒááºážá¡ááœáẠáá±áá¯áá»ááŒá±ááŸááºážáá»ááº. áááºážááᯠáá»á¬ážáá±á¬á¡á¬ážááŒáá·áº á¡á±á¬ááºáá«áááºážáááºážáá»á¬ážááŒáá·áº áá¯ááºáá±á¬ááºáááº-
- XMLHttpRequest/fetchááœááºáááºá¡ááá¯ááºážááœáẠHTTP áá±á¬ááºážááá¯ááŸá¯áá»á¬ážáᬠáá«áááºáá±áá«á ááá¯á·ááá¯ááº
- WebSockets áá»á¬áž.
ááŒá±ááŸááºážáá»ááºááŸá
áºáá¯áá¯á¶ážááẠáá¬áá¬áááºááŒááºážááœáẠáá¬áá¬á¡á
áááºá¡ááá¯ááºážááᯠáááºáá¶áá±á¬ááºááœááºáá±ážááẠááá¯á¡ááºááŒá®áž áááºáá°ááá¯á·áá±á¬ááºáá±ážáááá¯ááá¯áá±á¬á¡ááŒá
Ạá¡áá¯á¶ážááŒá¯áááºáááºáž ááœáá·áºáááŒá¯áá«á
áááááááºážáááºážááŸááá«ááẠ- ááá±á¬ááºáá¬ááŸááœááºáááºááá¯á¡áá¯á¶ážááŒá¯áá«á
ááá¯á·áá±á¬áºá áááºážááẠáá±á¬ááºáááºá¡áááºá¡áá²áá
áºáá¯ááŸáá·áº áá¬áá«áááº- WebRTC ááœááºáá°ááŸá
áºáŠáž áááºááœááºááŸá¯áááŒá¯áá®á áááºážááá¯á·ááẠáá»áááºáááºááẠá¡áá±á¬áºáá±áž ááŸá¯ááºááœá±ážáá±á¬ áááºááœá²ááŸá¯ááºáááºááŸá¯áá
áºáᯠáá¯ááºáá±á¬ááºááẠááá¯á¡ááºááŒá®áž ááŒááºáá¡ááœá²á·á¡á
ááºážáá»á¬ážá
áœá¬ (á¡áá»ááºááŒááŒááºáž áá¬áá¬áá
áºáá¯ááŸáá·áº áá
áºáᯠááá¯á·ááá¯áẠáá
áºáá¯áááºááá¯áá±á¬ áá¬áá¬áá»á¬áž ááá¯á¡ááºáá«áááºá
á¡áá±á¬ááºážáá¯á¶ážááá±á¬á·á áá»áœááºá¯ááºááá¯á·ááẠWebRTC á¡ááœááºážááœáẠá¡áá¯á¶ážááŒá¯ááá·áº ááœááºááẠAPI áá áºáá¯ááᯠáááºáá®ážááá¯áááºá ááá¯á·áá±á¬áº áá»áááºáááºááŸá¯áá áºáá¯ááᯠáááºáá±á¬ááºááẠáááá¯á¡ááºáá±á¬ UDP Sockets á¡ááºáá¬áá±á·á áºááŸáá·áº á¡áá®ážá ááºáá¯á¶ážááŒá áºáááºá
áááºážááẠáá»áœááºá¯ááºááá¯á·á¡á¬áž á¡ááá®áá±ážááŸááºážáá¯ááºááœáẠááŸá¯ááºááœá±ážáá±á¬á¡áá±ážá áááºá¡áá»ááºá¡áááºáá»á¬ážááᯠáá¯ááºááŒáááºáááá¯áá² WebRTC á á¡ááœáá·áºáá±á¬ááºážááᯠááá°ááá¯ááºáááºááŒá áºáááºá
á¡áááºážáá¯á¶áž WebRTC
WebRTC ááẠá¡áá¶á áá®áá®ááᯠááŸáá·áº ááááºááŸááºáá¬ážáá±á¬ áá±áá¬áá»á¬ážááᯠááœááºáá°ááŸááœááºáá°á¡áá»ááºážáá»ááºáž áá¯ááºááœáŸáá·áºáá±ážááá·áº ááá±á¬ááºáá¬áá»á¬ážááœáẠáááŸáááá¯ááºáá±á¬ API á¡á á¯áá áºáá¯ááŒá áºáááºá
áá¯ááºáá±á¬áºááá¯ááºáááºáá»á¬ážá¡ááŒá¬áž áá»áááºáááºááŸá¯ááᯠICE áá¯áá±á«áºáá±á¬ ááá¹ááá¬ážáá áºáá¯ááŸáá áºááá·áº STUN ááŸáá·áº/ááá¯á·ááá¯áẠááŸáá·áºááá·áºáá¬áá¬áá»á¬ážááᯠá¡áá¯á¶ážááŒá¯á (áá áºáááºááœáẠNAT ááŸááá»áŸááºáááº) (ááŸá áºáááºá áá¯á¶ážááœáẠNAT ááŸááá»áŸááºáááº) áááºáá±á¬ááºáá¬ážáááºá ááœááºáá°áá»á¬ážááẠSDP áááá¯ááá¯áá±á¬á áááºážááŸááºážáá»ááºááŸáá·áº á¡ááŒá±ááŸáá áºááá·áº ICE á¡áá»ááºá¡áááºááŸáá·áº áá»ááºáááºáá±á¬ááºáá»á¬ážááᯠáááŸááºááŒáááºá
á¡ááá¯! áá áºááŒáááºááœáẠá¡ááá¯áá±á¬ááºáááºáá»áŸááŸáááááºážá á€á¡áá¯á¶ážá¡ááŸá¯ááºážáá»á¬áž áá¬ááá¯ááá¯ááá¯áááºááᯠá¡ááá¯áá»á¯á¶ážááŸááºážááŒááŒáá«á áá¯á·á
NAT á¡ááœáẠSession Traversal Utilities (STUN) - NAT ááá¯áá»á±á¬áºááŒááºáᬠhost ááŸáá·áº data ááá¯ááºááá¯ááºáááŸááºáááºá¡ááœááºá¡ááœá² (IPá port) ááá°ááŒááºážá¡ááœáẠprotocol áá áºáá¯á áááááá¬áááºááᯠááŒá®ážááŒá±á¬ááºá¡á±á¬áẠá á®áá¶ááá¯ááºáá»áŸáẠááœááºáá°áá»á¬ážááẠá¡áá»ááºážáá»ááºáž ááœááºáááºá áœá¬ áá±áá¬áááŸááºááá¯ááºáááºáNAT á¡áá®ážáááá¯ááºááŸá Relay áá»á¬ážááᯠá¡áá¯á¶ážááŒá¯á ááŒááºáááºážááŒááºážá (áááºáááº) NAT traversal á¡ááœááºáááºáž á¡áá¯á¶ážááŒá¯ááẠá ááá¯á·áá±á¬áº ááœááºáá° ááŸá áºáŠážá áá¯á¶áž ááŒááºááá¯ááºáá±á¬ proxy ááŸáááá·áº áá±áᬠáá±ážááá¯á·ááŒááºážááŒáá·áº áááºážááᯠá¡áá±á¬ááºá¡ááẠáá±á¬áºáá«áááºá áááºážááẠlatency ááá¯áááºáá±á¬ááºážááŒá®áž STUN áááºá¡áá±á¬ááºá¡áááºáá±á¬áºááẠááá¯áá á»á±ážááŒá®ážááẠ(áááºážááá¯áááºááœááºáá±ážá ááºááŸááºáá áºáá¯áá¯á¶ážááœááºá¡áá¯á¶ážááŒá¯áá¬ážáá±á¬ááŒá±á¬áá·áº)á ááá¯á·áá±á¬áº áá áºáá«áá áºáá¶ááœááºáááºážáááºáá áºáá¯áááºážáá±á¬ááœá±ážáá»ááºááŸá¯ááŒá áºáááºáá¡ááŒááºá¡ááŸáẠáááºááœááºáá»áááºáááºááŸá¯ áááºáá±á¬ááºááŒááºážá (ICE) áááºáá°ááœááºáá°ááŸá áºáŠážááᯠááá¯ááºááá¯ááºáá»áááºáááºááŒááºážááŸáááŸááá±á¬ á¡áá»ááºá¡áááºáá»á¬ážá¡ááŒáẠSTUN ááŸáá·áº TURN áá¬áá¬áá»á¬ážá áááºááá·áºáá¶áá«ááºááŸáááŸááá±á¬ á¡áá»ááºá¡áááºáá»á¬ážá¡áá±á«áº á¡ááŒá±áá¶á ááœááºáá°ááŸá áºáŠážááᯠáá»áááºáááºááẠá¡áá±á¬ááºážáá¯á¶ážááŒá áºááá¯ááºáá»á±áááºážáááºážááᯠááœá±ážáá»ááºááẠá¡áá¯á¶ážááŒá¯áááºáSession áá±á¬áºááŒáá»áẠProtocol (SDP) áá»áááºáááºááŸá¯áá»ááºááẠááá·áºáááºáá±á¬ááºáá»á¬ážááᯠáá±á¬áºááŒááá·áº áá±á¬áºáááºáá áºáá¯á á¥ááá¬á ICE ááá¯ááºá á¬ážááŸááºáá±á¬ááºážáá»á¬ážá áá¬ááºáá®áá®áá®áᬠáá¯ááºáá áºáá»á¬áž (á¡á±á¬áºáá®ááá¯/áá®áá®ááá¯áá»ááºáááºáá áºáá¯á¡ááœááº) á áááºááá¯á·... ááœááºáá°áá»á¬ážáá²á០áá áºáŠážááẠSDP áááºážááŸááºážáá»ááºááᯠáá±ážááá¯á·ááŒá®áž áá¯áááááẠSDP á¡ááŒá±áá áºáá¯ááŒáá·áº áá¯á¶á·ááŒááºáá«áááºá . áááºážáá±á¬ááºááœáẠáá»ááºáááºáá áºáá¯ááᯠáááºáá®ážáá¬ážáááºá
ááá¯ááá¯á·áá±á¬áá»áááºáááºááŸá¯ááá¯áááºáá®ážáááºá ááœááºáá°áá»á¬ážááẠSTUN ááŸáá·áº ááœá±á·áá¬áá¬áá»á¬ážááŸáááŸáááá·áºá¡áá»ááºá¡áááºáá»á¬ážááá¯á á¯áá±á¬ááºážááŒá®áž á¡áá»ááºážáá»ááºážáááŸááºááẠááá¯á¡ááºáááºá
ááŒá¿áá¬ááŸá¬ áááºážááá¯á·ááœáẠááá¯ááºááá¯ááºáááºááœááºááá¯ááºááá·áº á áœááºážáááºáááŸááá±ážáá±á¬ááŒá±á¬áá·áº á€áá±áá¬ááᯠáá²ááŸááºáááºá¡ááœáẠááŒááºáááá¹ááá¬ážáá áºáᯠááŸáááá«áááº- á¡áá»ááºááŒáá¬áá¬áá áºáá¯á
á¡áá»ááºááŒáá¬áá¬áá áºáá¯ááẠáááºážááá áºáá¯áááºážáá±á¬á¡áá¯ááºááŸá¬ áááºááœá²ááŸá¯ááºáááºááá·áºá¡ááá·áºááŸá áááºáá°ááœááºáá°áá»á¬ážá¡ááŒá¬áž áá±áá¬áá±ážááá¯á·áááºááŒá áºááẠ(á¡á±á¬ááºáá«áá¯á¶ááœááºááŒáá¬ážááá·áºá¡ááá¯ááºáž) ááŒá áºáá±á¬ááŒá±á¬áá·áº á¡ááœááºááá¯ážááŸááºážáá«áááºá
ááá¯ážááŸááºážáá±á¬ WebRTC áááºááœá²ááŸá¯ááºáááºááŒááºáž á¡á
á®á¡á
ááºááá¬áž
Teeworlds ááœááºááẠáá±á¬áºááẠááŒá¯á¶áá¯á¶áá¯á¶ážáááºáá»ááº
Teeworlds ááœááºáááºáááºáá±á¬ááºáá¯á¶ááẠá¡ááœááºááá¯ážááŸááºážáá«áááºá
- client ááŸáá·áº server á¡á áááºá¡ááá¯ááºážáá»á¬ážááẠááá°áá®áá±á¬ áááá¯ááááºááŸá áºáá¯ááŒá áºáááºá
- áá±á¬ááºáááºáá»á¬ážááẠáá áºááŒáááºáá»áŸáẠááááºážáá áºáá¯áᬠáááºáá¶áá»ááºážáááá·áº áá¬áá¬áá»á¬ážá áœá¬áá²á០áá áºáá¯ááá¯á· áá»áááºáááºááŒááºážááŒáá·áº ááááºážááá¯á· áááºáá±á¬ááºááŒáááºá
- ááááºážá¡ááœááºážááŸá áá±áá¬ááœáŸá²ááŒá±á¬ááºážááŸá¯á¡á¬ážáá¯á¶ážááᯠáá¬áá¬ááŸáá áºááá·áº áá¯ááºáá±á¬ááºáááºá
- á¡áá°ážáá¬á áá¬áá¬áá¬ááᯠááááºážáááá¯ááºážááá·áºááœáẠááŒááá¬ážááá·áº á¡áá»á¬ážáá°ááŸá¬ áá¬áá¬áá»á¬ážá á¬áááºážááᯠá á¯áá±á¬ááºážáááºá¡ááœáẠá¡áá¯á¶ážááŒá¯áááºá
áá±áá¬áááŸááºáááºá¡ááœáẠWebRTC ááá¯á¡áá¯á¶ážááŒá¯ááŒááºážááŒá±á¬áá·áºá áá»áœááºá¯ááºááá¯á·ááẠááááºážááá¬áá¬á¡á áááºá¡ááá¯ááºážááᯠáááá¯ááºážááá·áºáááºááŸááᬠbrowser ááá¯á· ááœáŸá²ááŒá±á¬ááºážááá¯ááºáá«áááºá áá«á áá»áœááºáá±á¬áºááá¯á·ááᯠá¡ááœáá·áºáá±á¬ááºážáá áºáá¯áá±ážáááº...
áá¬áá¬áá»á¬ážááᯠáááºááŸá¬ážááá¯ááºáá«á
áá¬áá¬áá¯áá¹áááááŸáááŒááºážááẠáá±á¬ááºážááœááºáá±á¬á¡á¬ážáá¬áá»ááºáá áºáá¯ááŒá áºáááº- áá»áœááºá¯ááºááá¯á·ááẠá¡ááá®áá±ážááŸááºážáá áºáá¯áá¯á¶ážááᯠGithub Pages ááœáẠááá¯á·ááá¯áẠCloudflare áá±á¬ááºááœááºááŸá áá»áœááºá¯ááºááá¯á·áááá¯ááºááá¯áẠhardware ááœáẠáááºááŒáááºáá±á¬á¡ááŒá±á¬ááºážá¡áá¬á¡ááŒá Ạá¡ááá®áá±ážááŸááºážáá áºáá¯áá¯á¶ážááᯠá¡áá¯á¶ážáá»ááá¯ááºáá±á¬ááŒá±á¬áá·áº ááŒááºáááºáá±á¬áá±á«ááºážáá¯ááºáá»á¬ážááŸáá·áº ááŒáá·áºáá¬ážáá±á¬á¡áá»áááºááᯠá¡ááá²á·á¡áá¯á¶ážááŒá¯ááá¯ááºáááºááŒá áºáááºá á¡ááŸááºááŸá¬á áá»áœááºá¯ááºááá¯á·ááẠáááºážááá¯á·ááᯠáá±á·áá¬ážááá¯ááºááŒá®áž áá»áœááºá¯ááºááá¯á· áá¶áá±á¬ááºážááŒá®áž ááááºážááẠáá±áááºážá á¬ážáá¬áá«á á¡ááŒá±áá¶á¡áá±á¬ááºá¡á¡á¯á¶ááᯠáá±ááºáá®ááẠáááá¯á¡ááºáá«á
ááá¯á·áá±á¬áºá á áá áºá¡áá¯ááºáá¯ááºáááºá¡ááœááºá áá»áœááºá¯ááºááá¯á·ááẠááŒááºááááá¯áá¬ááᯠá¡áá¯á¶ážááŒá¯ááẠááá¯á¡ááºáá«áá±ážáááºá
- áá áºáᯠááá¯á·ááá¯áẠáá áºáá¯áááºááá¯áá±á¬ STUN áá¬áá¬áá»á¬áž- áá»áœááºá¯ááºááá¯á·ááœáẠááœá±ážáá»ááºááẠá¡ááá²á·ááœá±ážáá»ááºá áá¬áá»á¬ážá áœá¬ááŸááááºá
- á¡áááºážáá¯á¶áž TURN áá¬áá¬áá áºáá¯- á€áá±áá¬ááœáẠá¡ááá²á·ááœá±ážáá»ááºá áá¬áá»á¬áž áááŸááá±á¬á·áá±á¬ááŒá±á¬áá·áº áá»áœááºá¯ááºááá¯á·áááá¯ááºááá¯áẠá áá áºááá·áºááœááºážááŒááºáž ááá¯á·ááá¯áẠáááºáá±á¬ááºááŸá¯á¡ááœáẠáá±ážáá»á±ááá¯ááºáá«áááºá áá¶áá±á¬ááºážáá±á¬ááºáá áœá¬á á¡áá»áááºá¡áá»á¬ážá á¯ááœáẠáá»áááºáááºááŸá¯ááᯠSTUN áá¬áá¬áá»á¬ážááŸáá áºááá·áº áááºáá±á¬ááºááá¯ááºááẠ(á¡ááŸááºáááẠp2p) ááᯠáá±ážá áœááºážááá¯ááºáá±á¬áºáááºáž ááŸáá·áºááẠááœá±ážáá»ááºááŸá¯áá áºáá¯á¡áá±ááŒáá·áº ááá¯á¡ááºáá«áááºá
- á¡áá»ááºááŒááŒááºážáá¬áá¬- á¡ááŒá¬ážááŸá¯áá±á¬áá·áºááŸá áºáá¯ááŸáá·áºááá°áá² á¡áá»ááºááŒááŒááºážááᯠá á¶áááºááŸááºáá¬ážááŒááºážáááŸááá«á á¡áá»ááºááŒááŒááºážáá¬áá¬ááẠá¡ááŸááºáááẠáá¬áááºáá°áááá·áºá¡áá¬ááẠá¡ááá®áá±ážááŸááºážáá±á«áºááœáẠá¡áááºážáááºáá°áááºáá«áááºá áá»áœááºá¯ááºááá¯á·áááá á¹á ááœááºá áá»áááºáááºááŸá¯áá áºáá¯ááá°áá±á¬ááºáá®á áá±áá¬ááá¬áá¡áááºážáááºááᯠáá²ááŸááºááẠááá¯á¡ááºáá«áááºá
- Teeworlds Master áá¬áá¬- áááºážááá¯á·á áááºááŸáááŸá¯ááᯠááŒá±á¬áºááŒá¬áááºááŸáá·áº á¡áá»á¬ážáá°ááŸá¬ áá¬áá¬áá»á¬ážááᯠááŸá¬ááœá±ááẠáá±á¬ááºáááºáá»á¬ážá áááºážááᯠá¡ááŒá¬ážáá¬áá¬áá»á¬ážá á¡áá¯á¶ážááŒá¯áááºá áááºážááẠáááá¯á¡ááºáá±á¬áºáááºáž (áá±á¬ááºáááºáá»á¬ážááẠáááºážááá¯á·ááááá·áº áá¬áá¬ááá¯á· á¡ááŒá²áááºáž áá»áááºáááºááá¯ááºáááº)á ááá¯á·ááŸáᬠáá á¬ážááá¬ážáá»á¬ážááẠáá»áááºážáá°áá»á¬ážááŒáá·áº ááááºážáá»á¬ážááœáẠáá«áááºááá¯ááºá á±ááẠáá¬ážááŸáááŒááºážááẠáá±á¬ááºážáá«áááºá
áá»áœááºá¯ááºááá¯á·ááẠGoogle á á¡ááá²á· STUN áá¬áá¬áá»á¬ážááᯠá¡áá¯á¶ážááŒá¯ááẠáá¯á¶ážááŒááºáá²á·ááŒá®áž TURN áá¬áá¬áá áºáá¯ááᯠááá¯ááºááá¯ááºá¡áá¯á¶ážáá»áá²á·áááºá
áá±á¬ááºáá¯á¶áž á¡áá»ááºááŸá
áºáá»ááºááᯠáá»áœááºáá±á¬áºááá¯á· á¡áá¯á¶ážááŒá¯áá²á·áá«áááºá
- Teeworlds áá¬á áá¬áá¬áá¬ááᯠá¡áá¯á¶ážááŒá¯áá±ááá·áº áá¬áá¬áá áºáá¯á á®á á¡áá»ááºá¡ááẠ(á¡áááºá IPá ááŒá±áá¯á¶á áá¯ááºá ...) áá«ááŸááá±á¬ á¡áá¬áá»á¬ážá á¬áááºážáá áºáá¯á¡áá±ááŒáá·áº á¡ááœááºááá¯ážááŸááºážáá«áááºá áá¬áá¬áá»á¬ážááẠáááºážááá¯á·áááá¯ááºááá¯ááºá¡áá¬ááá¹áá¯ááᯠáá¯ááºáá±ááŒá®áž á¡ááºááááºáá¯ááºááŒááŒá®áž áá±á¬ááºáááºáá»á¬ážááẠá á¬áááºážáá áºáá¯áá¯á¶ážááá¯áá°áᬠááá±áá¬ááá¯á·ááŒááááºá áá»áœááºá¯ááºááá¯á·ááẠáááºáá á¬áá»ááºááŸá¬ááœáẠá á¬áááºážááᯠHTML á¡ááŒá áºááŒááá¬ážáá±á¬ááŒá±á¬áá·áº áá á¬ážááá¬ážáá»á¬ážááẠáá¬áá¬áá±á«áºááœáẠááá áºááŸáááºááŒá®áž ááááºážáá®ááá¯á· ááá¯ááºááá¯ááºáá±á«áºáá±á¬ááºááœá¬ážááá¯ááºáááºá
- á¡áá»ááºááŒááŒááºážááẠáá»áœááºá¯ááºááá¯á·á sockets á¡áá±á¬ááºá¡áááºáá±á¬áºááŸá¯ááŸáá·áº áá®ážáááºá áœá¬áááºá ááºáá±ááŒá®áž áá±á¬ááºá¡ááá¯ááºážááœááºáá±á¬áºááŒáá¬ážáááºá
ááááºážá¡ááœááºážááŸáá·áº áááºáá
á¬áá»ááºááŸá¬ááŸá áá¬áá¬áá»á¬ážá
á¬áááºáž
socket áá»á¬ážá¡áá±á¬ááºá¡áááºáá±á¬áºááŒááºážá
ááá¯á¡ááºáá±á¬ááŒá±á¬ááºážáá²ááŸá¯á¡áá±á¡ááœááºááᯠá¡áááºážáá¯á¶ážáá»áŸá±á¬á·áá»ááẠPosix UDP Sockets ááŸáá·áº áá®ážá ááºááá¯ááºááá»áŸáá®ážááá·áº API áá áºáá¯ááᯠáááºáá®ážááá¯áá«áááºá
ááœááºáááºáá±á«áºááœáẠá¡ááá¯ážááŸááºážáá¯á¶áž áá±áá¬áááŸááºááŸá¯á¡ááœáẠááá¯á¡ááºáá±á¬ á¡áááá·áºáá¯á¶ážááá¯áááºáž á¡áá±á¬ááºá¡áááºáá±á¬áºááá¯áá«áááºá
á¥ááá¬á¡á¬ážááŒáá·áºá áá»áœááºá¯ááºááá¯á·ááẠááŸááºáááºáá±á¬áááºážááŒá±á¬ááºážááᯠáááá¯á¡ááºáá«- ááœááºáá°á¡á¬ážáá¯á¶ážááẠFirebase áá±áá¬áá±á·á áºá á¶ááá°áá¬áá áºáá¯ááŸáá·áº áááºá ááºáá±áá±á¬ áá°áá®áá±á¬ "virtual LAN" áá±á«áºááœáẠááŸááá±áá«áááºá
ááá¯á·ááŒá±á¬áá·áºá áá»áœááºá¯ááºááá¯á·ááẠáá®ážááŒá¬áž IP ááááºá á¬áá»á¬ážááᯠáááá¯á¡ááºáá«- áá®ážááá·áº Firebase áá±á¬á·áááºááá¯ážáá»á¬áž (ááá¯ááááºážá¡áááºáá»á¬ážááŸáá·áº áááºáá°áááº) ááẠááœááºáá°áá»á¬ážááᯠáá®ážááŒá¬ážááœá²ááŒá¬ážáááºááŸááºááẠáá¯á¶áá±á¬ááºááŒá®áž ááœááºáá°áá»ááºážáá áºáŠážá á®ááẠáá¬áá¬ááŒááºáááºááá¯á¡ááºáá±á¬ áá±á¬á·áá áºáá¯á á®á¡ááœáẠ"á¡áá¯" IP ááááºá á¬áá»á¬ážááᯠáá±áá¡ááá¯áẠáááºááŸááºáá±ážáá«áááºá á€á¡áá¬ááẠá¡áá±ážá¡ááœá²ááá¯ááºáá±á¬ á¡áá¯ááºááŒá áºááá·áº ááá¹áá¬áá¯á¶ážááá¯ááºáᬠIP ááááºá á¬áá¬áááºá¡ááœáẠááá¯á¡ááºááŸá¯ááᯠáá¯á¶ážááááºááŸá¬ážáá±ážáá«áááºá
á€áááºááŸá¬ áá»áœááºá¯ááºááá¯á·á¡áá±á¬ááºá¡áááºáá±á¬áºááẠááá¯á¡ááºáá±á¬ á¡áááºážáá¯á¶áž API ááŒá áºáááºá
// Create and destroy a socket
int socket();
int close(int fd);
// Bind a socket to a port, and publish it on Firebase
int bind(int fd, AddrInfo* addr);
// Send a packet. This lazily create a WebRTC connection to the
// peer when necessary
int sendto(int fd, uint8_t* buf, int len, const AddrInfo* addr);
// Receive the packets destined to this socket
int recvfrom(int fd, uint8_t* buf, int len, AddrInfo* addr);
// Be notified when new packets arrived
int recvCallback(Callback cb);
// Obtain a local ip address for this peer key
uint32_t resolve(client::String* key);
// Get the peer key for this ip
String* reverseResolve(uint32_t addr);
// Get the local peer key
String* local_key();
// Initialize the library with the given Firebase database and
// WebRTc connection options
void init(client::FirebaseConfig* fb, client::RTCConfiguration* ice);
API ááẠááá¯ážááŸááºážááŒá®áž Posix Sockets API ááŸáá·áº áááºáá°áá±á¬áºáááºáž á¡áá±ážááŒá®ážáá±á¬ ááŒá¬ážáá¬ážáá»áẠá¡áááºážáááºááŸááááºá áá¯ááºážáá±á«áºááá¯ááŸá¯áá»á¬ážááᯠááŸááºáááºážáááºááŒááºážá áá±áááœááºáž IP áá»á¬ážááᯠáááºááŸááºáá±ážááŒááºážááŸáá·áº áá»ááºážáááá±á¬áá»áááºáááºááŸá¯áá»á¬áž.
ááŒááºáááºáá±á«áºááá¯ááŸá¯áá»á¬ážááᯠááŸááºáá¯á¶áááºááŒááºážá
áá°áááºážáááá¯ááááºááẠááááºááá¯á·ááŒááºážááá¯ááºáá±á¬ I/O ááá¯á¡áá¯á¶ážááŒá¯áá±á¬áºáááºážá áááºááá±á¬ááºáá¬áá áºáá¯ááœáẠáá¯ááºáá±á¬ááºááẠáá¯ááºááᯠááŒááºáááºááŒá¯ááŒááºááá«áááºá
áááºážá¡ááœáẠá¡ááŒá±á¬ááºážáááºážááŸá¬ browser ááŸá event loop ááᯠprogram á០ááŸááºáá¬ážáá±á¬ááŒá±á¬áá·áºááŒá áºááẠ(áááºážááŸá¬ JavaScript ááá¯á·ááá¯áẠWebAssembly ááŒá áºáá«á á±)á
áá¬áááááºáááºážáá»ááºááŸá¬ áá®ááá¯áá¯ááºááœá± áá±ážááá¯ááºáááºá
while(running) {
select(...); // wait for I/O events
while(true) {
int r = readfrom(...); // try to read
if (r < 0 && errno == EWOULDBLOCK) // no more data available
break;
...
}
...
}
ááŒá áºáááºááœááºážáááºááᯠáá»áœááºá¯ááºááá¯á·áᶠááŸááºáá¬ážáá»áŸáẠáááºážááᯠá€áá²á·ááá¯á·áá±á¬ á¡áá¬á¡ááŒá ẠááŒá±á¬ááºážáá²ááẠááá¯á¡ááºáááº-
auto cb = []() { // this will be called when new data is available
while(true) {
int r = readfrom(...); // try to read
if (r < 0 && errno == EWOULDBLOCK) // no more data available
break;
...
}
...
};
recvCallback(cb); // register the callback
áá±áááœááºáž IP áá¬áááº
áá»áœááºá¯ááºááá¯á·á "ááœááºáááº" á¡ááœááºážááŸá node ID áá»á¬ážááẠIP ááááºá
á¬áá»á¬ážááá¯ááºáá±á¬áºáááºáž Firebase áá±á¬á·áá»á¬áž (áááºážááá¯á·ááẠá€áá²á·ááá¯á·ááŒááºááá±á¬ á
á¬ááŒá±á¬ááºážáá»á¬ážááŒá
áºáááº- -LmEC50PYZLCiCP-vqde
).
IP áá»á¬ážááᯠáááºááŸááºáá±ážááŒá®áž áááºážááá¯á·á áá°ážááŒá¬ážááŸá¯ááᯠá á áºáá±ážááẠááá¹ááá¬ážáá áºáᯠáááá¯á¡ááºáá±á¬ááŒá±á¬áá·áº (áááºážááá¯á·ááᯠáá±á¬ááºááẠáá»áááºáááºááŸá¯ ááŒááºáá±á¬ááºááŒá®ážáá±á¬áẠáááºážááá¯á·á¡á¬áž á áœáá·áºáá áºááŒááºáž)á ááá¯á·áá±á¬áº áááŒá¬ááááá¯áááá¯áá»áá¯ážáá°áá»á¬ážááᯠááááºážáááºááá¯ážááŒáá·áº ááœá²ááŒá¬ážáááºááŸááºááẠááá¯á¡ááºáá±á¬ááŒá±á¬áá·áº áááºážááẠá¡áááºááŒá±áá«áááºá
á€áááºááŸá¬ áá¯ááºáá±á¬ááºáá»ááºáá»á¬ážá¡ááœáẠá¡áá¯á¶ážááŒá¯ááá·áºá¡áá¬ááŒá
áºáááºá resolve
О reverseResolve
: á¡ááá®áá±ážááŸááºážááẠáá±á¬á·áá
á¬ááŒá±á¬ááºážáááºááá¯ážááᯠáá
áºáááºážáááºážááŒáá·áº (á¡áá¯á¶ážááŒá¯áá°ááá·áºááœááºážááŸá¯ááŸáá
áºááá·áº ááá¯á·ááá¯áẠáá¬á
áá¬áá¬áá¬ááŸáá
áºááá·áº) áááºáá¶áááŸáááŒá®áž áááºážááᯠá
ááºááœááºážá¡áá¯á¶ážááŒá¯áááºá¡ááœáẠIP ááááºá
á¬á¡ááŒá
ẠááŒá±á¬ááºážáá²ááá¯ááºáááºá áá»áẠAPI ááẠááá¯ážááŸááºážááŸá¯á¡ááœáẠstring áá
áºáá¯á¡á
á¬áž á€áááºááá¯ážááá¯áááºáž áááºáá¶áááŸááá«áááºá
áááºážááẠDNS ááŸá¬ááœá±ááŸá¯ááŸáá·áº áááºáá°áá±á¬áºáááºáž áááá¯ááºážááá·áºááœáẠá ááºááœááºáž áá¯ááºáá±á¬ááºáááºá
ááá¯ááá¯áááºááŸá¬á IP ááááºá á¬áá»á¬ážááᯠááá°áá®áá±á¬ client áá»á¬ážááŒá¬ážááœáẠáá»áŸáá±ááááá«áá á¡áá»áá¯á·áá±á¬ global identifier á¡áá»áá¯ážá¡á á¬áž ááá¯á¡ááºáá«áá áááºážááᯠááá°áá®áá±á¬áááºážáááºážááŒáá·áº áá¯ááºáá¯ááºááááºááŒá áºáááºá
áá»ááºážáááá»áááºáááºááŸá¯
UDP ááẠáá»áááºáááºááŸá¯ áááá¯á¡ááºáá±á¬áºáááºážá áá»áœááºá¯ááºááá¯á· ááŒááºáá°ážááá·áºá¡ááá¯ááºáž WebRTC ááẠáááºáá°ááœááºáá° ááŸá áºáŠážááŒá¬áž áá±áá¬áááœáŸá²ááŒá±á¬ááºážáá® ááŸááºáá»á¬ážáá±á¬ áá»áááºáááºááŸá¯ áá¯ááºáááºážá áẠááá¯á¡ááºáá«áááºá
áá°áá®áá±á¬ abstraction á¡ááá·áºááᯠáá±ážáá±á¬ááºááá¯áá«áásendto
/recvfrom
ááŒáá¯áááºáá»áááºáááºááŸá¯áááŸááá² áááá¬ážáá±á¬ááœááºáá°áá»á¬ážááŸáá·áº) ááá¯á·áá±á¬áẠAPI á¡ááœááºážááŸá "áá»ááºážááááŒááºáž" (ááŸá±á¬áá·áºááŸá±áž) áá»áááºáááºááŸá¯ááᯠáá¯ááºáá±á¬ááºááá«áááºá
UDP ááá¯á¡áá¯á¶ážááŒá¯áá±á¬á¡áá« "áá¬áá¬" ááŸáá·áº "áá±á¬ááºáááº" á¡ááŒá¬ážáá¯á¶ááŸááºáááºááœááºááŸá¯ááœááºááŒá áºáá»ááºáá±áááºááŸáá·áºáá»áœááºá¯ááºááá¯á·áá á¬ááŒáá·áºááá¯ááºáá¯ááºáá±á¬ááºááá·áºáááº-
- áá¬áá¬áá±á«áºááá¯ááŸá¯áá»á¬áž
bind()
áááºááŸááºáá¬ážáá±á¬ port ááœáẠpackets áá»á¬ážááá¯áááºáá¶ááá¯ááŒá±á¬ááºáž operating system ááá¯ááŒá±á¬ááŒáááºá
áááºážá¡á á¬ážá áá¬áá¬áá®ážá¡á±á¬ááºááŸá Firebase ááá¯á· ááœáá·áºáá¬ážáá±á¬ ááááºáááºážááᯠáá¯ááºáá±ááŒá®áž áááºážááá áºáááºááœá²ááŸá á¡ááŒá áºá¡áá»ááºáá»á¬ážááᯠáá¬ážáá±á¬ááºáá«áááºá
- áá¬áá¬áá±á«áºááá¯ááŸá¯áá»á¬áž
recvfrom()
ဠport áá±á«áºááŸá áááºááá·áº host ááŸáá¬áá±á¬ packet áá»á¬ážááᯠáááºáá¶ááŒááºážá
áá»áœááºá¯ááºááá¯á·áá¡ááŒá±á¡áá±ááœááºá ဠport ááá¯á·áá±ážááá¯á·áá±á¬ packets áá»á¬ážáá¡áááºáááºážá á®ááá¬ážááá¯á á áºáá±ážáááºááá¯á¡ááºáááºá
ááá¯á·ááºáá áºáá¯á á®ááœáẠáááºážáááá¯ááºááá¯ááºáááºážá á®ááŸáááŒá®ážá áá»áœááºá¯ááºááá¯á·ááẠá¡áááºážá¡ááŒá áºááŸáá·áº áŠážáááºáá¬ááááºáááºážáá»á¬ážááᯠWebRTC áá±áá¬ááááºáá»á¬ážáá¡á ááœáẠáá±á«ááºážááá·áºáᬠáááºáááºá¡áá áºáá áºáá¯áá±á¬ááºááŸááá¬ááá·áºá¡áá« áááºááá·áºáááºážá á®ááŒá±á¬ááºážááᯠáá»áœááºá¯ááºááá¯á·ááááŸáááá¯ááºá á±áááºá
áá±á«áºááá¯ááŸá¯ááẠááááºááá¯á·ááŒááºážááá¯ááºáá«á ááá¯á·ááŒá±á¬áá·áº áááºáááºáá»á¬ážáááŸááá«áá áá»áœááºá¯ááºááá¯á·ááẠááá¯ážááá¯áž-1 ááá¯ááŒááºá áááºááŸááºáá«á errno=EWOULDBLOCK
.
- áá±á¬ááºáááºááẠááŒááºááááºážáááºážá¡áá»áá¯á·ááŸáá·áº áá¯ááºážáá±á«áºááá¯ááŸá¯áá»á¬ážááŒáá·áº áá¬áá¬á IP ááŸáá·áº ááááºáááºážááᯠáááºáá¶áááŸááááºá
sendto()
. áááºážááẠá¡ááœááºážááá¯ááºážáá±á«áºááá¯ááŸá¯ááá¯áááºáž ááŒá¯áá¯ááºáááºábind()
ááá¯á·ááŒá±á¬áá·áº áá±á¬ááºáááºááœá²recvfrom()
bind ááᯠá¡ááá¡áá» ááá¯ááºáá±á¬ááºáá² áá¯á¶á·ááŒááºááŸá¯ááᯠáááºáá¶áááŸááááºááŒá áºáááºá
áá»áœááºá¯ááºááá¯á·áááá
á¹á
ááœááºá client ááẠstring key ááᯠááŒááºáá០áááºáá¶áááŸáááŒá®áž áá¯ááºáá±á¬ááºáá»ááºááᯠá¡áá¯á¶ážááŒá¯áááºá resolve()
IP ááááºá
á¬ááá°áááºá
á€á¡áá»áááºááœááºá ááœááºáá°ááŸá áºáŠážááẠáá áºáá¯ááŸáá·áºáá áºáᯠááá»áááºáááºáá±ážáá«áá áá»áœááºá¯ááºááá¯á·ááẠWebRTC áááºááœá²ááŸá¯ááºáááºááŒááºážááᯠá áááºáá¯ááºáá±á¬ááºáá«áááºá áá°áá®áá±á¬ááœááºáá°áá»ááºážá ááá°áá®áá±á¬ ááááºáááºážáá»á¬ážááá¯á· áá»áááºáááºááŸá¯áá»á¬ážááẠáá°áá®áá±á¬ WebRTC DataChannel ááᯠá¡áá¯á¶ážááŒá¯áá«áááºá
ááœááºááá¯ááºááŒá®ážáá±á¬á·áááºáž áá±á¬ááºááœááºáá±ážáááºá bind()
ááá¯á·ááŸáᬠáá¬áá¬ááẠáá±á¬ááºáá
áºááŒáááºááœáẠááŒááºáááºáá»áááºáááºááá¯ááºáááºááŒá
áºáááºá sendto()
á¡ááŒá±á¬ááºážáá
áºáá¯áá¯ááŒá±á¬áá·áº ááááºáá¬ážááá»áŸááºá
áááá¯ááºážááá·áºááẠFirebase ááŸá áá¬áá¬ááááºáááºážá¡áá»ááºá¡áááºá¡á±á¬ááºááœáẠáááºážá SDP áááºážááŸááºážáá»ááºááᯠáá±ážáá¬ážááá·áºá¡áá« áá¯á¶ážá áœá²áá°ááá»áááºáááºááŸá¯ááᯠáá¬áá¬á¡á¬áž á¡ááŒá±á¬ááºážááŒá¬ážááŒá®áž áá¬áá¬ááẠáááºážááœáẠáááºážááá¯á¶á·ááŒááºááŸá¯ááᯠáá¯á¶á·ááŒááºáááºá
á¡á±á¬ááºáá±á¬áºááŒáá« áá¯á¶ááẠsocket á¡á á®á¡á ááºá¡ááœáẠáááºáá±á·áá»áºá á®ážáááºážááŸá¯ ááá°áá¬áá áºáá¯ááŸáá·áº client á០ááááá¯á¶ážáááºáá±á·áá»áºááᯠáá¬áá¬ááá¯á· ááá¯á·ááŒááºážá¡á¬áž ááŒááááº-
áááá¯ááºážááá·áºááŸáá·áº áá¬áá¬ááŒá¬ážááŸá áá»áááºáááºááŸá¯á¡ááá·áºá áá¯á¶ááŒááºážá¡ááŒáá·áºá¡á
á¯á¶
áá±á¬ááºáá»ááº
áá®á¡áá áááºááŒá®ážááŒá® ááá¯áááºá áá¯ááºáá±á¬ááºáá»áẠáá®á¡áá¯áá®ááᯠááŒáá·áºááá¯á· á
áááºáááºá
á¬ážáá±áá±á¬ááºáá«ááŒá®á ááááºážááœááºáá
á¬ážááá¯ááºáááºá
áá¯ááºáá±á¬áºááá¯ááºáááºáá»á¬ážááŒá¬áž áá»á áºááŒááºáá±ážááœá²
ááœááºáááºá
á¬ááŒáá·áºááá¯ááºáá¯ááºááᯠá¡ááá²á·áááŸáááá¯ááºáááºá
source: www.habr.com