NỘI DUNG
Tiếp theo nội dung Giải ngố WWW – Phần 1: Nguyên lý hoạt động của World Wide Web và thế giới ngầm Dark Web, kỳ này tôi sẽ bàn thêm về cái HyperText Transfer Protocol – HTTP (Giao thức truyền tải siêu văn bản) thần thánh. Được xem như cái cần câu cơm của WWW, HTTP dùng để xác định cách nói chuyện giữa Client và Server với 2 dạng Message là Request và Respone.
#1. Cấu trúc HTTP Request Message
Request Message thường sẽ bao gồm các thành phần như sau.
#1.1 Dòng Header đầu tiên
Bao gồm 3 thành phần cách nhau bởi space (khoảng trắng), ví dụ như:
`GET /auth/488/YourDetails.ashx?uid=129 HTTP/1.1`
Trong đó:
– HTTP Method (Phương thức): Phổ biến nhất là GET như ví dụ trên.
– Resquested URL: Thông tin về cái URL đang được yêu cầu. Trong này có thể xuất hiện Query String (chuỗi truy vấn) bao gồm các thông số theo sau dấu `?` như trong ví dụ là `/auth/488/YourDetails.ashx?uid=129`
– HTTP Version: Phiên bản HTTP đang sử dụng như trong ví dụ là `HTTP/1.1`
#1.2 Các dòng Header tùy chọn tiếp theo
Bạn có thể gặp các thể loại sau:
– Referer: Cho biết cái URL gốc của Request. Ví dụ từ trang chủ bạn click vô nút Login thì trang Login sẽ có Referer là trang chủ.
– User-Agent: Cung cấp thông thin về Browser để tạo Request
– Host: Cho biết hostname trong cái URL đầy đủ được truy cập, ví dụ dummytip.com
– Cookie: Cái này khá quan trọng đối với HTTP, cho phép Server gửi dữ liệu đến Client. Khi đó Client có thể lưu dữ liệu và gửi lại cho Server để xác định các Session (Phiên) ví dụ như:
`Cookie: SessionId=5B70C71F3FD4968935CDB6682E545476`
Lưu ý: HTTP dùng TCP (stateful protocol) làm cơ chế vận chuyển nhưng bản thân HTTP lại là stateless protocol, nghĩa là mỗi message nó cứ chạy mà kệ cha thằng trước/ sau nó đã/ định làm cái gì. Vì vậy, vấn đề quản lý Session (ví dụ Login Session) là khá quan trọng khi sử dụng giao thức này.
#1.3 Phần còn lại
Phần này thì sẽ bao gồm 1 dòng trống để ngăn cách và sau đó là Message Body tùy chọn.
#2. Các Method (phương thức) trong HTTP Request
Method được hiểu như quy định về những cái gì bạn có thể làm với một Requested URL nhất định. Hai Method phổ biến bạn hay gặp nhất bao gồm:
– GET: Lấy thông tin từ Server. Có thể gửi thông số Request thông qua Query String.
– POST: Đẩy thông tin lên Server. Thông số Request có thể gửi qua URL Query String hoặc Message Body. Lưu ý là thông số gửi qua Message Body sẽ bị loại bỏ khi bookmark.
Ngoài 2 thằng quan trọng trên, bạn cũng có thể gặp một số thằng khác như:
– HEAD: Tương tự như GET nhưng phần Response của Server sẽ không có Message Body. Cái này kiểu như để hỏi Server “Ê ku, cái Resquested URL còn ngon không để anh gửi GET Request?”
– TRACE: Mục tiêu cũng để thăm dò xem có ông Proxy Server nào chọc ngoáy vô Request không (bạn có thể xem thêm về Sê-ri Proxy Server như tôi đã giới thiệu). Lúc này, trong phần Response Body, Server sẽ gửi lại chính xác cái nội dung Request Message nó đã nhận.
– OPTIONS: Cái này dùng để hỏi Server xem với một cái Resquested URL cụ thể thì Client có thể dùng được cái HTTP Method nào. Lúc này trong Respone bạn cần tìm thông tin trong Allow Header.
– PUT: Nhằm upload một tài nguyên cụ thể (chứa trong phần Message Body) lên Server
#3 Cấu trúc HTTP Respone Message
Response Message thường sẽ bao gồm các thành phần như sau.
#3.1 Dòng Status Line đầu tiên
Dòng này bao gồm 3 thành phần cách nhau bởi space (khoảng trắng) như ví dụ sau:
`HTTP/1.1 200 OK `
Trong đó:
– HTTP Version: Phiên bản HTTP đang sử dụng
– Status Codes: Mã trạng thái thể hiện qua các con số cho biết kết quả của Request. Nếu bạn thấy `200` là ngon ăn rồi đấy. Cái này tôi nghĩ khá quan trọng nên tôi sẽ giới thiệu kỹ thêm ở Mục #4.
– Mô tả: cái này dạng text để diễn giải cho cái Status Code nói trên. Ví dụ `200` ở trên tương ứng với `OK`
#3.2 Các dòng Header tùy chọn tiếp theo
Bạn có thể gặp các thể loại sau:
– Server: Thông tin tham khảo về cái Web Server Software đang sử dụng. Ví dụ như:
`Server: Microsoft-IIS/6.0`
– Set-Cookie: Cái này sẽ được sử dụng trong Cookie Header của Request tiếp theo để duy trì phiên kết nối. Ví dụ như:
`Set-Cookie: tracking=tI8rk7joMx44S2Uu85nSWc `
– Content-Type: cho biết loại của Message Body. Ví dụ như:
`Content-Type: text/html; charset=utf-8`
– Content-Length: thông tin độ dài của Message Body theo Byte. Ví dụ như:
`Content-Length: 1067`
Ngoài đám này thì bạn có thể gặp nhiều thể loại khác nữa. Tôi sẽ giới thiệu thêm ở Mục #4 để tiện theo dõi.
#3.3 Phần còn lại
Phần này thì sẽ bao gồm 1 dòng trống để ngăn cách và sau đó là Message Body tùy chọn. Message Body thường sẽ là cái HTML document kiểu như sau.
#3 Các thể loại Status Codes trong HTTP Respone Message
Status Codes có thể phân thành 5 nhóm sau:
– 1xx: Mục đích thông tin
– 2xx: Báo Request thành công
– 3xx: Client sẽ bị Redirect sang nguồn khác
– 4xx: Request có lỗi
– 5xx: Server bị lỗi khi xử lý Request
Mã thì nhiều mênh mông nhưng một số cái quan trọng bạn cần để ý như sau
Mã | Mô tả | Diễn giải |
100 | Continue | Gặp trong tình huống Client gửi Request có phần Message Body. Cái Respone này ý là Server đã nhận được Request Header và kêu Client “Gửi tiếp đi cái Body ku!” |
200 | OK | Cái này thì như đã nói trên. Ý Server muốn nói với Client “Hàng chú yêu cầu đây. Cắn đi” |
201 | Created | Cái này thì để phản hồi cho PUT Method của Client. Và Server phản hồi cho Client với ý “Mọi chuyện chú yêu cầu anh triển hết rồi đấy” |
301 | Moved Permanently | Khi đụng cái này Browser sẽ bị Redirect sang URL khác. Lúc này trong Respone Header sẽ có thêm Location Header. Client nên sử dụng cái URL mới này thay cho cái cũ |
302 | Found | Cái này giống với mã 301 nhưng vì việc Redirect này chỉ có tính tạm thời nên sau đó Client cứ dùng cái URL cũ |
304 | Not Modified | Với cái này thì Server muốn báo Browser đọc lại Cache đi vì nội dung trên Server cũng thế thôi chứ không có thay đổi gì (Server kiểm soát bằng If-Modified-Since và If-None-Match Header) |
400 | Bad Request | Cái này thì cái tên nói lên tất cả, vấn đề ông Client đã submit một cái HTTP Request ba xàm (ví dụ lỡ tay chỉnh bậy cái URL) |
401 | Unauthorized | Kiểu này xuất hiện khi Client Request đến tài nguyên cần có yêu cầu xác thực khi Server vẫn chưa xác nhận cái Authentication này. Chi tiết về các thể loại xác thực hỗ trợ sẽ được thể hiện trong WWW-Authenticate Header |
403 | Forbidden | Phần mô tả đã quá rõ rồi, bạn bị cấm truy cập cái này, đừng hỏi lằng nhằng nữa |
404 | Not Found | Trường hợp này thì do cái tài nguyên bạn Request hiện không có (Có thể tạm thời hoặc ông Server đã dẹp hẳn luôn rồi) |
405 | Method Not Allowed | URL cụ thể bạn đang truy cập không hỗ trợ cái Medthod được chỉ định trong Request. |
413 | Request Entity Too Large | Mã này xuất hiện khi cái Body của Request dài quá quy định (có thể gặp với lỗi Buffer Overflow) |
414 | Request URL Too Long | Giống thằng ở trên. Có điều ở đây là cái URL quá dài (chắc lỗi đánh máy) |
500 | Internal Server Error | Lỗi này xuất hiện khi Server xử lý Request có thông số đầu vào dẫn đến lỗi phát sinh mà ông dev không lường trước được |
503 | Service Unavailable | Cái này thì cho biết cái Server vẫn chạy và xử lý tốt Request tuy nhiên ứng dụng đã bị lỗi chỗ nào khác (bạn cần thử lại xem mình có thao tác vớ vẩn gì không hay lỗi hoàn toàn do cái ứng dụng) |
Phù! Thế là tạm xong với các nội dung cơ bản của HTTP. Trong kỳ tới tôi sẽ bàn sang cái vấn đề chính mà tôi đang hướng đến là HTTPS.
4 thoughts on “Giải ngố WWW – Phần 2: 4 điều cơ bản phải biết về HTTP”