Web 22/09/2026 5 phút

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.

Web 22/09/2026 5 phút

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.

Web 22/09/2026 6 phút

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.

Web 22/09/2026 6 phút

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.

Web 22/09/2026 6 phút

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.

Web 22/09/2026 5 phút

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.