Ở phần trước của Series Nhập môn mạng máy tính chúng ta đã tìm hiểu về Kết nối bền vững và kết nối không bền vững của HTTP, ở phần này chúng ta sẽ tìm hiểu về định dạng của thông điệp HTTP.
Định dạng thông điệp HTTP
Đặc tả HTTP (RFC 2616) bao gồm các định nghĩa của định dạng thông điệp HTTP. Có hai loại thông điệp HTTP, thông điệp yêu cầu (Request message) và thông điệp phản hồi (Response message).
Thông điệp yêu cầu (Request message)
Bên dưới là thông điệp yêu cầu điển hình:
GET /somedir/page.html HTTP/1.1
Host: www.someschool.edu
Connection: close
User-agent: Mozilla/5.0
Accept-language: fr
Trước tiên, thông điệp trên được viết dưới dạng văn bản mã ASCII, nhờ đó mà những ai có kiến thức thông thường về máy tính đều có thể hiểu được. Kế đến, thông điệp trên gồm năm dòng, mỗi dòng kết thúc bằng dấu hiệu xuống dòng và về đầu dòng. Dòng cuối cùng có thêm một dấu hiệu xuống dòng và về đầu dòng.
Mặc dù thông điệp trên có năm dòng, nhưng tổng quát thì một thông điệp yêu cầu có thể có nhiều dòng hơn hoặc cũng có thể chỉ có một dòng. Dòng đầu của thông điệp yêu cầu được gọi là dòng yêu cầu (request line); các dòng tiếp theo được gọi là dòng tham số (header line). Dòng yêu cầu có ba trường (fields):
method
(phương thức).URL
(đường dẫn đến đối tượng).version
(phiên bản HTTP).
Trường method
có thể nhận một trong các phương thức khác nhau, bao gồm GET
, POST
, HEAD
, PUT
, và DELETE
. Phần lớn các thông điệp yêu cầu dùng phương thức GET
. Phương thức GET
được dùng khi trình duyệt yêu cầu đối tượng, và đối tượng được yêu cầu chỉ định rõ trong trường URL
. Trong ví dụ này, trình duyệt đang yêu cầu đối tượng /somedir/page.html
. Trường HTTP version cho biết số hiệu phiên bản của giao thức HTTP mà trình duyệt có hỗ trợ (HTTP/1.1).
Các dòng tham số Host: www.someschool.edu
cho biết tên của máy chủ chứa đối tượng được yêu cầu. Dòng này có thể bị người dùng cho là không cần thiết vì đã có kết nối TCP đến máy chủ rồi. Tuy nhiên thông tin này là cần thiết cho kỹ thuật Web proxy cache.
Với dòng Connection: close
trình duyệt thông báo cho tiến trình chủ rằng nó không sử dụng kết nối bền vững, và yêu cầu tiến trình chủ đóng kết nối sau khi phản hồi.
Dòng User-agent: Mozilla/5.0
cho biết loại trình duyệt đang gửi yêu cầu đến máy chủ, trong ví dụ này là Mozilla/5.0 (một trình duyệt của Netscape). Dòng tham số này cần thiết để máy chủ có thể gửi đúng phiên bản của đối tượng được yêu cầu.
Cuối cùng, dòng Accept-language:fr
cho biết người dùng muốn nhận một phiên bản tiếng Pháp của đối tượng, nếu như có một phiên bản như vậy tồn tại trong máy chủ, còn nếu không thì máy chủ sẽ gửi phiên bản mặc định.
Ví dụ ở hình dưới đây, định dạng tổng quát của một thông điệp yêu cầu. Ví dụ trước tuân thủ theo định dạng này. Theo sau các dòng tham số (và dấu xuống dòng và về đầu dòng) là “phần thân thông điệp” (entity body). Với phương thức GET
, phần thân thông điệp để trống, nhưng với phương thức POST
thì phần này được sử dụng để chứa các tham số do người sử dụng đưa vào.
Chương trình khách thường sử dụng phương thức POST
cho trường hợp muốn người dùng nhập dữ liệu tham số vào một mẫu (form), như trường hợp người dùng đưa vào từ khóa (keyword) cho một trang tìm kiếm như Google.com.
Cũng như thông điệp GET
, thông điệp POST
cũng yêu cầu trang web từ máy chủ, nhưng các nội dung cụ thể của trang web phụ thuộc vào những gì người dùng nhập vào mẫu. Khi đó phần thân thông điệp POST chứa nội dung người dùng đã nhập.
Như đã đề cập, tiến trình khách dùng thông điệp GET
để yêu cầu trang web từ máy chủ, cũng như thông điệp POST
. Tuy nhiên, dữ liệu tham số do người dùng đưa vào mẫu nhập liệu, sẽ được ghép vào trường URL của thông điệp, thay vì đặt ở phần thân thông điệp như trường hợp POST
.
Chẳng hạn, nếu một mẫu nhập liệu, dùng phương thức GET
, có hai trường, và dữ liệu đầu vào hai trường là “monkeys” và “bananas”, thì URL sẽ có cấu trúc là www.somesite.com/animalsearch?monkeys&bananas
. Trong khi lướt web, các URL có chứa các tham số thì thuộc về loại này.
Phương thức HEAD
tương tự như phương thức GET
. Khi một máy chủ nhận một yêu cầu với loại phương thức HEAD
, sẽ trả về một thông điệp phản hồi nhưng không kèm theo các đối tượng được yêu cầu. Lập trình viên thường dùng phương thức HEAD
để dò lỗi (debug) chương trình.
Phương thức PUT
thường dùng trong các ứng dụng xuất bản nội dung web. Phương thức này cho phép người dùng tải lên một đối tượng đến một nơi cụ thể (thư mục) ở máy chủ web. Phương thức PUT
cũng được các ứng dụng dùng để tải lên các đối tượng đến máy chủ web. Phương thức DELETE
cho phép người dùng, hoặc ứng dụng, xóa đi một đối tượng trên máy chủ web.
Thông điệp phản hồi
Với thông điệp yêu cầu đã nêu trong ví dụ trên, dưới đây là một ví dụ về thông điệp phản hồi mà máy chủ web gửi về trình duyệt:
HTTP/1.1 200 OK
Connection: close
Date: Tue, 18 Aug 2015 15:44:04 GMT
Server: Apache/2.2.3 (CentOS)
Last-Modified: Tue, 18 Aug 2015 15:11:03 GMT
Content-Length: 6821
Content-Type: text/html
(data data data data data …)
Thông điệp trên gồm có ba phần: bắt đầu bằng một dòng trạng thái (status line), sáu dòng mô tả (header line), và cuối là phần thân thông điệp (entity body).
Phần thân thông điệp chứa nội dung đối tượng được yêu cầu (ở ví dụ trên là “data data data data data…”). Dòng trạng thái có ba trường: version
(phiên bản), status code
(mã trạng thái), và phrase
(thông báo tinh trạng phản hồi từ phía tiến trình chủ). Trong ví dụ này, dòng trạng thái cho biết tiến trình chủ đang dùng phiên bản HTTP/1.1 và tình trạng phản hồi là OK
(có nghĩa là tiến trình chù đã tìm thấy và đang gửi đôi tượng được yêu câu).
Tiến trình chủ dùng dòng Connection: close
để báo cho tiến trình khách rằng nó sẽ đóng kết nối TCP sau khi gửi thông điệp. Dòng Date: Tue, 18 Aug 2015 15:44:04 GMT
cho biết thời điểm tiến trình chủ tạo thông điệp phản hồi và gửi đi. Lưu ý là đây không phải thời điểm đối tượng được tạo và được cập nhật lần sau cùng; đó là thời điểm tiến trình chủ lấy đối tượng từ hệ thống tập tin, chèn đối tượng vào thông điệp phản hồi, và gửi thông điệp phản hồi về cho tiến trình khách.
Dòng Server: Apache/2.2.3 (CentOS)
cho biết thông điệp được phát sinh bởi trình chủ Web Apache, dòng này cũng tương tự như dòng User-agent:
trong thông điệp yêu cầu. Dòng Last-Modified: Tue, 18 Aug 2015 15:11:03 GMT
cho biết thời điểm đối tượng được tạo ra hoặc được cập nhật lần sau cùng. Dòng Last-Modified:
cần thiết cho việc trữ đối tượng vào bộ nhớ cache, cả trong trường hợp bộ nhớ cache tại chính máy khách lẫn trường hợp cache cho mạng.
Dòng Content-Length: 6821
cho biết kích thước đối tượng được gửi (tính theo byte). Dòng Content-Type: text/html
cho biết loại đối tượng trong phần thân thông điệp là văn bản HTML (loại đối tượng được xét qua dòng Content-Type: chứ không phải bằng tên mở rộng của tập tin). Hình dưới đây mô tả định dạng tổng quát của một thông điệp phản hồi. Định dạng của thông điệp phản hồi đã nêu trong ví dụ trên hoàn toàn phù hợp với định dạng tổng quát này.
Nói thêm về hai trường status code
và phrase
. Mỗi giá trị của status code là một mã trạng thái, được liên kết với một cụm từ thông báo tình trạng phản hồi từ phía tiến trình chủ. Dưới đây là một số mã trạng thái và cụm từ thông báo tình trạng phản hồi thường thấy:
- 200 OK: thông điệp yêu cầu hợp lệ và thông tin yêu cầu được trả về trong thông điệp phản hồi.
- 301 Moved Permanently: Đối tượng được yêu cầu đã được chuyển đi nơi khác; URL mới được chỉ định trong dòng Location: của thông điệp phản hồi. Chương trình khách tự động chuyển hướng truy cập vào URL mới.
- 400 Bad Request: Đây là mã lỗi trong trường hợp tiến trình chủ không hiểu được thông điệp yêu cầu.
- 404 Not Found: Tài liệu yêu cầu không tìm thấy trên máy chủ.
- 505 HTTP Version Not Supported: Phiên bản giao thức HTTP trong thông điệp yêu cầu không được máy chủ hỗ trợ.
Tên | Phạm vi mã trạng thái |
Thông tin | 100-199 |
Thành công | 200-299 |
Chuyển hướng | 300-399 |
Lỗi máy khách | 400-499 |
Lỗi máy chủ | 500-599 |
Tổng kết
Chúng ta vừa tìm hiểu xong các khái niệm về Định dạng của thông điệp HTTP. Phần sau chúng ta sẽ tìm hiểu kỹ hơn về các phương thức cũng như các header có trong thông điệp HTTP.