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

ЁЯЪк рдзрдбрд╛ 03 тАФ Ports рдЖрдгрд┐ sockets: рдЦреЛрд▓реА рдХреНрд░рдорд╛рдВрдХ рдЖрдгрд┐ рдмрд╛рдХреЗ

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


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

рдзрдбреЗ 01тАУ03. рд▓рдЦреЛрдЯреНрдпрд╛рд╡рд░рдЪрд╛ рдЦреЛрд▓реА рдХреНрд░рдорд╛рдВрдХ, рдЖрдгрд┐ рдЬреНрдпрд╛ рдмрд╛рдХрд╛рд╡рд░ рд╕рдВрднрд╛рд╖рдг рдкреНрд░рддреНрдпрдХреНрд╖ рдШрдбрддреЗ рддреЗ рдмрд╛рдХ.

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

рдПрдХ рдЗрдорд╛рд░рдд, рдЕрдиреЗрдХ рдЦреЛрд▓реНрдпрд╛. рдкрддреНрддрд╛ рд▓рдЦреЛрдЯреНрдпрд╛рд▓рд╛ рдЗрдорд╛рд░рддреАрдкрд░реНрдпрдВрдд рдкреЛрд╣реЛрдЪрд╡рддреЛ; рдЦреЛрд▓реА рдХреНрд░рдорд╛рдВрдХ рддреЛ рдпреЛрдЧреНрдп рд╡реНрдпрдХреНрддреАрдкрд░реНрдпрдВрдд рдкреЛрд╣реЛрдЪрд╡рддреЛ: рдЦреЛрд▓реА 80 рдореНрд╣рдгрдЬреЗ web office, 443 рдореНрд╣рдгрдЬреЗ рд╕реАрд▓ рдХреЗрд▓реЗрд▓реЗ web office, 22 рдореНрд╣рдгрдЬреЗ рд░рдЦрд╡рд╛рд▓рджрд╛рд░рд╛рдЪреЗ рджрд╛рд░, 5432 рдореНрд╣рдгрдЬреЗ рдиреЛрдВрджреАрдВрдЪреА рдЦреЛрд▓реА. server рдЖрдкрд▓реНрдпрд╛ рдЦреЛрд▓реАрдд рджрд╛рд░ рдЙрдШрдбреЗ рдареЗрд╡реВрди рдмрд╕рд▓реЗрд▓рд╛ рдЕрд╕рддреЛ, рдРрдХрдд. рдЖрдд рдпреЗрдгрд╛рд▒реНрдпрд╛ рдкреНрд░рддреНрдпреЗрдХ рдкрд╛рд╣реБрдгреНрдпрд╛рд▓рд╛ рд╕реНрд╡рддрдГрдЪреЗ рдмрд╛рдХ рдорд┐рд│рддреЗ тАФ рдПрдХ socket тАФ рддреНрдпрд╛рдореБрд│реЗ рдХрд╛рд░рдХреВрди рдПрдХрд╛рдЪ рд╡реЗрд│реА рдЕрдиреЗрдХрд╛рдВрдирд╛ рд╕реЗрд╡рд╛ рджреЗрдК рд╢рдХрддреЛ.

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

flowchart LR
  V1["visitor 192.168.0.12:51234"] --> D1["desk 1"]
  V2["visitor 10.1.2.3:60002"] --> D2["desk 2"]
  subgraph room["ЁЯПл 93.184.216.34 тАФ room 443 (LISTENING)"]
    D1 ; D2
  end

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

ЁЯдФ рдХрд╛

"Address already in use", "connection refused", "port 8080 рдХреЛрдгрддреНрдпрд╛ process рдХрдбреЗ рдЖрд╣реЗ", "app localhost рд╡рд░ рдРрдХрддреЗ рдкрдг container рд▓рд╛ рддреА рджрд┐рд╕рдд рдирд╛рд╣реА" тАФ рд╣реЗ рд╕рдЧрд│реЗ рдЦреЛрд▓реАрдЪреЗ рдкреНрд░рд╢реНрди рдЖрд╣реЗрдд. Firewalls (рдзрдбрд╛ 10) рдореНрд╣рдгрдЬреЗ рдЦреЛрд▓реНрдпрд╛рдВрдЪреНрдпрд╛ рдпрд╛рджреНрдпрд╛; load balancers (рдзрдбрд╛ 11) рдореНрд╣рдгрдЬреЗ рдЦреЛрд▓реНрдпрд╛рдВрд╕рдореЛрд░рдЪреА рдмрд╛рдХреЗ.

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

ports() рдкреНрд░рддреНрдпреЗрдХ рд╕реБрдкреНрд░рд╕рд┐рджреНрдз port рд╡рд░ 200 ms timeout рдиреЗ connect_ex call рдХрд░рддреЛ: 0 рдореНрд╣рдгрдЬреЗ knock рд▓рд╛ рдХреЛрдгреАрддрд░реА рдЙрддреНрддрд░ рджрд┐рд▓реЗ. tcp() getsockname() рдЖрдгрд┐ getpeername() рдЫрд╛рдкрддреЛ тАФ рдПрдХрд╛ connection рдЪреА рджреЛрди рдЯреЛрдХреЗ.

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

python3 net/demo.py ports
python3 -m http.server 8080 &           # open room 8080
python3 net/demo.py ports | grep 8080   # now it says open
ss -ltnp 2>/dev/null || lsof -nP -iTCP -sTCP:LISTEN   # who is listening where
kill %1

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

