Module 2 — Tổng kết & cheat sheet
Recap toàn cảnh HTTP & Web: cheat sheet status code, so sánh HTTP/1.1-2-3, REST/gRPC/WS/SSE, kiến trúc web edge client→CDN→LB→proxy→app. Glossary 18 thuật ngữ, pitfall tổng hợp, self-assessment.
TL;DR: Module 2 xây dựng tầng Application từ byte HTTP thô đến toàn bộ kiến trúc cạnh (edge): anatomy request/response, headers quan trọng, cookie/session/CORS, ba thế hệ HTTP, bốn pattern truyền thông (REST/gRPC/WS/SSE), caching/CDN, reverse proxy Nginx, và load balancing L4/L7. Trang này gom lại thành cheat sheet một trang để bookmark và tra nhanh. Nếu bạn giải thích được vì sao request bị chặn CORS, chọn được WebSocket thay REST cho một use case, và vẽ được luồng client → CDN → LB → Nginx → app, bạn đã sẵn sàng cho module 3.
Đã đi qua những gì
Bạn bắt đầu từ anatomy một HTTP request: method nói lên ý định (GET đọc, POST tạo, PUT/PATCH sửa, DELETE xoá), status code nói lên kết quả (1xx thông tin, 2xx thành công, 3xx chuyển hướng, 4xx lỗi client, 5xx lỗi server), và header truyền metadata không nằm trong body.
Tiếp theo là headers quan trọng nhất: Content-Type khai báo định dạng body, Authorization mang credential, Cache-Control điều khiển caching, ETag cho conditional request, và nhóm X-Forwarded-* khi có proxy.
Cookie và session cho thấy HTTP vốn stateless — cookie là cách duy nhất browser lưu state giữa các request. Các thuộc tính HttpOnly, Secure, SameSite bảo vệ cookie khỏi XSS và CSRF. CORS giải thích vì sao browser chặn request cross-origin và cách server cấp phép qua Access-Control-Allow-Origin.
Ba thế hệ HTTP giải quyết cùng một vấn đề — truyền dữ liệu — nhưng với hiệu năng khác nhau: HTTP/1.1 dùng nhiều TCP connection song song (head-of-line blocking per connection), HTTP/2 multiplexing nhiều stream trên một TCP connection (nhưng HOL blocking ở TCP), HTTP/3 chuyển sang QUIC/UDP để loại HOL blocking hoàn toàn.
Bốn pattern truyền thông phục vụ bốn nhu cầu: REST cho CRUD API stateless, gRPC cho internal microservice cần hiệu năng + contract mạnh, WebSocket cho real-time hai chiều (chat, game), SSE cho server push một chiều (notification, live feed).
Caching và CDN giảm tải origin và giảm latency: browser cache → CDN edge → origin. Cache-Control xác định TTL; ETag + conditional GET tránh truyền lại body khi không đổi. CDN đưa content tới gần user địa lý.
Reverse proxy Nginx đứng trước backend: TLS termination, routing theo path, rate limiting, static serving, header forwarding. Backend chạy HTTP thuần nội bộ.
Load balancer L4/L7 scale ngang: L4 routing theo TCP (nhanh, TLS passthrough), L7 routing theo HTTP content (linh hoạt, TLS termination). Thuật toán round-robin/least-conn/IP hash. Health check + failover. Sticky session là tình thế — Redis là giải pháp đúng.
🗺️ Cheat sheet
Status code tra nhanh
| Code | Nghĩa | Hay gặp khi |
|---|---|---|
200 OK | Thành công | GET/PUT/DELETE thành công |
201 Created | Tạo thành công | POST tạo resource |
204 No Content | Thành công, không body | DELETE, PUT không trả body |
301 Moved Permanently | Redirect vĩnh viễn | Đổi domain, HTTP → HTTPS |
302 Found | Redirect tạm | Login redirect |
304 Not Modified | Cache còn hợp lệ | ETag match → không truyền body |
400 Bad Request | Request sai format | Thiếu field, sai type |
401 Unauthorized | Chưa xác thực | Thiếu/hết hạn token |
403 Forbidden | Không có quyền | Token valid nhưng thiếu role |
404 Not Found | Resource không tồn tại | Sai URL, đã bị xoá |
405 Method Not Allowed | Method sai | DELETE tới endpoint chỉ có GET |
429 Too Many Requests | Rate limit | Quá nhiều request/giây |
500 Internal Server Error | Lỗi server | Unhandled exception |
502 Bad Gateway | Upstream không trả lời | Backend down, Nginx không kết nối được |
503 Service Unavailable | Server quá tải / maintenance | Deployment, circuit breaker |
504 Gateway Timeout | Upstream timeout | Backend quá chậm |
HTTP/1.1 vs HTTP/2 vs HTTP/3
| HTTP/1.1 | HTTP/2 | HTTP/3 | |
|---|---|---|---|
| Transport | TCP | TCP | QUIC (UDP) |
| Multiplexing | Không (pipeline fragile) | Có (stream trên 1 TCP) | Có (stream độc lập) |
| HOL Blocking | Per-connection (nhiều TCP giải quyết) | TCP-level (1 gói lost block mọi stream) | Không (QUIC stream độc lập) |
| Header compression | Không | HPACK | QPACK |
| Connection setup | TCP 1RTT | TCP 1RTT + TLS 1RTT | QUIC 0-1RTT |
| TLS | Tuỳ chọn | Tuỳ chọn (thực tế bắt buộc) | Bắt buộc (tích hợp trong QUIC) |
| Dùng khi | Mọi nơi (fallback) | Hầu hết web hiện đại | CDN, mobile, latency nhạy cảm |
REST vs gRPC vs WebSocket vs SSE
| REST | gRPC | WebSocket | SSE | |
|---|---|---|---|---|
| Protocol | HTTP/1.1-2 | HTTP/2 | WS (upgrade từ HTTP) | HTTP (chunked) |
| Format | JSON (thường) | Protobuf (binary) | Binary/text tuỳ app | Text (event stream) |
| Hướng | Request-Response | Request-Response + streaming | Full-duplex | Server → Client |
| Contract | Tuỳ convention | .proto file (strict) | Không | Không |
| Browser | Có | Hạn chế (cần grpc-web) | Có | Có |
| Dùng khi | Public API, CRUD | Internal microservice, performance | Chat, game, collaboration | Notification, live feed |
Kiến trúc web edge — luồng request production
flowchart LR
C["Client"] --> CDN["CDN Edge<br/>(cache static)"]
CDN --> LB["Load Balancer L7<br/>(round-robin / least-conn)"]
LB --> N1["Nginx<br/>(TLS term + rate limit)"]
LB --> N2["Nginx<br/>(TLS term + rate limit)"]
N1 --> A1["App Instance 1"]
N1 --> A2["App Instance 2"]
N2 --> A1
N2 --> A2
A1 --> DB["DB + Redis<br/>(session store)"]
A2 --> DB📖 Glossary
| Thuật ngữ | Định nghĩa 1 câu |
|---|---|
| Method | Động từ HTTP nói lên ý định: GET (đọc), POST (tạo), PUT (thay toàn bộ), PATCH (sửa một phần), DELETE (xoá). |
| Idempotent | Request gửi nhiều lần cho kết quả giống như gửi một lần — GET, PUT, DELETE idempotent; POST thì không. |
| Status code class | Nhóm theo chữ số đầu: 2xx thành công, 3xx redirect, 4xx lỗi client, 5xx lỗi server. |
| ETag | Token định danh phiên bản resource; client gửi lại trong If-None-Match để tránh tải lại body khi không đổi. |
| CORS | Cross-Origin Resource Sharing — cơ chế browser xin phép server khác origin cho phép request cross-origin. |
| Preflight | Request OPTIONS browser tự gửi trước request CORS phức tạp để kiểm tra server có cho phép không. |
| SameSite | Thuộc tính cookie kiểm soát khi nào cookie được gửi kèm request cross-site: Strict, Lax, None. |
| Multiplexing | Gửi nhiều request/response song song trên một kết nối TCP duy nhất — tính năng cốt lõi HTTP/2. |
| HPACK | Thuật toán nén header HTTP/2 — giảm kích thước header bằng cách dùng bảng tĩnh + bảng động. |
| QUIC | Giao thức transport do Google phát triển, chạy trên UDP, tích hợp TLS, không có HOL blocking TCP — nền của HTTP/3. |
| HOL Blocking | Head-of-Line Blocking — một gói bị mất khiến mọi stream/request khác phải chờ; HTTP/2 còn bị ở TCP, HTTP/3 không còn. |
| CDN | Content Delivery Network — mạng server phân tán toàn cầu cache nội dung, đưa response về gần user hơn. |
| Reverse proxy | Server đứng trước backend, nhận request từ client rồi chuyển tiếp — client không biết backend thật. |
| Forward proxy | Proxy phía client: client cấu hình để request đi qua proxy trước khi ra internet. |
| L4 LB | Load balancer tầng 4 (Transport/TCP): định tuyến theo IP + port, không đọc HTTP, TLS passthrough. |
| L7 LB | Load balancer tầng 7 (Application/HTTP): đọc URL/header/cookie, định tuyến thông minh, TLS termination. |
| Sticky session | Session affinity — LB ghim user vào cùng server dựa theo IP hoặc cookie; tình thế khi session in-memory. |
| TLS termination | Nginx/LB giải mã HTTPS, backend nhận HTTP thuần nội bộ — tập trung certificate management tại proxy. |
⚠️ Pitfall tổng hợp
- Nhầm
401và403:401 Unauthorizednghĩa là "chưa xác thực" (ai gửi request này?),403 Forbiddennghĩa là "đã xác thực nhưng không có quyền". Nhầm khiến client debug sai hướng. - CORS không phải lỗi server: lỗi CORS xảy ra ở browser, không phải ở server hay network. Server nhận được request và trả response — browser chặn không cho JS đọc response đó. Log server không thấy gì.
- HTTP/2 không tự động nhanh hơn với 1 file lớn: lợi ích HTTP/2 rõ nhất khi tải nhiều asset nhỏ song song. Tải 1 file lớn duy nhất qua HTTP/1.1 hay HTTP/2 gần như như nhau.
X-Forwarded-Forbị giả mạo: client tự thêm header giả trước khi gửi request. Strip header từ client, chỉ tin giá trị proxy của bạn set.- Sticky session + server down: session mất theo server chết — user bị đăng xuất đột ngột. Giải pháp đúng là external session store (Redis).
- Health check trả
200nhưng DB unreachable: server trông healthy nhưng mọi request thật đều fail. Deep health check cần kiểm tra dependency thật. proxy_passtrailing slash:proxy_pass http://backend/cắt prefixlocation,proxy_pass http://backendgiữ nguyên path — nhầm gây 404 hoặc double path ở backend.
✅ Self-assessment
Bạn đã đạt module này nếu trả lời được:
- Explain được status code và header HTTP/1.1-2-3: vì sao
401khác403,ETagdùng để làm gì, HTTP/2 multiplexing giải quyết vấn đề gì so với HTTP/1.1 và HTTP/3 giải quyết thêm gì.- Nếu chưa: đọc lại bài 01 (HTTP anatomy), bài 02 (headers), bài 04 (HTTP/2), bài 05 (HTTP/3 QUIC).
- Choose được giữa REST, gRPC, WebSocket, SSE cho từng bài toán: public API dùng gì, chat app dùng gì, live notification dùng gì, internal microservice cần hiệu năng dùng gì.
- Nếu chưa: đọc lại bài 06 (REST/gRPC/WS/SSE) phần so sánh và use case.
- Design được caching/CDN/reverse-proxy/load-balancer cho web scale: vẽ được luồng client → CDN → LB → Nginx → app pool → Redis, giải thích vai trò từng tầng và khi nào sticky session cần/không cần.
- Nếu chưa: đọc lại bài 07 (caching/CDN), bài 08 (Nginx reverse proxy), bài 09 (LB L4/L7).
🚀 What's next
Module 2 hoàn thiện tầng Application. Module 3 — TLS & Công cụ Debug — đào sâu vào lớp bảo mật nằm dưới HTTP: TLS handshake hoạt động ra sao, certificate chain được xác thực thế nào, và cách dùng openssl s_client, curl -v, Wireshark để debug khi mọi thứ không hoạt động như kỳ vọng. Biết debug TLS là kỹ năng phân biệt engineer nắm công cụ với người chỉ biết dùng.
Bài tiếp theo: Module 3 — TLS & Công cụ Debug: tổng quan
📚 Tài liệu mở rộng
- High Performance Browser Networking (Ilya Grigorik, O'Reilly) — chương 2-4 về TCP, TLS, HTTP/1-2; chương 12 về HTTP/2; toàn bộ cuốn sách này là reference chuẩn nhất về networking cho web developer. Đọc miễn phí tại hpbn.co.
- RFC 9110 — HTTP Semantics: định nghĩa method, status code, header — nơi tra cứu khi cần biết "đúng ra 204 có được có body không?".
- RFC 9113 — HTTP/2: multiplexing, HPACK, stream priority.
- RFC 9114 — HTTP/3: QUIC transport, QPACK header compression.
- MDN Web Docs — HTTP: developer.mozilla.org/en-US/docs/Web/HTTP — reference nhanh cho mọi header, method, status code, với ví dụ thực tế và browser compatibility.
Bài này đáng gửi cho bạn học cùng?
Copy link đã gắn nguồn — dán group, chat, hoặc LinkedIn.
Bài này có giúp bạn hiểu bản chất không?
Hỏi đáp về bài này
Chưa có câu hỏi
Có gì chưa rõ trong bài? Đặt câu hỏi đầu tiên — câu trả lời từ cộng đồng giúp bạn (và người sau).
Đặt câu hỏi đầu tiên