Saturday, August 30, 2014

TL;DR - Quy trình thực thi một HTTP Request

Bài này muốn đề cập về trình tự các bước xử lý request được thực hiện bởi trình duyệt, web server thông qua đường truyền mạng. Lưu ý rằng, trình tự này có thể thêm hoặc thay đổi tuỳ vào cách hiện thực và tối ưu của từng trình duyệt.

OK. Đây là bài theo tiêu chí "dài quá không đọc" (Too Long, Didn't Read), nên tôi sẽ bắt đầu bằng biểu đồ sau:


Bạn chỉ cần nhìn qua là hiểu rồi nhỉ? Vậy là bài này có thể kết thúc ở đây...

Nhưng... Tôi muốn đề cập nhiều hơn một xíu về biểu đồ thời gian thực thi này...

Biểu đồ trên là biểu đồ rút gọn lại trên trang định nghĩa của W3C: http://www.w3.org/TR/navigation-timing/. Và nó gồm 4 phần được tô 4 màu khác nhau.

Đầu tiên, khi bạn gõ URL lên thanh địa chỉ và Enter. Trình duyệt lập tức kiểm tra resource này tồn tại trong cache hay không, nếu có và nếu bản cache đó có các header thích hợp (ví dụ Expire, Cache-Control,...), thì trình duyệt sẽ trả resource đã cache đó, mà không thực hiện request lên server, giúp thời gian tải nhanh hơn.

Lưu ý rằng, trước bước kiểm tra cache thì có bước kiểm tra redirect. Nên nhớ rằng redirect ở đây ý đang muốn nói tới những resource đã được đánh dấu với code 302 Moved Permanently. Và tất nhiên việc redirect này cũng thực hiện cấp kỳ mà không gửi thông tin lên server.

Bước 2, với URL đã được cung cấp, trình duyệt sẽ phân tích ra {schema, host, port} của resource. Dựa vào đó, nó sẽ phân giải tên miền ra địa chỉ IP. Thông thường các trình duyệt hiện đại sẽ lưu nhớ các địa chỉ nào sẽ được phân giải ra IP nào (nếu trước đó đã truy cập). Nếu không có sẵn, trình duyệt sẽ yêu cầu ISP phân giải DNS, quá trình này nhanh chậm phụ thuộc vào nhà cung cấp internet của bạn.

Một nguyên lý đơn giản là nếu trang web của bạn nổi tiếng, sẽ có nhiều máy chủ DNS của nhiều ISP cùng lưu giữ thông tin IP, như vậy quá trình phân giải DNS sẽ nhanh hơn nhiều.

Bước 3, sau khi có IP, tiếp theo là thực hiện "bắt tay 3 bước" trên TCP: SYN > SYN-ACK > ACK.

Nếu bạn muốn biết nó là cái gì, hãy thử tìm hiểu thêm với từ khoá "three-way handshake". Tuy nhiên, báo cho bạn biết rằng bước này lần nào cũng thực hiện cho mỗi lần request, và tốc độ nhanh chậm tuỳ thuộc vào khoảng cách của trình duyệt của mình với server. Một tin buồn nữa là nếu URL là dạng HTTPS thì nó sẽ thực hiện thêm 2 lần khác tương tự như vậy nữa (hoặc chỉ có 1 lần nếu ta đã có cache trong SSL session).

Thêm một thông tin: Vì HTTPS lại cần chứng thực từ một server chứng thực tin cậy, nên còn thêm một tin buồn nữa là lần đầu truy cập thì trình duyệt sẽ đi lấy chứng thực, mà bước lấy chứng thực thì tương đương với một request mới hoàn toàn (đầy đủ các bước).

Và cuối cùng, trình duyệt sẽ thật sự gửi request lên server, và chờ nhận response.

Nếu bạn dùng các chương trình debug, bạn sẽ thấy thời gian request và response được tách ra làm 2. Nhưng thực ra trình duyệt không thể xác định được thời gian chính xác, mà họ tính rằng: thời gian request = từ lúc gửi request tới lúc nhận byte response đầu tiên, và tất nhiên response chỉ đơn giản là thời gian nhận byte đầu tiên tới byte cuối cùng. Như vậy, thời gian request sẽ tương đương với thời gian request đi trên đường truyền + thời gian server xử lý + thời gian response đi trên đường truyền.

---
Bạn nào có câu hỏi gì thì vui lòng comment nhé...

No comments:

Post a Comment

Biểu mẫu liên hệ

Name

Email *

Message *