Skip to content

Hành Trình Toàn Diện Của Một Request

Lời mở đầu

Khi bạn nhập một URL vào trình duyệt và nhấn Enter, cho đến khi trang hiển thị, điều gì đã xảy ra ở giữa? Đây là câu hỏi kinh điển trong phỏng vấn, và cũng là chìa khóa để hiểu toàn bộ kiến trúc Web. Nắm vững chuỗi liên kết này, bạn sẽ hiểu cách frontend, backend, mạng và cơ sở dữ liệu phối hợp với nhau.

Bài viết này sẽ giúp bạn học được gì?

Sau khi học xong chương này, bạn sẽ có được:

  • Góc nhìn toàn chuỗi: Hiểu quá trình hoàn chỉnh của một HTTP request từ khi gửi đi đến khi nhận về phản hồi
  • Nhận thức về trách nhiệm từng tầng: DNS, TCP, Load Balancer, Web Server, Application Server, Database mỗi tầng làm gì
  • Khả năng xác định vấn đề: Khi request chậm hoặc thất bại, biết bắt đầu kiểm tra từ tầng nào
  • Tư duy tối ưu hiệu năng: Mỗi tầng đều có không gian tối ưu, biết điểm tối ưu nằm ở đâu
ChươngNội dungKhái niệm cốt lõi
Chương 1Trình duyệt khởi tạo requestPhân giải DNS, Kết nối TCP, HTTP Request
Chương 2Truyền tải qua mạngĐịnh tuyến, CDN, Cân bằng tải
Chương 3Máy chủ xử lýWeb Server, Logic ứng dụng, Truy vấn cơ sở dữ liệu
Chương 4Phản hồi trả vềTuần tự hóa, Nén, Kết xuất
Chương 5Tối ưu toàn chuỗiCache, Tái sử dụng kết nối, Xử lý bất đồng bộ

0. Toàn cảnh: Một request đã trải qua những gì?

Dùng một phép so sánh để hiểu: bạn đặt mua sách trực tuyến, quá trình này giống với HTTP request một cách đáng kinh ngạc.

Giai đoạn requestSo sánh với mua sáchTương ứng kỹ thuật
Nhập URLBạn nói "Tôi muốn đến hiệu sách XYZ"Trình duyệt phân tích URL
Phân giải DNSTra bản đồ tìm địa chỉ hiệu sáchTên miền → Địa chỉ IP
Kết nối TCPĐi đến cửa hiệu sách, đẩy cửa bước vàoBắt tay ba bước thiết lập kết nối
Gửi requestNói với nhân viên "Tôi muốn cuốn sách《xxx》"Gói tin HTTP Request
Máy chủ xử lýNhân viên vào kho tìm sách, kiểm tra tồn kho, tính giáLogic ứng dụng + Truy vấn cơ sở dữ liệu
Trả về phản hồiNhân viên đưa sách cho bạnGói tin HTTP Response
Trình duyệt kết xuấtBạn mở sách ra đọcPhân tích và kết xuất HTML/CSS/JS

1. Trình duyệt khởi tạo request

1.1 Phân tích URL

Khi bạn nhập https://api.example.com/books?id=123, trình duyệt sẽ phân tách nó thành các phần:

PhầnGiá trịÝ nghĩa
Giao thứchttpsGiao tiếp bằng phương thức mã hóa
Tên miềnapi.example.com"Tên" của máy chủ
Đường dẫn/booksTài nguyên cần truy cập
Tham số truy vấnid=123Điều kiện bổ sung

1.2 Phân giải DNS: Tên miền → Địa chỉ IP

Máy tính không nhận biết tên miền, chỉ nhận biết địa chỉ IP (ví dụ 93.184.216.34). DNS chính là "danh bạ điện thoại" của Internet.

Cache trình duyệt → Cache hệ thống → Cache router → DNS ISP → Máy chủ tên miền gốc
     ↓ Trúng thì dùng luôn, không trúng thì tra tiếp xuống dưới

Ý nghĩa của cache DNS

Nếu mỗi request đều phải tra từ máy chủ tên miền gốc, Internet toàn cầu sẽ bị sập vì truy vấn DNS. Vì vậy mỗi tầng đều có cache, phần lớn request có thể phân giải xong ở tầng trình duyệt hoặc hệ thống.

1.3 Bắt tay ba bước TCP

Sau khi tìm được địa chỉ IP, trình duyệt cần "thiết lập kết nối" với máy chủ. TCP dùng bắt tay ba bước để đảm bảo cả hai bên đều sẵn sàng:

