ЁЯУЦ рдзрдбрд╛ 06 тАФ DNS: рд╢рд╛рд│реЗрдЪреА рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛
ЁЯУН рддреБрдореНрд╣реА рдЗрдереЗ рдЖрд╣рд╛рдд: 12 рдкреИрдХреА рдзрдбрд╛ 06 ┬╖ рдкреБрдвреЗ: lesson-07-http-on-the-wire
ЁЯУж рдпрд╛ рдмреНрд░рдБрдЪрдордзреНрдпреЗ рдХрд╛рдп рдЖрд╣реЗ
рдзрдбреЗ 01тАУ06. рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛: example.com рдЪреЗ 93.184.216.34 рдХрд╕реЗ рд╣реЛрддреЗ, byte by byte
рдмрд╛рдВрдзрд▓реЗрд▓реНрдпрд╛ рдкреНрд░рд╢реНрдирд╛рд╕рд╣.
- net/demo.py тАФ
dns: UDP рд╡рд░реВрди 8.8.8.8 рд▓рд╛ 29-byte query, рдЖрдгрд┐ рдЙрд▓рдЧрдбрд▓реЗрд▓реЗ рдЙрддреНрддрд░
ЁЯзТ 5 рд╡рд░реНрд╖рд╛рдВрдЪреНрдпрд╛ рдореБрд▓рд╛рд▓рд╛ рд╕рдордЬрд╛рд╡рд▓реНрдпрд╛рд╕рд╛рд░рдЦреЗ
рд╡рд┐рдЬреНрдЮрд╛рди рдкреНрд░рдпреЛрдЧрд╢рд╛рд│рд╛ рдореНрд╣рдгрдЬреЗ рдЗрдорд╛рд░рдд 93.184 рдордзрд▓реА рдЦреЛрд▓реА 216 рд╣реЗ рдХреЛрдгрд╛рд▓рд╛рдЪ рд▓рдХреНрд╖рд╛рдд рд░рд╛рд╣рдд рдирд╛рд╣реА. рддреБрдореНрд╣реА рдирд┐рд░реНрджреЗрд╢рд┐рдХреЗрд▓рд╛ рд╡рд┐рдЪрд╛рд░рддрд╛: "example.com рдХреБрдареЗ рдЖрд╣реЗ?" рддреБрдордЪреНрдпрд╛ рдЯреЗрдмрд▓рд╛рд╡рд░рдЪреНрдпрд╛ рдирд┐рд░реНрджреЗрд╢рд┐рдХреЗрд▓рд╛ (cache) рдХрджрд╛рдЪрд┐рдд рдЖрдзреАрдЪ рдорд╛рд╣реАрдд рдЕрд╕реЗрд▓. рдирд╕реЗрд▓, рддрд░ рддреА рд╢рд╛рд│реЗрдЪреНрдпрд╛ resolver рд▓рд╛ рд╡рд┐рдЪрд╛рд░рддреЗ, рдЬреЛ root рд▓рд╛ рд╡рд┐рдЪрд╛рд░рддреЛ (".com рдХреЛрдг рд╕рд╛рдВрднрд╛рд│рддреЛ?"), рдордЧ .com рд▓рд╛ ("example.com рдХреЛрдг рд╕рд╛рдВрднрд╛рд│рддреЛ?"), рдордЧ example.com рдЪреНрдпрд╛ рд╕реНрд╡рддрдГрдЪреНрдпрд╛ server рд▓рд╛, рдЬреЛ рдкрддреНрддрд╛ рдЖрдгрд┐ рдПрдХ рдЯреАрдк рджреЗрдКрди рдЙрддреНрддрд░ рджреЗрддреЛ: "рд╣реЗ 300 seconds рд▓рдХреНрд╖рд╛рдд рдареЗрд╡рд╛". рдкреБрдврдЪреНрдпрд╛ рд╡реЗрд│реА рдХреЛрдгреАрд╣реА рдХреЛрдгрд╛рд▓рд╛ рд╡рд┐рдЪрд╛рд░рдд рдирд╛рд╣реА.
ЁЯЧ║я╕П рдЖрдХреГрддреА
flowchart LR
Y["ЁЯТ╗ you<br/>cache?"] --> R["ЁЯУЦ resolver<br/>8.8.8.8 / your ISP"] --> RO["ЁЯПЫя╕П root"] --> C[".com"] --> E["example.com's<br/>name servers"]
E -->|"A 93.184.216.34 ┬╖ TTL 300"| R --> Y
тЭУ рдХрд╛рдп
- Records:
A(IPv4),AAAA(IPv6),CNAME(рджреБрд╕рд░реЗ рдирд╛рд╡),MX(mail),TXT(рдкреБрд░рд╛рд╡рд╛, SPF),NS(zone рд╕рд╛рдареА рдХреЛрдг рдЙрддреНрддрд░ рджреЗрддреЛ). - TTL: рдХреЛрдгрддрд╛рд╣реА cache рдЙрддреНрддрд░ рдХрд┐рддреА рд╡реЗрд│ рдареЗрд╡реВ рд╢рдХрддреЛ. рдмрджрд▓ рд╕рдЧрд│реАрдХрдбреЗ рджрд┐рд╕рд╛рдпрд▓рд╛ рдЬреБрдирд╛ TTL рд╕рдВрдкрд╛рд╡рд╛ рд▓рд╛рдЧрддреЛ.
- Resolver (recursive, рддреБрдордЪреНрдпрд╛ рд╡рддреАрдиреЗ рд╡рд┐рдЪрд╛рд░рддреЛ) рд╡рд┐рд░реБрджреНрдз authoritative (рдЙрддреНрддрд░рд╛рдЪрд╛
рдорд╛рд▓рдХ).
/etc/hostsрд╕реНрдерд╛рдирд┐рдХ рдкрд╛рддрд│реАрд╡рд░ рд╕рдЧрд│реНрдпрд╛рд╡рд░ рдорд╛рдд рдХрд░рддреЗ. - Transport: UDP port 53; рдореЛрдареНрдпрд╛ рдЙрддреНрддрд░рд╛рдВрд╕рд╛рдареА TCP; DoH/DoT рддреЗ HTTPS/TLS рдордзреНрдпреЗ рдЧреБрдВрдбрд╛рд│рддрд╛рдд.
ЁЯдФ рдХрд╛
рдЪреБрдХреАрдЪреА рдХрд┐рдВрд╡рд╛ рдЬреБрдиреА рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдЕрдЧрджреА рдмрдВрдж рдкрдбрд▓реЗрд▓реНрдпрд╛ server рд╕рд╛рд░рдЦреА рджрд┐рд╕рддреЗ. "site рдмрдВрдж рдЖрд╣реЗ" рдкреИрдХреА рдирд┐рдореНрдореЗ DNS рдЕрд╕рддреЗ: record рдордзрд▓реА рдЯрд╛рдпрдкрд┐рдВрдЧрдЪреА рдЪреВрдХ, рдЬреНрдпрд╛рдЪреА рдХреЛрдгреА рд╡рд╛рдЯ рдкрд╛рд╣рд┐рд▓реА рдирд╛рд╣реА рдЕрд╕рд╛ TTL, рдЧрд╛рдарддрд╛ рди рдпреЗрдгрд╛рд░рд╛ resolver. рдореНрд╣рдгреВрдирдЪ рд╢рд┐рдбреАрдЪреА рдкрд╣рд┐рд▓реА рдкрд╛рдпрд░реА: DNS рдЖрд╣реЗ рдХрд╛?
ЁЯФз рдХрд╕реЗ (рдпрд╛ repo рдордзреНрдпреЗ)
dns() рдПрдХ header (id, flags = recursion desired, рдПрдХ рдкреНрд░рд╢реНрди), length-prefixed labels
рдореНрд╣рдгреВрди рдирд╛рд╡, type A, class IN рдкреЕрдХ рдХрд░рддреЛ тАФ 29 bytes тАФ рддреЗ 8.8.8.8:53 рд▓рд╛ рдкрд╛рдард╡рддреЛ рдЖрдгрд┐
compressed-name pointer рд╕рд╣ рдЙрддреНрддрд░рд╛рдЪреЗ records рд╡рд╛рдЪрддреЛ. рдХреЛрдгрддреАрд╣реА library рдирд╛рд╣реА; рд╣рд╛рдЪ
protocol рдЖрд╣реЗ.
ЁЯзк рдХрд░реВрди рдкрд╛рд╣рд╛
python3 net/demo.py dns
dig +short example.com # the same answer, the grown-up tool
dig example.com # the full answer: flags, TTL, which server answered
dig +trace example.com | tail -8 # watch root тЖТ .com тЖТ example.com
dig MX gmail.com +short # a different record type
тЬЕ рддрдкрд╛рд╕рд╛ тАФ рддреБрдореНрд╣рд╛рд▓рд╛ рдХрд╛рдп рджрд┐рд╕рд╛рдпрд▓рд╛ рд╣рд╡реЗ
id matches: True, рдПрдХ рдХрд┐рдВрд╡рд╛ рдЕрдзрд┐рдХ A record тЖТ тАж ttl 300s рдУрд│реА, рдЖрдгрд┐ dig +short рддреЗрдЪ рдкрддреНрддреЗ рдЫрд╛рдкрддреЛ. dig +trace рдирд┐рд░реНрджреЗрд╢рд┐рдХреЗрддреВрди рдЦрд╛рд▓реА рдЙрддрд░рдгрд╛рд░реЗ рддреАрди hops рджрд╛рдЦрд╡рддреЛ.
ЁЯПБ рддреБрдореНрд╣реА рдЖрддреНрддрд╛рдЪ рдХрд╛рдп рд╕рд┐рджреНрдз рдХреЗрд▓реЗ
рддреБрдореНрд╣реА рд╣рд╛рддрд╛рдиреЗ DNS рдкреНрд░рд╢реНрди рдмрд╛рдВрдзрд▓рд╛, рдЙрддреНрддрд░ рд╡рд╛рдЪрд▓реЗ, рдЖрдгрд┐ рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ root рдкрд╛рд╕реВрди рдЦрд╛рд▓реА рдХрд╛рдо рдХрд╕реЗ рд╕реЛрдкрд╡рддреЗ рддреЗ рдкрд╛рд╣рд┐рд▓реЗ.
тЪая╕П рдиреЗрд╣рдореАрдЪреНрдпрд╛ рдЪреБрдХрд╛
- record рдмрджрд▓реВрди рдЬреБрдирд╛ TTL рд╕рдВрдкрдгреНрдпрд╛рдЖрдзреАрдЪ рд╡рд┐рдЬрдп рдЬрд╛рд╣реАрд░ рдХрд░рдгреЗ.
- zone apex рд╡рд░ (
example.comрд╕реНрд╡рддрдГ) CNAME тАФ рдпрд╛рд▓рд╛ рдкрд░рд╡рд╛рдирдЧреА рдирд╛рд╣реА; A/ALIAS рд╡рд╛рдкрд░рд╛. /etc/hostsрдХрд┐рдВрд╡рд╛ company рдЪрд╛ resolver рддреБрдордЪреНрдпрд╛ рдЕрдкреЗрдХреНрд╖реЗрд╡рд░ рдорд╛рдд рдХрд░рдд рдЖрд╣реЗ рд╣реЗ рд╡рд┐рд╕рд░рдгреЗ.
ЁЯПн рдкреНрд░рддреНрдпрдХреНрд╖ рд╡рд╛рдкрд░рд╛рдд рд╣реЗ рдХрд╛ рдорд╣рддреНрддреНрд╡рд╛рдЪреЗ: blue-green cutovers, failover рдЖрдгрд┐ CDNs рд╣реЗ рд╕рдЧрд│реЗ DNS рджреНрд╡рд╛рд░реЗ рд╣рд▓рддрд╛рдд; TTL рд╣рд╛ рддреБрдордЪрд╛ rollback рдЪрд╛ рд╡реЗрд│ рдЖрд╣реЗ. Route 53 рдЖрдгрд┐ Cloudflare рдореНрд╣рдгрдЬреЗ health checks рдЬреЛрдбрд▓реЗрд▓рд╛ рд╣рд╛рдЪ рдзрдбрд╛.
тПня╕П рдкреБрдвреЗ
рдзрдбрд╛ 07 тАФ wire рд╡рд░рдЪреЗ HTTP: API рд╢рд╛рд│реЗрдЪреА рдЪрд┐рдареНрдареА, socket рд╡рд░ рд╣рд╛рддрд╛рдиреЗ рд▓рд┐рд╣рд┐рд▓реЗрд▓реА, рдЖрдгрд┐ HTTP/2 рд╡ /3 рдиреЗ рдХрд╛рдп рдмрджрд▓рд▓реЗ.