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

ЁЯУм рдзрдбрд╛ 05 тАФ TCP рд╡рд┐рд░реБрджреНрдз UDP: рдиреЛрдВрджрдгреАрдХреГрдд рдЯрдкрд╛рд▓ рд╡рд┐рд░реБрджреНрдз рд▓рд╛рдЙрдбрд╕реНрдкреАрдХрд░

ЁЯУН рддреБрдореНрд╣реА рдЗрдереЗ рдЖрд╣рд╛рдд: 12 рдкреИрдХреА рдзрдбрд╛ 05 ┬╖ рдкреБрдвреЗ: lesson-06-dns


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

рдзрдбреЗ 01тАУ05. transport рдЪреЗ рджреЛрди рдХрд░рд╛рд░, рдЦрд▒реНрдпрд╛ sockets рд╡рд░ рдкрд╛рд╣рд┐рд▓реЗрд▓реЗ.

ЁЯзТ 5 рд╡рд░реНрд╖рд╛рдВрдЪреНрдпрд╛ рдореБрд▓рд╛рд▓рд╛ рд╕рдордЬрд╛рд╡рд▓реНрдпрд╛рд╕рд╛рд░рдЦреЗ

рдиреЛрдВрджрдгреАрдХреГрдд рдЯрдкрд╛рд▓ (TCP): рдкрд╣рд┐рд▓реНрдпрд╛ рдкрддреНрд░рд╛рдЖрдзреА рджреЛрдиреНрд╣реА рдХрд╛рд░реНрдпрд╛рд▓рдпреЗ рдмреЛрд▓рд╛рдпрд▓рд╛ рддрдпрд╛рд░ рд╣реЛрддрд╛рдд тАФ "рддрдпрд╛рд░?" "рддрдпрд╛рд░!" "рдЪрд▓рд╛" тАФ рдЖрдгрд┐ рддреНрдпрд╛рдирдВрддрд░ рдкреНрд░рддреНрдпреЗрдХ рдкрддреНрд░рд╛рд▓рд╛ рдХреНрд░рдорд╛рдВрдХ рдЕрд╕рддреЛ, рддреНрдпрд╛рд╡рд░ рд╕рд╣реА рдШреЗрддрд▓реА рдЬрд╛рддреЗ, рд╣рд░рд╡рд▓реЗ рддрд░ рдкреБрдиреНрд╣рд╛ рдкрд╛рдард╡рд▓реЗ рдЬрд╛рддреЗ, рдЖрдгрд┐ рдХреНрд░рдорд╛рдиреЗ рджрд┐рд▓реЗ рдЬрд╛рддреЗ. рд╕реБрд░реБрд╡рд╛рдд рд╣рд│реВ, рдкрдг рдХрд╛рд╣реАрд╣реА рд╣рд░рд╡рдд рдирд╛рд╣реА.

рд▓рд╛рдЙрдбрд╕реНрдкреАрдХрд░ (UDP): рддреБрдореНрд╣реА рдШреЛрд╖рдгрд╛ рдПрдХрджрд╛рдЪ рдУрд░рдбреВрди рд╕рд╛рдВрдЧрддрд╛. рдХрд░рд╛рд░ рдирд╛рд╣реА, рдХреНрд░рдорд╛рдВрдХ рдирд╛рд╣реАрдд, рдкрд╛рд╡рддреА рдирд╛рд╣реА. corridor рдордзрд▓реНрдпрд╛ рдХрд╛рд╣реА рд▓реЛрдХрд╛рдВрдирд╛ рддреА рдРрдХреВ рдпреЗрдд рдирд╛рд╣реА. рдЭрдЯрдкрдЯ, рд╕реНрд╡рд╕реНрдд, рдЖрдгрд┐ рдЙрд╢рд┐рд░рд╛рдкреЗрдХреНрд╖рд╛ рдкреБрдиреНрд╣рд╛ рд╕рд╛рдВрдЧрдгреЗ рдмрд░реЗ рдЕрд╕рддреЗ рддреЗрд╡реНрд╣рд╛ рдЕрдЧрджреА рдпреЛрдЧреНрдп тАФ video frame, game рдордзрд▓реА position, directory рд▓рд╛ рд╡рд┐рдЪрд╛рд░рд▓реЗрд▓рд╛ рдкреНрд░рд╢реНрди.

ЁЯЧ║я╕П рдЖрдХреГрддреА