Client → Server: Xin chào, tôi muốn kết nối (SYN)
Server → Client: Được, tôi đã sẵn sàng (SYN + ACK)
Client → Server: Đã nhận, bắt đầu giao tiếp (ACK)

Nếu là HTTPS, còn cần thêm bắt tay TLS để thương lượng phương thức mã hóa.

1.4 Gửi HTTP Request

Sau khi kết nối được thiết lập, trình duyệt gửi gói tin HTTP Request:

http
GET /books?id=123 HTTP/1.1
Host: api.example.com
Accept: application/json
Authorization: Bearer eyJhbGci...
User-Agent: Chrome/120.0
Thành phầnNội dung
Dòng requestPhương thức (GET) + Đường dẫn + Phiên bản giao thức
Header requestMeta information: xác thực danh tính, định dạng dữ liệu mong đợi, v.v.
Body requestChỉ có trong request POST/PUT, mang dữ liệu cần gửi

2. Truyền tải qua mạng: Request trên đường đi

2.1 Định tuyến chuyển tiếp

Sau khi request rời khỏi máy tính của bạn, nó sẽ đi qua nhiều router chuyển tiếp, giống như bưu kiện đi qua nhiều trạm trung chuyển:

Máy tính của bạn → Router gia đình → Mạng nhà mạng → Mạng trục → Phòng máy đích

Mỗi router dựa vào địa chỉ IP để quyết định chuyển tiếp "bước tiếp theo" đi đâu. Có thể dùng lệnh traceroute để xem request đã đi qua những nút nào.

2.2 Tăng tốc CDN

Nếu website đích sử dụng CDN (Mạng phân phối nội dung), request có thể không cần đến máy chủ gốc:

Tình huốngHướng đi
Request tài nguyên tĩnh (ảnh, CSS, JS)Nút biên CDN trả về trực tiếp
Request dữ liệu động (API)Xuyên qua CDN, đến máy chủ gốc

Bản chất của CDN là "đặt nội dung trước đến nơi gần người dùng nhất".

2.3 Cân bằng tải

Website lớn không chỉ có một máy chủ. Load Balancer chịu trách nhiệm phân phối request đến nhiều máy chủ:

Request người dùng → Load Balancer → Máy chủ A (30% lưu lượng)
                                    → Máy chủ B (30% lưu lượng)
                                    → Máy chủ C (40% lưu lượng)

Các chiến lược phân phối phổ biến:

Chiến lượcNguyên lýTình huống áp dụng
Round RobinPhân phối lần lượtCấu hình máy chủ giống nhau
Weighted Round RobinPhân phối theo trọng sốCấu hình máy chủ khác nhau
IP HashCùng một người dùng cố định vào một máyCần duy trì session
Least ConnectionsPhân cho máy có ít kết nối nhất hiện tạiThời gian xử lý request chênh lệch lớn

3. Máy chủ xử lý: Trong nhà bếp đã xảy ra điều gì

Sau khi request đến máy chủ, nó sẽ trải qua xử lý nhiều tầng.

3.1 Web Server (Nginx / Apache)

Thành phần đầu tiên nhận request thường là Web Server, nó chịu trách nhiệm:

Trách nhiệmMô tả
Phục vụ tệp tĩnhTrả về trực tiếp HTML, CSS, JS, ảnh
Reverse ProxyChuyển tiếp request API đến ứng dụng backend
SSL TerminationXử lý mã hóa và giải mã HTTPS
Lọc requestChặn request độc hại, giới hạn tần suất

3.2 Application Server xử lý

Web Server chuyển tiếp request đến Application Server (Node.js, Spring, Django, v.v.), quy trình xử lý:

Request vào → Chuỗi middleware → Khớp định tuyến → Controller → Tầng Service → Tầng truy cập dữ liệu

Những việc middleware làm:

  1. Phân tích body request (JSON, dữ liệu form)
  2. Xác thực danh tính (kiểm tra Token)
  3. Kiểm tra quyền hạn (người dùng này có thể truy cập API này không?)
  4. Ghi log (ai đã truy cập cái gì vào lúc nào)

3.3 Truy vấn cơ sở dữ liệu

Phần lớn request cuối cùng đều phải làm việc với cơ sở dữ liệu:

Code ứng dụng: SELECT * FROM books WHERE id = 123

Database Engine: Phân tích SQL → Tối ưu truy vấn → Kế hoạch thực thi → Đọc dữ liệu

Trả về kết quả: { id: 123, title: "xxx", price: 59.9 }

Cơ sở dữ liệu là nút thắt hiệu năng phổ biến nhất