рдЖрдзреА 8080 тАж closed, рдирдВрддрд░ open тЖР someone is listening; ss/lsof рдордзреНрдпреЗ *:8080 рд╡рд░ python рджрд┐рд╕рддреЛ. 127.0.0.1 рд▓рд╛ bind рдХреЗрд▓реЗ рддрд░ рдЗрддрд░ machines рдирд╛ рддреЛ рдЧрд╛рдарддрд╛ рдпреЗрдд рдирд╛рд╣реА; 0.0.0.0 рд▓рд╛ bind рдХреЗрд▓реЗ рддрд░ рдпреЗрддреЛ тАФ container рдЪреА рдЪреВрдХ рдПрдХрд╛ рдУрд│реАрдд рд╣реАрдЪ.

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

port рдореНрд╣рдгрдЬреЗ рдЦреЛрд▓реА, socket рдореНрд╣рдгрдЬреЗ рдмрд╛рдХ, рдЖрдгрд┐ рддреБрдореНрд╣реА рдЧрд╛рдареВ рд╢рдХрддрд╛ рдЕрд╢рд╛ рдХреЛрдгрддреНрдпрд╛рд╣реА machine рд╡рд░ рдХреЛрдгрддреНрдпрд╛ рдЦреЛрд▓реНрдпрд╛ рдЙрдШрдбреНрдпрд╛ рдЖрд╣реЗрдд рддреЗ рддреБрдореНрд╣реА рд╕рд╛рдВрдЧреВ рд╢рдХрддрд╛.

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

ЁЯПн рдкреНрд░рддреНрдпрдХреНрд╖ рд╡рд╛рдкрд░рд╛рдд рд╣реЗ рдХрд╛ рдорд╣рддреНрддреНрд╡рд╛рдЪреЗ: app 8080 рд╡рд░ рдРрдХрддреЗ, health check 8081 рддрдкрд╛рд╕рддреЛ, sidecar 15020 рдШреЗрддреЛ, debugger 5005 тАФ рдкреНрд░рддреНрдпреЗрдХ incident report рдПрдХрд╛ рдЦреЛрд▓реАрдЪреЗ рдирд╛рд╡ рдШреЗрддреЛ. рдХреЛрдгрддреНрдпрд╛рд╣реА box рд╡рд░ ss -ltnp рд╣реА рдкрд╣рд┐рд▓реА command.

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

рдзрдбрд╛ 04 тАФ layers: рдкрддреНрд░рд╛рдкрд╛рд╕реВрди рд░рд╕реНрддреНрдпрд╛рдкрд░реНрдпрдВрддрдЪреА рдкреЛрд╣реЛрдЪ-рд╕рд╛рдЦрд│реА, рдЖрдгрд┐ рдкреНрд░рддреНрдпреЗрдХ layer рдлрдХреНрдд рдЖрдкрд▓реНрдпрд╛ рд╢реЗрдЬрд╛рд▒реНрдпрд╛рдВрдирд╛рдЪ рдХрд╛ рдУрд│рдЦрддреЛ.

ЁЯЪк Lesson 03 тАФ Ports & sockets: room numbers and desks

ЁЯУН You are here: Lesson 03 of 12 ┬╖ Next: lesson-04-layers


ЁЯУж What's in this branch

Lessons 01тАУ03. The room number on the envelope, and the desk where a conversation actually happens.

ЁЯзТ Explain like I'm 5

One building, many rooms. The address gets the envelope to the building; the room number gets it to the right person: room 80 is the web office, 443 the sealed web office, 22 the caretaker's door, 5432 the record room. A server sits in its room with the door open, listening. Each visitor who comes in gets their own desk тАФ a socket тАФ so the clerk can serve many at once.

ЁЯЧ║я╕П Diagram

flowchart LR
  V1["visitor 192.168.0.12:51234"] --> D1["desk 1"]
  V2["visitor 10.1.2.3:60002"] --> D2["desk 2"]
  subgraph room["ЁЯПл 93.184.216.34 тАФ room 443 (LISTENING)"]
    D1 ; D2
  end

тЭУ What

ЁЯдФ Why

"Address already in use", "connection refused", "which process has port 8080", "the app listens on localhost but the container can't see it" тАФ all room questions. Firewalls (lesson 10) are lists of rooms; load balancers (lesson 11) are desks in front of rooms.

ЁЯФз How (in this repo)

ports() calls connect_ex on each well-known port with a 200 ms timeout: 0 means someone answered the knock. tcp() prints getsockname() and getpeername() тАФ the two ends of one connection.

ЁЯзк Try it

python3 net/demo.py ports
python3 -m http.server 8080 &           # open room 8080
python3 net/demo.py ports | grep 8080   # now it says open
ss -ltnp 2>/dev/null || lsof -nP -iTCP -sTCP:LISTEN   # who is listening where
kill %1

тЬЕ Verify тАФ what you should see

8080 тАж closed before, open тЖР someone is listening after; ss/lsof names python on *:8080. Bind to 127.0.0.1 and other machines cannot reach it; bind to 0.0.0.0 and they can тАФ that is the container mistake in one line.

ЁЯПБ What you just proved

A port is a room, a socket is a desk, and you can tell which rooms are open on any machine you can reach.

тЪая╕П Common mistakes

ЁЯПн Why this matters in production: the app listens on 8080, the health check probes 8081, the sidecar takes 15020, the debugger 5005 тАФ every incident report names a room. ss -ltnp is the first command on any box.

тПня╕П Next

Lesson 04 тАФ the layers: the delivery chain from letter to road, and why each layer only knows its neighbours.

тЖР Previousip addressesNext тЖТlayers

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