sequenceDiagram
  participant C as client
  participant S as server
  Note over C,S: TCP тАФ registered post
  C->>S: SYN
  S->>C: SYN-ACK
  C->>S: ACK  (a pipe exists)
  C->>S: bytes #1..31
  S->>C: ACK 31 ┬╖ "receipt"
  Note over C,S: UDP тАФ the loudspeaker
  C-->>S: datagram (maybe)
  C-->>S: datagram (lost)

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

ЁЯдФ рдХрд╛

рдЪреБрдХреАрдЪрд╛ рдирд┐рд╡рдбрд▓рд╛ рддрд░ рдПрдХрддрд░ рдЕрдЪреВрдХрддрд╛ рдЬрд╛рддреЗ рдХрд┐рдВрд╡рд╛ latency рд╡рд╛рдврддреЗ. Web, mail, databases: TCP. DNS, video, voice, games, HTTP/3: UDP, рд╕реНрд╡рддрдГрдЪреНрдпрд╛ рд╣реБрд╢рд╛рд░реАрд╕рд╣.

ЁЯФз рдХрд╕реЗ (рдпрд╛ repo рдордзреНрдпреЗ)

tcp() рдПрдХ listening socket bind рдХрд░рддреЛ, рдПрдХрд╛ thread рдордзреНрдпреЗ accept рдХрд░рддреЛ, рдЖрдгрд┐ client рдерд╛рдВрдмреЗ рдШреЗрдд рддреАрди рддреБрдХрдбреЗ рдкрд╛рдард╡рддреЛ тАФ stream рд▓рд╛ рдХрдбрд╛ рдирд╕рд▓реНрдпрд╛рдореБрд│реЗ рдХрд╛рд░рдХреВрди newline рдпреЗрдИрдкрд░реНрдпрдВрдд рд╡рд╛рдЪрддреЛ. udp() рдореБрджреНрджрд╛рдо 30% рдкрд╛рдард╡рдгреА рдЯрд╛рдХреВрди рджреЗрддреЛ рдЖрдгрд┐ рдХрд╛рдп рдкреЛрд╣реЛрдЪрд▓реЗ рддреЗ рджрд╛рдЦрд╡рддреЛ.

ЁЯзк рдХрд░реВрди рдкрд╛рд╣рд╛

python3 net/demo.py tcp udp
python3 - <<'EOF'
import socket; s=socket.socket(); s.settimeout(1)
print(s.connect_ex(("127.0.0.1", 9)))     # nothing listens on 9: refused fast (111/61) тАФ a closed room
EOF

тЬЕ рддрдкрд╛рд╕рд╛ тАФ рддреБрдореНрд╣рд╛рд▓рд╛ рдХрд╛рдп рджрд┐рд╕рд╛рдпрд▓рд╛ рд╣рд╡реЗ

TCP: "sent 3 pieces; the clerk answered: receipt: 31 bytes". UDP: "10 тАж, 6 heard" (seed рдард░рд▓реЗрд▓рд╛ рдЖрд╣реЗ, рдореНрд╣рдгреВрди рдмрд░реЛрдмрд░ рд╕рд╣рд╛). рдмрдВрдж рдЦреЛрд▓реА рд▓рдЧреЗрдЪ рд╢реВрдиреНрдп рдирд╕рд▓реЗрд▓рд╛ code рдкрд░рдд рдХрд░рддреЗ тАФ рдзрдбрд╛ 10 рдордзрд▓реНрдпрд╛ firewall рдиреЗ рдЕрдбрд╡рд▓реЗрд▓реНрдпрд╛ port рдЪреНрдпрд╛ рд╢рд╛рдВрддрддреЗрд╢реА рддреБрд▓рдирд╛ рдХрд░рд╛.

ЁЯПБ рддреБрдореНрд╣реА рдЖрддреНрддрд╛рдЪ рдХрд╛рдп рд╕рд┐рджреНрдз рдХреЗрд▓реЗ

TCP рдЪреНрдпрд╛ рд╣рдореА рдЦрд▒реНрдпрд╛ рдЖрд╣реЗрдд рдЖрдгрд┐ рджрд┐рд╕рддрд╛рдд; UDP рдордзрд▓реЗ рд╣рд░рд╡рдгреЗ рдЦрд░реЗ рдЖрд╣реЗ рдЖрдгрд┐ рджрд┐рд╕рддреЗ; рдЖрдгрд┐ TCP stream рд╡рд░ рд╕рдВрджреЗрд╢рд╛рдВрдЪреНрдпрд╛ рд╕реАрдорд╛ рддреБрдореНрд╣рд╛рд▓рд╛рдЪ рдЬреЛрдбрд╛рд╡реНрдпрд╛ рд▓рд╛рдЧрддрд╛рдд.

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

