TCP, HTTP & Web cho Backend/Latency vs throughput — vì sao 'thêm server' không luôn nhanh hơn
27/29
Bài 27 / 29~20 phútTLS & Công cụ DebugMiễn phí lượt xem

Latency vs throughput — vì sao 'thêm server' không luôn nhanh hơn

Phân biệt độ trễ và thông lượng, RTT cộng dồn qua handshake, bandwidth-delay product, và vì sao tối ưu đúng metric mới có tác dụng.

TL;DR: Latency (độ trễ) là thời gian để một đơn vị dữ liệu đi từ nguồn tới đích — đo bằng ms. Throughput (thông lượng) là lượng dữ liệu truyền được trong một đơn vị thời gian — đo bằng Mbps. Hai thứ độc lập: đường ống to (throughput cao) không nghĩa là nước chảy đến nhanh hơn (latency thấp). RTT (Round-Trip Time) là latency khứ hồi; handshake nối tiếp DNS+TCP+TLS cộng dồn RTT khiến request chậm dù băng thông lớn. Tối ưu sai metric là pitfall thường gặp nhất: tăng băng thông khi nút thắt là latency, hoặc thêm server khi nghẽn ở mạng.

Hình dung một câu hỏi quen thuộc từ technical interview: "App chậm, bạn làm gì?" Câu trả lời phổ biến nhất là "thêm server" hoặc "nâng bandwidth". Hai câu trả lời này đúng trong một số trường hợp — nhưng nếu nút thắt là latency mạng, cả hai đều vô dụng.

Bài này giải thích vì sao latency và throughput là hai thứ hoàn toàn khác nhau, vì sao RTT cộng dồn qua các handshake nối tiếp định hình thời gian cảm nhận của người dùng, và cách nhìn đúng metric trước khi tối ưu.

1. Analogy — Đường cao tốc vs đường làng

Hình dung bạn cần chuyển hàng từ Hà Nội vào TP.HCM. Bạn có hai lựa chọn:

Đường làng chật hẹp, 1 xe máy: Đường hẹp (throughput thấp), nhưng nếu xe máy chạy được 80 km/h và đường thẳng không tắc, thời gian tới nơi (latency) có thể chấp nhận được.

Đường cao tốc 6 làn, 100 xe tải: Throughput rất cao — hàng trăm tấn hàng mỗi chuyến. Nhưng nếu cao tốc vẫn dài 1700 km, thời gian xe tải đầu tiên tới nơi (latency) không khác xe máy là bao.

Bây giờ hỏi: muốn chiếc hàng đầu tiên tới nhanh hơn, bạn thêm xe tải hay làm đường ngắn hơn?

Vận chuyển hàngMạng máy tính
Thời gian xe đầu tiên tới nơiLatency (ms)
Tổng tấn hàng/giờ có thể chuyểnThroughput (Mbps)
Chiều rộng làn đườngBandwidth (băng thông lý thuyết tối đa)
Khoảng cách địa lýLatency vật lý (tốc độ ánh sáng trong cáp quang)
Thêm xe tảiThêm server/worker
Làm đường ngắn hơn (CDN)Đưa content gần người dùng hơn
💡 Cách nhớ

Throughput là "bao nhiêu hàng tới trong 1 giờ". Latency là "hàng đầu tiên mất bao lâu". Thêm xe tải tăng throughput, không giảm latency. Chỉ rút ngắn khoảng cách mới giảm latency.

2. Định nghĩa chính xác

Latency

Latency là thời gian để một gói (hoặc một request) đi từ điểm A tới điểm B — đo bằng millisecond (ms). Latency có sàn vật lý không thể phá vỡ: ánh sáng trong cáp quang đi khoảng 200.000 km/s (chậm hơn ánh sáng trong chân không do hệ số khúc xạ của kính). Hà Nội — San Francisco khoảng 9.000 km → sàn latency vật lý cỡ 45ms một chiều → RTT tối thiểu cỡ 90ms, dù bạn có Gbps bandwidth.

Latency thực tế luôn cao hơn sàn vật lý vì: định tuyến không thẳng (gói phải qua nhiều hop router), xử lý tại mỗi hop, và tắc nghẽn hàng đợi (queuing delay) khi link bão hòa.

Throughput

Throughput là lượng dữ liệu thực sự truyền được qua kết nối trong một đơn vị thời gian — đo bằng Mbps hoặc Gbps. Throughput thường thấp hơn bandwidth (băng thông lý thuyết của đường truyền) vì overhead giao thức, mất gói, và cơ chế điều khiển tốc độ (congestion control TCP).