Truyền tải mạng thường ở mức mili giây, logic ứng dụng cũng nhanh, nhưng một truy vấn cơ sở dữ liệu không có index có thể mất vài giây thậm chí vài chục giây. Vì vậy "request chậm" phần lớn là do truy vấn cơ sở dữ liệu chậm.


4. Phản hồi trả về: Đường về của dữ liệu

4.1 Tạo HTTP Response

Sau khi máy chủ xử lý xong, tạo gói tin phản hồi:

http
HTTP/1.1 200 OK
Content-Type: application/json
Content-Encoding: gzip
Cache-Control: max-age=3600

{"id": 123, "title": "xxx", "price": 59.9}
Thành phầnNội dung
Dòng trạng tháiPhiên bản giao thức + Mã trạng thái (200 Thành công, 404 Không tìm thấy, 500 Lỗi máy chủ)
Header phản hồiĐịnh dạng dữ liệu, Chiến lược cache, Phương thức nén, v.v.
Body phản hồiNội dung dữ liệu thực tế (JSON, HTML, v.v.)

4.2 Nén dữ liệu

Máy chủ thường dùng gzip hoặc brotli để nén body phản hồi, giảm lượng truyền tải:

Thuật toán nénTỷ lệ nénTốc độ
gzipKhoảng 70%Nhanh
brotliKhoảng 80%Chậm hơn nhưng nén tốt hơn

Một JSON 100KB, sau khi nén có thể chỉ còn 20-30KB.

4.3 Trình duyệt kết xuất

Sau khi trình duyệt nhận được phản hồi:

  1. Phân tích HTML → Xây dựng cây DOM
  2. Phân tích CSS → Xây dựng cây kiểu
  3. Hợp nhất → Tạo cây kết xuất
  4. Bố cục → Tính toán vị trí và kích thước từng phần tử
  5. Vẽ → Vẽ pixel lên màn hình

5. Tối ưu toàn chuỗi: Mỗi tầng đều có thể nhanh hơn

5.1 Các biện pháp tối ưu từng tầng

TầngBiện pháp tối ưuHiệu quả
DNSPhân giải trước DNS, dùng dịch vụ DNS nhanhGiảm thời gian truy vấn DNS
MạngCDN, HTTP/2, Tái sử dụng kết nốiGiảm độ trễ truyền tải
Máy chủCache (Redis), Xử lý bất đồng bộGiảm thời gian xử lý
Cơ sở dữ liệuIndex, Tối ưu truy vấn, Đọc/ghi tách biệtGiảm thời gian truy vấn
FrontendLazy loading, Code splitting, Nén tài nguyênGiảm thời gian kết xuất

5.2 Cache: Tối ưu hiệu quả nhất

Cache tồn tại ở mỗi tầng trong chuỗi request:

Cache trình duyệt → Cache CDN → Cache Reverse Proxy → Cache ứng dụng (Redis) → Cache cơ sở dữ liệu

Bản chất của cache

Dùng không gian đổi lấy thời gian. Lưu kết quả đã tính toán lại, lần sau dùng trực tiếp, không cần tính lại. Tỷ lệ trúng cache mỗi khi tăng 10%, hiệu năng hệ thống có thể tăng gấp nhiều lần.

5.3 Cách kiểm tra khi request thất bại

Hiện tượngTầng có thể có vấn đềPhương pháp kiểm tra
Hoàn toàn không phản hồiDNS / Mạngping, nslookup
Timeout kết nốiMạng / Máy chủ sậptelnet, curl
Trả về 4xxRequest phía client có lỗiKiểm tra URL, tham số, Token
Trả về 5xxLỗi nội bộ máy chủXem log máy chủ
Phản hồi rất chậmCơ sở dữ liệu / Logic ứng dụngXem log truy vấn chậm, công cụ APM

6. Tổng kết

Hành trình toàn diện của một HTTP request:

  1. Trình duyệt: Phân tích URL → Truy vấn DNS → Kết nối TCP → Gửi request
  2. Mạng: Định tuyến chuyển tiếp → CDN phán đoán → Cân bằng tải phân phối
  3. Máy chủ: Web Server nhận → Middleware xử lý → Logic nghiệp vụ → Truy vấn cơ sở dữ liệu
  4. Trả về: Tạo phản hồi → Nén → Truyền tải mạng → Trình duyệt kết xuất

Giá trị của việc hiểu toàn chuỗi

Khi bạn có thể vẽ ra chuỗi liên kết hoàn chỉnh của request trong đầu, gặp bất kỳ vấn đề gì cũng có thể nhanh chóng xác định được tầng nào bị lỗi. Đây là bước nhảy then chốt từ "lập trình viên sơ cấp" lên "có thể tự kiểm tra và xử lý vấn đề".


Đọc thêm