ЁЯПн рдкреНрд░рддреНрдпрдХреНрд╖ рд╡рд╛рдкрд░рд╛рдд рд╣реЗ рдХрд╛ рдорд╣рддреНрддреНрд╡рд╛рдЪреЗ: head-of-line blocking, connection pools, keep-alive, рдЖрдгрд┐ 3-way handshake рдЪрд╛ round trip тАФ рд╣реА рд╕рдЧрд│реА TCP рдЪреА рддрдереНрдпреЗ p99 latency рдореНрд╣рдгреВрди рджрд┐рд╕рддрд╛рдд. рдиреЗрдордХреЗ рддреЗ рд╕реЛрдбрд╡рдгреНрдпрд╛рд╕рд╛рдареАрдЪ HTTP/3 UDP рд╡рд░ рдЧреЗрд▓рд╛.

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

рдзрдбрд╛ 06 тАФ DNS: рдирд╛рд╡рд╛рдЪреЗ рдкрддреНрддреНрдпрд╛рдд рд░реВрдкрд╛рдВрддрд░ рдХрд░рдгрд╛рд░реА directory, рдЖрдгрд┐ рддреА рдкреНрд░рддреНрдпреЗрдХ outage рдЪреА рд╕реБрд░реБрд╡рд╛рдд рдХрд╛ рдЕрд╕рддреЗ.

ЁЯУм Lesson 05 тАФ TCP vs UDP: registered post vs the loudspeaker

ЁЯУН You are here: Lesson 05 of 12 ┬╖ Next: lesson-06-dns


ЁЯУж What's in this branch

Lessons 01тАУ05. The two transport contracts, seen on real sockets.

ЁЯзТ Explain like I'm 5

Registered post (TCP): before the first letter, both offices agree to talk тАФ "ready?" "ready!" "go" тАФ and after that every letter is numbered, signed for, re-sent if it goes missing, and handed over in order. Slow to start, but nothing is lost.

The loudspeaker (UDP): you shout the announcement once. No agreement, no numbers, no receipt. Some people in the corridor miss it. Instant, cheap, and exactly right when a repeat is better than a delay тАФ a video frame, a game position, a directory question.

ЁЯЧ║я╕П Diagram

sequenceDiagram
  participant C as client
  participant S as server
  Note over C,S: TCP тАФ registered post
  C->>S: SYN
  S->>C: SYN-ACK
  C->>S: ACK  (a pipe exists)
  C->>S: bytes #1..31
  S->>C: ACK 31 ┬╖ "receipt"
  Note over C,S: UDP тАФ the loudspeaker
  C-->>S: datagram (maybe)
  C-->>S: datagram (lost)

тЭУ What

ЁЯдФ Why

Choosing the wrong one costs either correctness or latency. Web, mail, databases: TCP. DNS, video, voice, games, HTTP/3: UDP with their own smarts.

ЁЯФз How (in this repo)

tcp() binds a listening socket, accepts in a thread, and the client sends three pieces with pauses тАФ the clerk reads until a newline because the stream has no edges. udp() drops 30% of sends on purpose and shows what arrived.

ЁЯзк Try it

python3 net/demo.py tcp udp
python3 - <<'EOF'
import socket; s=socket.socket(); s.settimeout(1)
print(s.connect_ex(("127.0.0.1", 9)))     # nothing listens on 9: refused fast (111/61) тАФ a closed room
EOF

тЬЕ Verify тАФ what you should see

TCP: "sent 3 pieces; the clerk answered: receipt: 31 bytes". UDP: "10 тАж, 6 heard" (the seed is fixed, so exactly six). The closed room returns a non-zero code immediately тАФ compare with a firewalled port's silence in lesson 10.

ЁЯПБ What you just proved

TCP's guarantees are real and visible; UDP's losses are real and visible; and message boundaries are yours to add on a TCP stream.

тЪая╕П Common mistakes

ЁЯПн Why this matters in production: head-of-line blocking, connection pools, keep-alive, and the 3-way handshake's round trip are all TCP facts that show up as p99 latency. HTTP/3 moved to UDP precisely to fix them.

тПня╕П Next

Lesson 06 тАФ DNS: the directory that turns a name into an address, and why it opens every outage.

тЖР PreviouslayersNext тЖТdns

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