ЁЯУи рдзрдбрд╛ 07 тАФ wire рд╡рд░рдЪреЗ HTTP: рд▓рдЦреЛрдЯреНрдпрд╛рддрд▓реА рдЪрд┐рдареНрдареА
ЁЯУН рддреБрдореНрд╣реА рдЗрдереЗ рдЖрд╣рд╛рдд: 12 рдкреИрдХреА рдзрдбрд╛ 07 ┬╖ рдкреБрдвреЗ: lesson-08-tls
ЁЯУж рдпрд╛ рдмреНрд░рдБрдЪрдордзреНрдпреЗ рдХрд╛рдп рдЖрд╣реЗ
рдзрдбреЗ 01тАУ07. API рд╢рд╛рд│реЗрдЪреА request рдЪреА рдЪрд┐рдареНрдареА, TCP stream рд╡рд░рдЪреЗ bytes рдореНрд╣рдгреВрди, рдЖрдгрд┐ HTTP/1.1, HTTP/2 рдЖрдгрд┐ HTTP/3 рдиреЗ рд▓рдЦреЛрдЯреНрдпрд╛рдмрджреНрджрд▓ рдХрд╛рдп рдмрджрд▓рд▓реЗ.
- net/demo.py тАФ
http: port 80 рд╡рд░ рд╣рд╛рддрд╛рдиреЗ рдЯрд╛рдЗрдк рдХреЗрд▓реЗрд▓рд╛ GET; status line рдЖрдгрд┐ headers рдкрд░рдд рд╡рд╛рдЪрд▓реЗрд▓реЗ
ЁЯзТ 5 рд╡рд░реНрд╖рд╛рдВрдЪреНрдпрд╛ рдореБрд▓рд╛рд▓рд╛ рд╕рдордЬрд╛рд╡рд▓реНрдпрд╛рд╕рд╛рд░рдЦреЗ
API рд╢рд╛рд│реЗрдиреЗ рдЪрд┐рдареНрдареА рд╢рд┐рдХрд╡рд▓реА: method, path, headers, body, рдЖрдгрд┐ рдХрд╛рд░рдХреБрдирд╛рдЪрд╛ рд╢рд┐рдХреНрдХрд╛. рд╣рд╛ рдзрдбрд╛ рд▓рдЦреЛрдЯрд╛ рдЙрдШрдбрддреЛ: рдЪрд┐рдареНрдареА рдореНрд╣рдгрдЬреЗ рдлрдХреНрдд рдУрд│реА рддреЛрдбрд▓реЗрд▓рд╛ рдордЬрдХреВрд░, TCP stream рдордзреНрдпреЗ рд▓рд┐рд╣рд┐рд▓реЗрд▓рд╛, рдЖрдгрд┐ рд╢рд┐рдХреНрдХрд╛ рддреНрдпрд╛рдЪ рдорд╛рд░реНрдЧрд╛рдиреЗ рдкрд░рдд рдпреЗрддреЛ. HTTP/1.1 рдкреБрдврдЪреНрдпрд╛ рдЪрд┐рдареНрдареАрд╕рд╛рдареА рд▓рдЦреЛрдЯрд╛ рдЙрдШрдбрд╛ рдареЗрд╡рддреЛ (keep-alive); HTTP/2 рдПрдХрд╛рдЪ рд▓рдЦреЛрдЯреНрдпрд╛рдд рдПрдХрд╛рдЪ рд╡реЗрд│реА рдЕрдиреЗрдХ рдЪрд┐рдареНрдареНрдпрд╛ рдкрд╛рдард╡реВ рджреЗрддреЛ; HTTP/3 рдиреЛрдВрджрдгреАрдХреГрдд рдЯрдкрд╛рд▓рд╛рдРрд╡рдЬреА рдПрдХрд╛ рд╣реБрд╢рд╛рд░ рд▓рд╛рдЙрдбрд╕реНрдкреАрдХрд░рд╡рд░ (QUIC) рдЬрд╛рддреЛ, рдореНрд╣рдгрдЬреЗ рдПрдХ рдкрд╛рди рд╣рд░рд╡рд▓реЗ рддрд░реА рдмрд╛рдХреАрдЪреА рдЕрдбрдХреВрди рд░рд╛рд╣рдд рдирд╛рд╣реАрдд.
ЁЯЧ║я╕П рдЖрдХреГрддреА
sequenceDiagram
participant C as client
participant S as server :80
C->>S: GET / HTTP/1.1\r\nHost: example.com\r\nConnection: close\r\n\r\n
S->>C: HTTP/1.1 200 OK\r\nContent-Type: text/html\r\nContent-Length: 571\r\n\r\n<html>тАж
тЭУ рдХрд╛рдп
- Request:
METHOD path HTTP/1.1, header рдЪреНрдпрд╛ рдУрд│реА, рдПрдХ рд░рд┐рдХрд╛рдореА рдУрд│, рд╣рд╡реА рддрд░ body. Response:HTTP/1.1 status reason, headers, рд░рд┐рдХрд╛рдореА рдУрд│, body. рдУрд│реА\r\nрдиреЗ рд╕рдВрдкрддрд╛рдд.HostрдЖрд╡рд╢реНрдпрдХ рдЖрд╣реЗ (рдПрдХрд╛ рдкрддреНрддреНрдпрд╛рд╡рд░ рдЕрдиреЗрдХ sites). - Keep-alive: HTTP/1.1 connection рдкреБрдиреНрд╣рд╛ рд╡рд╛рдкрд░рддреЛ;
Connection: closeрддреЗ рд╕рдВрдкрд╡рддреЛ. body рдХреБрдареЗ рдерд╛рдВрдмрддреЗ рддреЗContent-LengthрдХрд┐рдВрд╡рд╛ chunked encoding рд╕рд╛рдВрдЧрддреЗ (stream рд▓рд╛ рдХрдбрд╛ рдирд╕рддрд╛рдд тАФ рдзрдбрд╛ 05). - HTTP/2: binary frames, рдПрдХрд╛рдЪ TCP connection рд╡рд░ multiplex рдХреЗрд▓реЗрд▓реЗ рдЕрдиреЗрдХ streams, header compression. HTTP/3: рддреЗрдЪ QUIC (UDP) рд╡рд░, head-of-line blocking рдирд╛рд╣реА, TLS рдЖрддрдЪ рдЕрд╕рд▓реНрдпрд╛рдиреЗ рдЬрд▓рдж handshake.
ЁЯдФ рдХрд╛
рдХрдЪреНрдЪреЗ HTTP рд╡рд╛рдЪрддрд╛ рдпреЗрдгреЗ рд╣рд╛рдЪ proxies, CORS, redirects, caching headers рдЖрдгрд┐
"curl рдиреЗ рдЪрд╛рд▓рддреЗ рдкрдг browser рдордзреНрдпреЗ рдирд╛рд╣реА" debug рдХрд░рдгреНрдпрд╛рдЪрд╛ рдорд╛рд░реНрдЧ рдЖрд╣реЗ. curl -v рдиреЗрдордХреНрдпрд╛
рдпрд╛рдЪ рдУрд│реА рджрд╛рдЦрд╡рддреЛ; рдЖрддрд╛ рддреБрдореНрд╣реА рддреНрдпрд╛ рд╡рд╛рдЪреВ рд╢рдХрддрд╛.
ЁЯФз рдХрд╕реЗ (рдпрд╛ repo рдордзреНрдпреЗ)
http() рдЪрд╛рд░ рдУрд│реА рд╣рд╛рддрд╛рдиреЗ рд▓рд┐рд╣рд┐рддреЛ, server рдмрдВрдж рдХрд░реЗрдкрд░реНрдпрдВрдд рд╡рд╛рдЪрддреЛ, рдкрд╣рд┐рд▓реНрдпрд╛ рд░рд┐рдХрд╛рдореНрдпрд╛
рдУрд│реАрд╡рд░ рддреЛрдбрддреЛ, рдЖрдгрд┐ status line рд╕реЛрдмрдд рддреАрди headers рдЫрд╛рдкрддреЛ. рдмрд╛рд░рд╛ рдУрд│реАрдВрдд рд╣рд╛ рдПрдХ рдкреВрд░реНрдг
HTTP client рдЖрд╣реЗ тАФ рдкреНрд░рддреНрдпреЗрдХ framework рдореНрд╣рдгрдЬреЗ рд╣реЗрдЪ, рдЕрдзрд┐рдХ рдХрд╛рд╣реА рдЕрдкрд╡рд╛рджрд╛рддреНрдордХ рдкреНрд░рдХрд░рдгреЗ.
ЁЯзк рдХрд░реВрди рдкрд╛рд╣рд╛
python3 net/demo.py http
printf 'GET / HTTP/1.1\r\nHost: example.com\r\nConnection: close\r\n\r\n' | nc example.com 80 | head -12 # by hand, no Python
curl -sv http://example.com -o /dev/null 2>&1 | grep -E '^(>|<)' # the same lines, from the grown-up tool
curl -sI --http2 https://example.com | head -3 # HTTP/2 when TLS is on
тЬЕ рддрдкрд╛рд╕рд╛ тАФ рддреБрдореНрд╣рд╛рд▓рд╛ рдХрд╛рдп рджрд┐рд╕рд╛рдпрд▓рд╛ рд╣рд╡реЗ
HTTP/1.1 200 OK, рдПрдХ Content-Type: text/html header, body: 571 bytes
(рдХрд┐рдВрд╡рд╛ рд╕рд╛рдзрд╛рд░рдг рддрд┐рддрдХреЗ). nc рдЕрдЧрджреА рддреНрдпрд╛рдЪ рдУрд│реА рджрд╛рдЦрд╡рддреЛ. curl --http2
HTTP/2 200 рд╕рд╛рдВрдЧрддреЛ.
ЁЯПБ рддреБрдореНрд╣реА рдЖрддреНрддрд╛рдЪ рдХрд╛рдп рд╕рд┐рджреНрдз рдХреЗрд▓реЗ
HTTP рдореНрд╣рдгрдЬреЗ stream рд╡рд░рдЪрд╛ рдордЬрдХреВрд░, рддреБрдореНрд╣реА library рд╢рд┐рд╡рд╛рдп рддреЗ рдмреЛрд▓реВ рд╢рдХрддрд╛, рдЖрдгрд┐ versions рдордзрд▓рд╛ рдлрд░рдХ рд▓рдЦреЛрдЯреНрдпрд╛рдд рдЖрд╣реЗ, рдЪрд┐рдареНрдареАрдд рдирд╛рд╣реА.
тЪая╕П рдиреЗрд╣рдореАрдЪреНрдпрд╛ рдЪреБрдХрд╛
Hostheader рд╡рд┐рд╕рд░рдгреЗ: рдЕрдиреЗрдХ servers 400 рдХрд┐рдВрд╡рд╛ рдЪреБрдХреАрдЪреА site рджреЗрдКрди рдЙрддреНрддрд░ рджреЗрддрд╛рдд.- рд░рд┐рдХрд╛рдореА рдУрд│ рд╡рд┐рд╕рд░рдгреЗ: server рддреБрдордЪреНрдпрд╛ headers рдЪреНрдпрд╛ рд╢реЗрд╡рдЯрд╛рдЪреА рдХрд╛рдпрдо рд╡рд╛рдЯ рдкрд╛рд╣рдд рд░рд╛рд╣рддреЛ.
- HTTP/2 рд╕рд╛рдареА рдирд╡рд╛ code рд▓рд╛рдЧрддреЛ рдЕрд╕реЗ рдЧреГрд╣реАрдд рдзрд░рдгреЗ: API рд╢рд╛рд│реЗрдЪрд╛ counter рдЬрд╕рд╛рдЪреНрдпрд╛ рддрд╕рд╛ рдЖрд╣реЗ; proxy рддреЗ рдмреЛрд▓рддреЛ.
ЁЯПн рдкреНрд░рддреНрдпрдХреНрд╖ рд╡рд╛рдкрд░рд╛рдд рд╣реЗ рдХрд╛ рдорд╣рддреНрддреНрд╡рд╛рдЪреЗ: proxy рдХрдбреВрди рдЖрд▓реЗрд▓рд╛ 502,
Content-Lengthрдирд╕рд▓реНрдпрд╛рдиреЗ рдЕрдбрдХрд▓реЗрд▓реА request,Cache-ControlрдХрдбреЗ рджреБрд░реНрд▓рдХреНрд╖ рдХрд░рдгрд╛рд░рд╛ CDN тАФ рдУрд│реА рдорд╛рд╣реАрдд рдЭрд╛рд▓реНрдпрд╛ рдХреА рд╣реЗ рд╕рдЧрд│реЗcurl -vрдордзреНрдпреЗ рд╡рд╛рдЪрддрд╛ рдпреЗрддреЗ.
тПня╕П рдкреБрдвреЗ
рдзрдбрд╛ 08 тАФ TLS рдЖрдгрд┐ certificates: рд╕реАрд▓ рдХреЗрд▓реЗрд▓рд╛ рд▓рдЦреЛрдЯрд╛, рдЖрдгрд┐ padlock рдХрд╛рдп рд╡рдЪрди рджреЗрддреЛ рдЖрдгрд┐ рдХрд╛рдп рджреЗрдд рдирд╛рд╣реА.