ЁЯПл The SchoolтА║ЁЯХ╕я╕П NetworkingтА║ЁЯУЦ рдзрдбрд╛ 06 тАФ DNS: рд╢рд╛рд│реЗрдЪреА рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛
ЁЯЦ╝я╕П See the drawing + lab ЁЯПа Course home ЁЯМ┐ Branch on GitHub тЬПя╕П View source
ЁЯЦ╝я╕П рдЖрдХреГрддреА рдЖрдгрд┐ labThe drawing + lab рдкреВрд░реНрдг рдкрд╛рдирд╛рд╡рд░ рдЙрдШрдбрд╛ тЖЧOpen full page тЖЧ

ЁЯУЦ рдзрдбрд╛ 06 тАФ DNS: рд╢рд╛рд│реЗрдЪреА рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛

ЁЯУН рддреБрдореНрд╣реА рдЗрдереЗ рдЖрд╣рд╛рдд: 12 рдкреИрдХреА рдзрдбрд╛ 06 ┬╖ рдкреБрдвреЗ: lesson-07-http-on-the-wire


ЁЯУж рдпрд╛ рдмреНрд░рдБрдЪрдордзреНрдпреЗ рдХрд╛рдп рдЖрд╣реЗ

рдзрдбреЗ 01тАУ06. рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛: example.com рдЪреЗ 93.184.216.34 рдХрд╕реЗ рд╣реЛрддреЗ, byte by byte рдмрд╛рдВрдзрд▓реЗрд▓реНрдпрд╛ рдкреНрд░рд╢реНрдирд╛рд╕рд╣.

ЁЯзТ 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

тЭУ рдХрд╛рдп

ЁЯдФ рдХрд╛

рдЪреБрдХреАрдЪреА рдХрд┐рдВрд╡рд╛ рдЬреБрдиреА рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдЕрдЧрджреА рдмрдВрдж рдкрдбрд▓реЗрд▓реНрдпрд╛ 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 рдкрд╛рд╕реВрди рдЦрд╛рд▓реА рдХрд╛рдо рдХрд╕реЗ рд╕реЛрдкрд╡рддреЗ рддреЗ рдкрд╛рд╣рд┐рд▓реЗ.

тЪая╕П рдиреЗрд╣рдореАрдЪреНрдпрд╛ рдЪреБрдХрд╛

ЁЯПн рдкреНрд░рддреНрдпрдХреНрд╖ рд╡рд╛рдкрд░рд╛рдд рд╣реЗ рдХрд╛ рдорд╣рддреНрддреНрд╡рд╛рдЪреЗ: blue-green cutovers, failover рдЖрдгрд┐ CDNs рд╣реЗ рд╕рдЧрд│реЗ DNS рджреНрд╡рд╛рд░реЗ рд╣рд▓рддрд╛рдд; TTL рд╣рд╛ рддреБрдордЪрд╛ rollback рдЪрд╛ рд╡реЗрд│ рдЖрд╣реЗ. Route 53 рдЖрдгрд┐ Cloudflare рдореНрд╣рдгрдЬреЗ health checks рдЬреЛрдбрд▓реЗрд▓рд╛ рд╣рд╛рдЪ рдзрдбрд╛.

тПня╕П рдкреБрдвреЗ

рдзрдбрд╛ 07 тАФ wire рд╡рд░рдЪреЗ HTTP: API рд╢рд╛рд│реЗрдЪреА рдЪрд┐рдареНрдареА, socket рд╡рд░ рд╣рд╛рддрд╛рдиреЗ рд▓рд┐рд╣рд┐рд▓реЗрд▓реА, рдЖрдгрд┐ HTTP/2 рд╡ /3 рдиреЗ рдХрд╛рдп рдмрджрд▓рд▓реЗ.

ЁЯУЦ Lesson 06 тАФ DNS: the school directory

ЁЯУН You are here: Lesson 06 of 12 ┬╖ Next: lesson-07-http-on-the-wire


ЁЯУж What's in this branch

Lessons 01тАУ06. The directory: how example.com becomes 93.184.216.34, with a question built byte by byte.

ЁЯзТ Explain like I'm 5

Nobody remembers that the science lab is room 216 in building 93.184. You ask the directory: "where is example.com?" The directory on your desk (the cache) may already know. If not, it asks the school's resolver, which asks the root ("who handles .com?"), then .com ("who handles example.com?"), then example.com's own server, which answers with the address and a note: "remember this for 300 seconds". Next time, nobody asks anyone.

ЁЯЧ║я╕П Diagram

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

тЭУ What

ЁЯдФ Why

A wrong or stale directory looks exactly like a dead server. Half of "the site is down" is DNS: a typo in a record, a TTL nobody waited for, a resolver that cannot be reached. Hence the first rung of the ladder: is it DNS?

ЁЯФз How (in this repo)

dns() packs a header (id, flags = recursion desired, one question), the name as length-prefixed labels, type A, class IN тАФ 29 bytes тАФ sends it to 8.8.8.8:53 and parses the answer records, including the compressed-name pointer. No library; this is the protocol.

ЁЯзк Try it

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

тЬЕ Verify тАФ what you should see

id matches: True, one or more A record тЖТ тАж ttl 300s lines, and dig +short printing the same addresses. dig +trace shows three hops down the directory.

ЁЯПБ What you just proved

You built a DNS question by hand, read the answer, and watched the directory delegate from the root down.

тЪая╕П Common mistakes

ЁЯПн Why this matters in production: blue-green cutovers, failover and CDNs all move by DNS; the TTL is your rollback time. Route 53 and Cloudflare are this lesson with health checks attached.

тПня╕П Next

Lesson 07 тАФ HTTP on the wire: the API school's slip, written by hand onto the socket, and what HTTP/2 and /3 changed.

тЖР Previoustcp udpNext тЖТhttp on the wire

This page is the lesson's README from the lesson-06-dns branch, shown here so the whole School stays on one site. Code files open on GitHub at the same branch.