Để yêu cầu tài liệu từ máy chủ web, trình duyệt sử dụng giao thức HTTP. Bạn có thể biết tên đó từ thanh địa chỉ của bạn (bây giờ có thể bị ẩn, nhưng khi bạn nhấp vào thanh địa chỉ, sao chép URL và dán nó vào một số trình soạn thảo văn bản, bạn sẽ thấy http://
ngay từ đầu). HTTP là một giao thức dựa trên văn bản đơn giản. Nó hoạt động như thế này:
Đầu tiên, trình duyệt của bạn kết nối với máy chủ của trang web và gửi URL của tài liệu mà nó muốn tải xuống (các trang web cũng là tài liệu) và một số chi tiết về chính trình duyệt (Tác nhân người dùng, v.v.). Ví dụ: để tải trang chính trên trang SuperUser http://superuser.com/
, trình duyệt của tôi sẽ gửi một yêu cầu giống như sau:
GET / HTTP/1.1
Host: superuser.com
Connection: keep-alive
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/29.0.1547.0 Safari/537.36
Accept-Encoding: gzip,deflate,sdch
Accept-Language: pl-PL,pl;q=0.8,en-US;q=0.6,en;q=0.4
Cookie: [removed for security]
DNT: 1
If-Modified-Since: Tue, 09 Jul 2013 07:14:17 GMT
Dòng đầu tiên chỉ định tài liệu nào máy chủ sẽ trả về. Các dòng khác được gọi là tiêu đề; họ trông như thế này:
Header name: Header value
Những dòng này gửi thông tin bổ sung giúp máy chủ quyết định phải làm gì.
Nếu tất cả đều ổn, máy chủ sẽ phản hồi bằng cách gửi tài liệu được yêu cầu. Phản hồi bắt đầu bằng một thông báo trạng thái, theo sau là một số tiêu đề (có chi tiết về tài liệu) và cuối cùng, nếu tất cả đều ổn, nội dung của tài liệu. Đây là nội dung trả lời của máy chủ SuperUser cho yêu cầu của tôi như sau:
HTTP/1.1 200 OK
Cache-Control: public, max-age=60
Content-Type: text/html; charset=utf-8
Expires: Tue, 09 Jul 2013 07:27:20 GMT
Last-Modified: Tue, 09 Jul 2013 07:26:20 GMT
Vary: *
X-Frame-Options: SAMEORIGIN
Date: Tue, 09 Jul 2013 07:26:19 GMT
Content-Length: 139672
<!DOCTYPE html>
<html>
[...snip...]
</html>
Sau dòng cuối cùng, máy chủ của SuperUser đóng kết nối.
Dòng đầu tiên ( HTTP/1.1 200 OK
) chứa mã phản hồi , trong trường hợp này là 200 OK
. Điều đó có nghĩa là máy chủ đã quyết định nó có thể trả lại một tài liệu, theo yêu cầu và hứa rằng các nội dung tiếp theo sẽ là một tài liệu như vậy. Nếu đây không phải là trường hợp mã sẽ là một cái gì đó khác và nó sẽ cung cấp một số dấu hiệu về lý do máy chủ không trả lại tài liệu dưới dạng phản hồi: ví dụ: nếu không thể tìm thấy tài liệu được yêu cầu, thì nó phải trả lại 404 Not Found
và nếu bạn không được phép truy cập nội dung được đề cập thì nên trả lại 403 Forbidden
.
Sau dòng trạng thái đầu tiên này, các tiêu đề phản hồi theo sau; họ cung cấp thêm thông tin về nội dung được trả lại, chẳng hạn như nội dung của nó Content-type
.
Tiếp theo là một dòng trống. Nó báo hiệu thực tế rằng không có thêm tiêu đề phản hồi sẽ theo sau. Tất cả mọi thứ qua dòng đó là nội dung của tài liệu mà nó yêu cầu. Vì vậy, trong ví dụ trên, <!DOCTYPE html>
là dòng đầu tiên của trang chủ SuperUser (tài liệu HTML). Nếu tôi yêu cầu tải xuống một tài liệu, nó có thể là một số ký tự vô nghĩa, bởi vì hầu hết các định dạng tài liệu không thể đọc được mà không xử lý trước.
Trở lại tiêu đề. Điều thú vị nhất đối với chúng tôi là cái cuối cùng , Content-Length
. Nó thông báo cho trình duyệt biết cần bao nhiêu byte dữ liệu sau dòng trống, vì vậy về cơ bản, đó là kích thước tài liệu được biểu thị bằng byte. Tiêu đề này không bắt buộc và có thể bị máy chủ bỏ qua. Đôi khi kích thước tài liệu không thể dự đoán được (ví dụ: khi tài liệu được tạo nhanh chóng), đôi khi các lập trình viên lười biếng không bao gồm nó (khá phổ biến trên các trang web tải xuống trình điều khiển), đôi khi các trang web được tạo bởi những người mới không biết của một tiêu đề như vậy.
Dù sao, bất kể lý do là gì, tiêu đề có thể bị thiếu. Trong trường hợp đó, trình duyệt không biết máy chủ sẽ gửi bao nhiêu dữ liệu và do đó hiển thị kích thước tài liệu là không xác định , chờ máy chủ đóng kết nối. Và đó là lý do cho kích thước tài liệu không xác định.