RTT — Round-Trip Time

RTT là thời gian một gói đi từ máy bạn tới đích và quay về — tức latency nhân đôi cho một vòng đi-về. Bạn đo RTT bằng ping:

ping -c 5 google.com
# PING google.com: 56 data bytes
# 64 bytes from 142.250.xxx.xxx: icmp_seq=0 ttl=117 time=18.4 ms
# 64 bytes from 142.250.xxx.xxx: icmp_seq=1 ttl=117 time=17.9 ms
# round-trip min/avg/max = 17.5/18.1/19.2 ms

RTT 18ms với Google là bình thường từ Việt Nam (server Google ở Singapore/HK). RTT sang server US có thể 150-250ms.

3. Vì sao RTT cộng dồn qua handshake

Đây là điểm quan trọng nhất bài này. Một request HTTPS không chỉ tốn 1 RTT — nó tốn tối thiểu 3 RTT nối tiếp trước khi byte dữ liệu đầu tiên tới người dùng:

sequenceDiagram
    participant B as Browser
    participant D as DNS Resolver
    participant S as Server

    B->>D: DNS query (ten mien -> IP)
    D-->>B: DNS response (RTT #1 ~ 10-50ms)

    B->>S: TCP SYN
    S-->>B: TCP SYN-ACK (RTT #2 ~ 18ms)
    B->>S: TCP ACK

    B->>S: TLS ClientHello
    S-->>B: TLS ServerHello + Cert + Finished (RTT #3 ~ 18ms voi TLS 1.3)
    B->>S: HTTP GET /
    S-->>B: HTTP 200 OK (RTT #4 ~ 18ms)
    Note over B,S: Tong: DNS + TCP + TLS + HTTP ~ 4 RTT

Với RTT 18ms (server gần, ví dụ Singapore) và DNS cache miss:

  • DNS: cỡ 20-50ms (phụ thuộc DNS resolver và TTL cache)
  • TCP handshake: 1 RTT = 18ms
  • TLS 1.3 handshake: 1 RTT = 18ms
  • HTTP request: 1 RTT = 18ms

Tổng: cỡ 70-120ms trước khi byte đầu tiên của response tới — dù server có Gbps bandwidth.

Nếu server ở US (RTT 200ms), con số này trở thành: DNS + 200ms + 200ms + 200ms = 600ms+ chỉ để nhận byte đầu tiên. Đây là lý do CDN tồn tại.

📌 TLS 1.2 vs TLS 1.3 — số RTT khác nhau

TLS 1.2 cần 2 RTT cho handshake (RTT#3 và RTT#4 trong sơ đồ trên). TLS 1.3 rút xuống còn 1 RTT — ServerHello gửi kèm Finished ngay, client có thể gửi HTTP GET trong cùng gói ACK. Tiết kiệm 1 RTT × latency = cải thiện rõ rệt trên link xa. Xem thêm ở bài 01 — TLS handshake.

4. Bandwidth-delay product — "data đang bay" trong đường ống

Bandwidth-Delay Product (BDP) = Bandwidth × RTT. Đây là lượng dữ liệu "đang bay" trên đường truyền tại một thời điểm — tức lượng dữ liệu sender đã gửi nhưng chưa được ACK.

Ví dụ: link 100 Mbps, RTT 200ms: BDP = 100 Mbps × 0.2s = 20 Mb = 2.5 MB

Nghĩa là sender cần có thể có 2.5 MB dữ liệu "trên không" cùng lúc mới tận dụng hết băng thông. Nếu TCP receive window (giới hạn lượng dữ liệu chưa được ACK) nhỏ hơn BDP, băng thông thực sự bị giới hạn bởi window, không phải bởi link capacity.

Throughput thực te = min(Bandwidth, WindowSize / RTT)

Đây là lý do TCP slow startcongestion window tồn tại: TCP dần mở rộng window cho tới khi lấp đầy đường ống (BDP) mà không gây mất gói. Bài module 1 bài 03 — TCP congestion control giải thích cơ chế này chi tiết.

BANDWIDTH-DELAY PRODUCT — Hình dung
Link ngắn (RTT 10ms)
BDP = 100Mbps × 0.01s = 125 KB — window nho la du
Link xa (RTT 200ms, intercontinental)
BDP = 100Mbps × 0.2s = 2.5 MB — can window lon moi dung duong ong
Link xa + bandwidth cao (1 Gbps, RTT 200ms)
BDP = 1Gbps × 0.2s = 25 MB — window phai rat lon moi tan dung het

5. Vì sao latency cao giết hiệu năng dù bandwidth lớn

Đây là insight phản trực giác: tăng bandwidth giúp ích rất ít khi latency cao với các request nhỏ.

Lấy ví dụ cụ thể: bạn load một trang web gồm 100 resource nhỏ (mỗi file 10 KB), server ở US (RTT 200ms). Mỗi resource cần ít nhất 1 RTT để fetch:

  • Với HTTP/1.1 (6 kết nối song song tối đa): 100 / 6 × 200ms ≈ 3.3 giây chỉ cho latency
  • Bandwidth 1 Gbps? 100 × 10 KB = 1 MB — gửi xong trong 8ms. Nhưng page vẫn mất 3.3 giây

Tăng bandwidth từ 100 Mbps lên 1 Gbps không thay đổi gì đáng kể — vì nút thắt là RTT 200ms, không phải bandwidth. Đây là lý do "mua thêm bandwidth" không giải quyết được page load time chậm với server xa.

Senariot ngược: download file 1 GB (throughput-bound). Ở đây latency chỉ ảnh hưởng lần đầu kết nối — một khi TCP đã warm up và window đủ lớn, throughput mới là yếu tố quyết định. Tăng bandwidth từ 100 Mbps lên 1 Gbps: download time giảm từ 80s xuống 8s.

Use caseBottleneck chínhTối ưu đúng
Load nhiều resource nhỏ (web page)Latency/RTTGiảm số RTT, CDN, multiplexing
Download file lớnThroughputTăng bandwidth, window lớn
Database query tốc độ caoCả haiConnection pool (giảm RTT setup) + fast link
Video streamThroughput + jitterCDN edge + buffer

6. Tối ưu: giảm RTT là đòn bẩy lớn nhất

Vì latency/RTT định hình trải nghiệm người dùng với web request, các kỹ thuật tối ưu hiệu năng đều hướng về giảm số RTT:

HTTP keep-alive & connection pooling: Tái dùng kết nối TCP đã thiết lập — trả chi phí handshake 1 lần rồi dùng lại nhiều request. Không tạo kết nối mới cho từng request → tiết kiệm 1-2 RTT mỗi request. Xem bài HTTP keep-alive.

TLS session resumption & 0-RTT: TLS 1.3 hỗ trợ 0-RTT resumption: client gửi kèm dữ liệu ứng dụng ngay trong gói đầu tiên khi kết nối lại (không cần handshake đầy đủ). Tiết kiệm 1 RTT TLS cho subsequent connections.

HTTP/2 multiplexing: Gửi nhiều request song song qua một kết nối TCP/TLS duy nhất — tránh tạo nhiều kết nối mới (mỗi kết nối mới = 2-3 RTT setup). Xem bài HTTP/2 và HTTP/3.

CDN (Content Delivery Network): Đặt content gần người dùng hơn về mặt địa lý → RTT từ 200ms xuống còn 10-20ms. Giảm RTT vật lý là cách duy nhất vượt qua sàn tốc độ ánh sáng. CDN không tăng bandwidth của bạn — nó giảm khoảng cách.

flowchart LR
    subgraph Before["Khong co CDN — RTT 200ms"]
      U1["User VN"] -->|"200ms RTT"| S1["Server US"]
    end
    subgraph After["Co CDN — RTT 15ms"]
      U2["User VN"] -->|"15ms RTT"| C["CDN Edge SG"]
      C -->|"200ms (cached)"| S2["Origin US"]
    end

DNS prefetch & preconnect: Thực hiện DNS lookup và TCP/TLS handshake trước khi cần — "trả phí" RTT trong lúc idle thay vì trên critical path.

7. Pitfall — tối ưu sai metric

Nhầm 1: Tăng bandwidth khi nút thắt là latency ✅ Nếu người dùng phàn nàn trang chậm, trước tiên đo curl -w "%{time_total}\n" và break down từng chặng (DNS, TCP connect, TLS, TTFB). Nếu TTFB lớn (Time To First Byte = latency), tăng bandwidth không giúp gì. Cần CDN, giảm số request, hoặc tối ưu phía server trả response.

Nhầm 2: Thêm server xử lý khi nghẽn ở mạng ✅ Thêm server app giúp khi CPU/memory của server là bottleneck (throughput xử lý thấp). Nhưng nếu vấn đề là người dùng ở xa server (latency cao) — thêm bao nhiêu server ở cùng một data center cũng không giúp. Cần CDN hoặc multi-region deployment.

Nhầm 3: Nhầm lẫn bandwidth với throughput ✅ Nhà mạng quảng cáo "100 Mbps" là bandwidth tối đa lý thuyết (capacity của đường truyền). Throughput thực tế thường thấp hơn do overhead protocol (header TCP/IP ~5%), mất gói buộc TCP giảm tốc (congestion control), và chia sẻ với traffic khác. Speedtest đo throughput thực tế — con số luôn thấp hơn bandwidth danh nghĩa.

Nhầm 4: Ping thấp = app sẽ nhanhping đo RTT của ICMP packet cỡ 64 byte — không chịu TCP slow start, không có TLS overhead, không có HTTP parsing. App thực có HTTP/1.1 với nhiều request nhỏ sẽ chậm hơn ping nhiều lần do RTT nhân lên qua mỗi round-trip. Metric thực tế cần đo: TTFB (Time To First Byte) và page load time.

8. Liên hệ các bài khác

9. 📚 Deep Dive — tài liệu gốc

📚 High Performance Browser Networking — Grigorik

Tài liệu tham khảo chính:

  • High Performance Browser Networking — Ilya Grigorik (miễn phí online) — Chương 1 "Primer on Latency and Bandwidth" là nguồn gốc của phần lớn insight trong bài này. Đọc để hiểu sâu hơn về propagation delay, transmission delay, queuing delay, và processing delay — bốn thành phần tạo nên latency tổng.
  • Chương 4 — Transport Layer Security (cùng sách) — giải thích RTT TLS 1.2 vs 1.3 và session resumption với số liệu thực.

Ghi chú: Grigorik viết cho web developer, không phải network engineer — đây là điểm mạnh của cuốn sách. Chương 1 của nó là một trong những giải thích rõ ràng nhất về sự khác biệt latency/bandwidth trên Internet.

10. Tóm tắt

  • Latency = thời gian 1 đơn vị đi từ A → B (ms). Throughput = lượng data/giây (Mbps). Hai thứ độc lập — đường ống to không nghĩa là nước đến nhanh hơn.
  • RTT = latency khứ hồi; sàn vật lý do tốc độ ánh sáng trong cáp quang (~200.000 km/s).
  • Một request HTTPS tốn 3-4 RTT nối tiếp trước byte đầu tiên: DNS + TCP handshake + TLS handshake + HTTP. Với server xa (RTT 200ms), tổng có thể vượt 600ms dù bandwidth Gbps.
  • Bandwidth-Delay Product (BDP) = Bandwidth × RTT = lượng data "đang bay". TCP window phải lớn hơn BDP mới tận dụng hết băng thông — quan trọng với link xa bandwidth cao.
  • Với web page (nhiều request nhỏ): nút thắt là RTT, không phải bandwidth. Tối ưu = giảm số RTT (keep-alive, multiplexing, CDN, TLS 1.3).
  • Với download file lớn: nút thắt là throughput. Tối ưu = tăng bandwidth, window lớn hơn.
  • CDN giảm RTT vật lý bằng cách đưa content gần người dùng — đây là đòn bẩy latency mạnh nhất.
  • Pitfall thường gặp nhất: tăng bandwidth hoặc thêm server khi nút thắt thực sự là latency — đo metric đúng trước khi tối ưu.

11. Tự kiểm tra

Tự kiểm tra
Q1
Bạn có đường truyền 1 Gbps và server đặt ở US (RTT 200ms). Người dùng tại Việt Nam tải một trang web gồm 50 resource nhỏ (mỗi file 5 KB). Tăng bandwidth lên 10 Gbps có giúp trang load nhanh hơn không? Vì sao?
Gần như không giúp được gì đáng kể. Tổng data cần tải là 250 KB — với 1 Gbps cũng chỉ mất 2ms để truyền. Nút thắt thực sự là RTT 200ms × số vòng khứ hồi. Với HTTP/1.1 (6 kết nối song song), 50 resource cần ít nhất 50/6 ≈ 9 vòng × 200ms = 1.8 giây chỉ cho latency. Tăng bandwidth từ 1 Gbps lên 10 Gbps tiết kiệm chưa đến 2ms trên nút thắt 1.8 giây đó. Để tải nhanh hơn: dùng CDN (giảm RTT xuống 15ms), HTTP/2 multiplexing (giảm số vòng), hoặc bundle resource (giảm số request).
Q2
Bandwidth-Delay Product là gì và vì sao nó quan trọng với TCP trên link xa bandwidth cao?
BDP = Bandwidth × RTT = lượng dữ liệu "đang bay" trên đường truyền tại một thời điểm — tức là lượng sender đã gửi nhưng chưa được ACK. Để tận dụng hết bandwidth, TCP receive window phải lớn hơn BDP. Ví dụ: 1 Gbps, RTT 200ms → BDP = 25 MB. Nếu TCP window bị giới hạn ở 64 KB (window cũ mặc định), throughput thực tế bị cap ở 64 KB / 0.2s = 320 KB/s, dù link có 1 Gbps. Hệ điều hành hiện đại tự điều chỉnh window theo BDP (TCP window scaling), nhưng trên link cực xa hoặc cực nhanh vẫn cần cấu hình.
Q3
Vì sao TLS 1.3 nhanh hơn TLS 1.2 về mặt thời gian thiết lập kết nối?
TLS 1.2 cần 2 RTT để hoàn tất handshake: RTT đầu để trao đổi cipher suite và cert, RTT thứ hai để xác nhận và trao đổi khóa. TLS 1.3 rút xuống còn 1 RTT bằng cách gộp trao đổi khóa (Diffie-Hellman ephemeral) vào cùng gói ClientHello — server nhận được đủ thông tin để trả ServerHello + Finished + certificate trong một round trip. Client có thể gửi HTTP request ngay sau đó. Với link RTT 200ms, tiết kiệm 1 RTT = tiết kiệm 200ms — cải thiện đáng kể với server xa. TLS 1.3 còn hỗ trợ 0-RTT resumption cho kết nối lại, tiết kiệm thêm 1 RTT nữa.
Q4
Startup bạn dùng ping để kiểm tra latency tới server và thấy RTT 18ms — nhưng app vẫn cảm thấy chậm. Điều gì có thể đang xảy ra?
ping đo RTT của ICMP packet 64 byte — không phải app request thực. App thực có thêm các RTT nối tiếp: DNS lookup, TCP handshake, TLS handshake, rồi mới HTTP request. Với RTT 18ms, tổng có thể là 4 × 18ms = 72ms chỉ cho overhead kết nối. Nếu app tạo nhiều kết nối nhỏ (HTTP/1.1 không keep-alive), mỗi request lại tốn thêm 2-3 RTT setup. Ngoài ra, TTFB còn bao gồm thời gian server xử lý — 18ms RTT không nói lên gì về việc server mất bao lâu để query DB và build response. Đo TTFB thực tế bằng curl -w "%{time_total}" hoặc DevTools Network tab mới có số đúng.
Q5
Công ty bạn deploy thêm 5 server app ở cùng một data center tại Hà Nội. Điều này giúp gì và không giúp gì cho người dùng ở Los Angeles?
Thêm 5 server app tăng throughput xử lý — nhiều request được xử lý song song hơn, server ít bị queue khi có burst traffic. Điều này hữu ích nếu bottleneck là CPU/memory server. Tuy nhiên, với người dùng ở LA, RTT vật lý Hà Nội-LA cỡ 200ms — không thay đổi dù có 1 hay 100 server ở Hà Nội. Mỗi request vẫn mất tối thiểu 600-800ms chỉ cho DNS+TCP+TLS+HTTP round trip. Để giúp người dùng LA: cần CDN edge node ở US hoặc multi-region deploy thêm data center ở US.
Q6
Vì sao CDN là giải pháp tối ưu latency hiệu quả hơn so với tăng băng thông cho server gốc?
Latency có sàn vật lý do tốc độ ánh sáng — không thể phá vỡ dù bandwidth bao nhiêu. CDN đặt edge node gần người dùng về địa lý: thay vì user Việt Nam request lên server US (RTT 200ms), họ request tới CDN edge ở Singapore (RTT 10-15ms). Giảm từ 200ms xuống 15ms = tiết kiệm 185ms mỗi RTT. Với 4 RTT để load page đầu tiên, CDN tiết kiệm hơn 700ms. Tăng bandwidth server gốc từ 1 Gbps lên 10 Gbps không tiết kiệm được 1ms latency nào — vì khoảng cách địa lý không đổi. CDN trả lời "làm ngắn đường" còn bandwidth trả lời "làm đường to hơn".

Bài tiếp theo: Mini-challenge — dựng reverse proxy + HTTPS, debug bằng curl

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

Đặt 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

Bài tiếp theo

Mini-challenge — dựng reverse proxy + HTTPS, debug bằng curl