Lập trình 22/09/2026 6 phút

Trạng thái socket TCP: đọc /proc/net/tcp để phân biệt TIME_WAIT bình thường với CLOSE_WAIT là bug

Một kết nối TCP đi qua nhiều trạng thái, và hai trong số đó hay gây sự cố: TIME_WAIT và CLOSE_WAIT. Bài này chạy thật trong Go đọc /proc/net/tcp: mở 3000 kết nối ngắn để lại 3091 TIME_WAIT (ăn cổng cục bộ), còn server quên gọi Close để lại đúng 200 CLOSE_WAIT (rò rỉ fd). Giải thích vì sao TIME_WAIT là bình thường còn CLOSE_WAIT tăng không giảm luôn là bug.

Lập trình 22/09/2026 6 phút

CBOR: người anh em chuẩn hóa của MessagePack, và vì sao IETF cần thêm một định dạng

CBOR (RFC 8949) gần như MessagePack: nhị phân, tự mô tả, cùng ý tưởng byte format. Vậy sao IETF lại chuẩn hóa thêm một định dạng? Bài này đo thật: cùng đơn hàng, CBOR 339 byte nhỏ hơn cả MessagePack 392 và JSON 440, mã hóa nhanh nhất trong ba. Nhưng khác biệt lớn nhất là CBOR có tag ngữ nghĩa và là chuẩn IETF — nền tảng của WebAuthn, COSE, CWT, IoT.

Lập trình 22/09/2026 6 phút

Băng thông vs độ trễ: vì sao đường 'nhanh' vẫn có thể truyền chậm

Băng thông và độ trễ là hai đại lượng khác nhau nhưng hay bị gộp làm 'nhanh'. Bài này chạy thật trong Go: đo throughput 10,5 GB/s và RTT 3µs riêng biệt, tính Bandwidth-Delay Product, và chứng minh cửa sổ nhỏ làm throughput sụt từ 12 GB/s xuống gần 0 — dù băng thông vật lý không đổi. Giải thích vì sao đường dài băng thông cao vẫn chậm nếu cửa sổ nhỏ hơn BDP.

Lập trình 22/09/2026 6 phút

HTTP/2 multiplexing: 300 request song song trên đúng một kết nối

HTTP/1.1 chỉ chạy một request tại một thời điểm trên mỗi kết nối (head-of-line blocking), nên phải mở nhiều kết nối để làm việc song song. HTTP/2 đan xen nhiều stream trên một kết nối. Bài này chạy thật trong Go: 300 request song song qua HTTP/2 mở 0 kết nối mới (dùng lại 1 kết nối), còn HTTP/1.1 mở 221 — và HTTP/2 nhanh gấp gần 4 lần. Kèm lý do vì sao vẫn cần HTTP/3.

Lập trình 22/09/2026 6 phút

Chẩn đoán mạng: khi 'mạng chậm', tách một request ra là biết ngay lỗi ở tầng nào

Khép lại loạt Mạng: khi ai đó nói 'mạng chậm', đừng đoán mò — tách một request thành DNS, TCP, TLS, TTFB rồi nhìn phần nào lớn nhất. Bài này chạy thật bằng httptrace: một request tới coffeecode.vn cho thấy DNS+TCP+TLS chỉ ~8ms nhưng TTFB tận 2015ms — nghĩa là mạng hoàn toàn ổn, server mới là thủ phạm. Kèm cây chẩn đoán triệu chứng → tầng → công cụ nối lại cả 12 phần.

Lập trình 22/09/2026 6 phút

Rate limiting: cho phép burst nhưng giữ tốc độ bền vững đúng ngưỡng

Traffic dồn dập làm quá tải hệ hoặc bị lạm dụng — rate limiting chặn phần vượt ngưỡng. Bài này chạy thật trong Go: token bucket giới hạn 100/s cho cụm 100 request đầu qua ngay (burst) rồi giữ đúng 100 req/s bền vững; đo được 1000 request tức thì chỉ 100 qua, và 3 giây liên tục cho qua chính xác 100 req/s. Giải thích token bucket vs leaky bucket và khi nào dùng cái nào.