HTTP và Web sâu: hiểu giao thức từ dây cáp lên
Sê-ri mổ xẻ HTTP, TLS và web server bằng công cụ thật (curl, openssl, nginx) — mỗi bài một demo đo được.
12/12 phần đã đăng
Web
1
Một request HTTP đi qua dây cáp: thực ra chỉ là text gõ đúng khuôn trên TCP
Nhiều người dùng HTTP mỗi ngày qua thư viện mà chưa từng thấy một request thô trông thế nào. Sự thật đơn giản đến bất ngờ: HTTP là vài dòng text kết thúc bằng CRLF, gửi qua một socket TCP. Bài này xem thô bằng curl --trace-ascii, rồi tự gõ tay một request bằng socket Python không dùng thư viện HTTP nào — và server vẫn trả lời.
22/09/2026
· 5 phút đọc
2
Ba header HTTP quyết định: Host, Content-Type, và Content-Length vs chunked
Vì sao hàng nghìn website chung một địa chỉ IP vẫn phân biệt được nhau? Vì sao có response biết trước độ dài, có response gửi theo từng khúc? Bài này đo thật ba header cốt lõi: Host cho virtual hosting, Content-Type quyết client hiểu body thế nào, và cặp loại trừ Content-Length vs Transfer-Encoding chunked — xem tận byte khung chunk.
22/09/2026
· 5 phút đọc
3
Mã trạng thái và redirect HTTP: 301 vs 302 vs 307/308, và bẫy đổi POST thành GET
Ai cũng biết 404 và 500, nhưng khác biệt thật giữa 301 và 302, giữa 307 và 308 thì nhiều người mơ hồ. Điểm mấu chốt không chỉ là vĩnh viễn hay tạm thời — mà là có giữ nguyên phương thức POST hay không. Bài này đo thật: 301/302 âm thầm đổi POST thành GET, 307/308 giữ nguyên, và một vòng lặp redirect dừng ở đâu.
22/09/2026
· 6 phút đọc
4
HTTP keep-alive: vì sao mở lại kết nối cho mỗi request là lãng phí — đo thật
Trước khi gửi được một byte dữ liệu, mỗi kết nối mới phải trả giá: tra DNS, bắt tay TCP ba bước, rồi bắt tay TLS. Keep-alive giữ kết nối mở để tái dùng. Bài này đo thật: một handshake tốn ~69ms tới byte đầu, 6 request keep-alive dùng 1 kết nối thay vì 6, và 300 request tái dùng nhanh gấp ~19 lần so với mở mới mỗi lần.
22/09/2026
· 6 phút đọc
5
HTTP/1.1 vs HTTP/2: multiplexing nhiều luồng trên một kết nối — đo thật
HTTP/1.1 gửi request tuần tự trên mỗi kết nối, nên response chậm chặn hết phần sau (head-of-line blocking) — trình duyệt phải mở tới 6 kết nối để lách. HTTP/2 chia message thành frame nhị phân, đan xen nhiều luồng trên một kết nối. Bài này đo thật bằng nginx và curl: thương lượng giao thức, log server xác nhận, và multiplexing nhanh hơn khi tải nhiều tài nguyên.
22/09/2026
· 6 phút đọc
6
Cache HTTP: Cache-Control, ETag và cú 304 Not Modified — đo thật
Cache HTTP có hai cơ chế tách bạch mà nhiều người trộn lẫn: hết hạn (Cache-Control/max-age — client không hỏi server chút nào) và xác thực lại (ETag/Last-Modified — client hỏi còn mới không, server đáp 304 nếu chưa đổi). Bài này đo thật bằng nginx và curl: một request có điều kiện trả 304 không body, và ETag đổi khi nội dung đổi.
22/09/2026
· 5 phút đọc
7
Cookie và session: cách web nhớ bạn, và ba thuộc tính chặn tấn công
HTTP không có trạng thái — mỗi request độc lập, server không tự biết ai gửi. Cookie là cách vá: server gửi Set-Cookie, client tự gửi lại ở mọi request sau. Bài này đo thật luồng session bằng curl, và mổ ba thuộc tính bảo mật sống còn: HttpOnly chống XSS trộm cookie, Secure buộc HTTPS, SameSite chống CSRF.
22/09/2026
· 5 phút đọc
8
Nén nội dung HTTP: gzip vs brotli vs zstd — đo tỉ lệ nén thật
Một trang HTML 224 KB có thể xuống còn 16 KB trên đường truyền mà người dùng không hề hay biết. Cơ chế: client mời (Accept-Encoding), server chọn (Content-Encoding), nén trong suốt hai đầu. Bài này đo thật tỉ lệ nén của gzip, brotli, zstd trên một trang HTML thật, và xem nginx thương lượng nén qua HTTP.
22/09/2026
· 5 phút đọc
9
TLS handshake từng bước: xem tận mắt bằng openssl s_client
Trước khi một byte HTTPS chạy, client và server làm một cuộc bắt tay TLS: thỏa thuận phiên bản, chọn cipher, trao khóa tạm, và server chứng minh danh tính bằng chứng chỉ. Bài này dùng openssl s_client -msg để xem từng handshake message thật của TLS 1.3 (ClientHello, ServerHello, Certificate, Finished), so TLS 1.3 với 1.2, và đọc chuỗi chứng chỉ.
22/09/2026
· 5 phút đọc
10
Chứng chỉ X.509 và chuỗi tin cậy: vì sao trình duyệt tin server — tự dựng CA để hiểu
Cái ổ khóa xanh trên trình duyệt dựa trên một chuỗi tin cậy: cert của site được một CA ký, CA đó lại được CA gốc ký, và trình duyệt chỉ tin sẵn vài CA gốc. Bài này tự dựng một CA rồi ký cert cho web.local bằng openssl, đọc cấu trúc cert (subject, issuer, SAN, hạn), và chứng minh xác thực chuỗi thành công với CA đúng, thất bại với CA sai.
22/09/2026
· 6 phút đọc
11
Nginx reverse proxy: một cửa trước nhiều backend — đo round-robin và X-Forwarded
Reverse proxy đứng trước các server, thay mặt chúng trả lời client: cân bằng tải, kết thúc TLS, gom nhiều service sau một tên miền. Bài này dựng nginx proxy tới 3 backend, đo round-robin chia đúng 10/10/10 trên 30 request, và giải thích vì sao thiếu header X-Forwarded-* làm backend thấy sai IP và giao thức của client.
22/09/2026
· 5 phút đọc
12
Nginx phục vụ tĩnh và tối ưu hiệu năng: sendfile, cache, và đo bằng ab
Nginx phục vụ file tĩnh nhanh đến mức nào? Bài cuối sê-ri đo thật: sendfile (zero-copy) cho thông lượng ~281 MB/s và 4301 request/giây trên file 68KB, Cache-Control để trình duyệt khỏi tải lại, gzip nén 156 KB xuống 1.2 KB. Kèm một cái bẫy đo lường: ab mặc định HTTP/1.0 nên không nhận gzip — phải đo tỉ lệ nén bằng curl.
22/09/2026
· 6 phút đọc