Hypertext Transfer Protocol

HTTP (tiếng Anh: HyperText Transfer Protocol - "Giao thức truyền tải siêu văn bản") là một giao thức lớp ứng dụng nằm trong bộ giao thức dành cho hệ thống thông tin siêu phương tiện phân tán, cộng tác. Nó chính là nền tảng dùng để trao đổi và liên lạc dữ liệu với World Wide Web, nơi mà các tập tin tài liệu siêu văn bản có thể chứa các siêu liên kết dẫn đến các tài nguyên số khác mà người dùng có thể dễ dàng truy cập được bằng cách dùng chuột nhấp vào hoặc dùng ngón tay chạm vào màn hình cảm ứng lúc duyệt web. Nhờ đó, HTTP cho phép người sử dụng truy cập và tải về các tài nguyên như văn bản HTML, text, video, ảnh... của các trang web và hiển thị chúng trên trình duyệt.

Tim Berners-Lee là người khởi xướng cho sự hình thành và phát triển của HTTP vào năm 1989 tại CERN. Nội dung ý tưởng của HTTP được tóm gọn lại trong một tài liệu cơ bản, bên trong mô tả hoạt động tương tác giữa máy khách và máy chủ ở phiên bản HTTP thử nghiệm đầu tiên, có số 0.9. Phiên bản đó một thời gian sau được phát triển, trở thành phiên bản chính thức 1.0.

Quá trình phát triển các RFC HTTP ban đầu là nhờ vào sự hợp tác từ phía Lực lượng Đặc nhiệm Kỹ thuật Internet (IETF) và World Wide Web Consortium (W3C), về sau thì chuyển sang do IETF phụ trách.

HTTP/1 được hoàn thiện và xuất bản tài liệu sử dụng (phiên bản 1.0) vào năm 1996. HTTP tiếp tục được phát triển vào năm 1997 (khi này là phiên bản 1.1), và đặc tính kỹ thuật của nó được cải tiến lần lượt vào các năm 1999, 2014 và 2022.

Sau này, phiên bản bảo mật hơn của HTTP là HTTPS được sử dụng rộng rãi trên hơn 80% trang web. HTTP/2 là một giao thức hiệu quả hơn về ngữ nghĩa của HTTP "trên dây" và được đưa vào sử dụng vào năm 2015. nó được sử dụng trên 39% trang web và được gần như toàn bộ trình duyệt web hỗ trợ (chiếm 97% người sử dụng). Ngoài ra, nó cũng được hỗ trợ bởi các máy chủ web lớn qua Bảo mật tầng truyền tải (TLS) bằng cách sử dụng tiện ích mở rộng Application-Layer Protocol Negotiation (ALPN) nhưng bắt buộc phải sử dụng TLS 1.2 hoặc mới hơn.

HTTP/3 là phiên bản kế nhiệm của HTTP/2 được triển khai vào năm 2022. Nó đã được sử dụng trên 26% trang web và được nhiều trình duyệt hỗ trợ. Phiên bản này sử dụng QUIC thay vì TCP cho giao thức truyền tải cơ bản. Giống như HTTP/2, nó không gây lỗi thời các phiên bản chính trước đó của giao thức. Hỗ trợ dành cho cho HTTP/3 đã được bổ sung vào Cloudflare và Google Chrome vào tháng 9 năm 2019, và có thể được kích hoạt trong các phiên bản ổn định của Chrome và Firefox. HTTP/3 có độ trễ thấp hơn khi duyệt các trang web, tải trang nhanh hơn HTTP/2, và thậm chí còn nhanh hơn nhiều so với HTTP/1.1, trong một số trường hợp thì HTTP/3 cho tốc độ nhanh gấp ba lần so với HTTP/1.1.

== Tổng quan về mặt kỹ thuật ==
HTTP hoạt động dựa trên giao thức yêu cầu-phản hồi nằm trong mô hình khách - chủ. "Khách" có thể là một trình duyệt được một người truy cập thực hiện yêu cầu, còn "chủ" có thể là một máy chủ web trên đám mây hoặc lưu trữ cục bộ chạy trên một chiếc máy tính quản lý một hay nhiều trang web. Khách sẽ gửi một yêu cầu HTTP lên cho máy chủ. Còn máy chủ (nơi cung cấp các "tài nguyên" chẳng hạn như tập tin HTML và những nội dung, hoặc thực hiện những chức năng khác thay mặt cho khách) sẽ "phản hồi" lại thông điệp cho khách. Thông điệp được phản hồi sẽ chứa thông tin hoàn thành yêu cầu như thế nào, và đôi khi cũng sẽ chứa thông tin được yêu cầu trong phần nội dung của nó.

Trình duyệt web là ví dụ điển hình của "user agent" (UA). Các loại user agent khác có thể kể đến gồm có các công cụ tự động lập chỉ mục được sử dụng bởi các bộ máy tìm kiếm (web crawler), duyệt tìm bằng giọng nói, ứng dụng di động hoặc những phần mềm khác có thể truy cập, tải xuống và hiển thị nội dung web.

HTTP được thiết kế nhằm cải thiện các thành phần mạng trung gian cùng với cho phép liên lạc giữa máy khách và máy chủ. Các trang web có lưu lượng truy cập cao thường tận dụng những ưu điểm từ các máy chủ bộ đệm web (web caching) nhằm cung cấp nội dung thay mặt cho các máy chủ ngược dòng để cải thiện thời gian phản hồi. Trình duyệt web thường sẽ lưu giữ các tài nguyên web đã từng được truy cập trước đó vào bộ nhớ và tái sử dụng chúng bất cứ khi nào có thể để giảm lưu lượng mạng. Máy chủ proxy HTTP ở không gian mạng riêng tư có thể tạo điều kiện liên lạc cho khách mà không cần địa chỉ có thể định tuyến toàn cầu bằng cách chuyển tiếp thông điệp với máy chủ bên ngoài.

Để cho phép các nút HTTP trung gian chẳng hạn như proxy, web cache... có thể thực hiện được chức năng thì một số tiêu đề HTTP (có trong phần yêu cầu/phản hồi HTTP) sẽ được quản lý theo từng bước (hop-by-hop), trong khi những tiêu đề khác thì được quản lý đầu cuối (tức là chỉ duy nhất một khách đầu nguồn và một máy chủ được chỉ định).

HTTP là một giao thức lớp ứng dụng được thiết kế hoạt động trong khuôn khổ bộ giao thức Internet. Ngoài ra, nó cũng còn được giả định cho là giao thức lớp vận chuyển cơ bản và đáng tin cậy. Trong phiên bản HTTP/3 mới nhất, Transmission Control Protocol (TCP) không còn được sử dụng nữa nhưng các phiên bản cũ thì vẫn còn sử dụng rất nhiều. HTTP cũng được thiết kế và điều chỉnh để sử dụng các giao thức không đáng tin cậy như User Datagram Protocol (UDP), và công nghệ mà HTTP/3 gián tiếp xây dựng dựa trên nó, ví dụ như HTTPU và Simple Service Discovery Protocol (SSDP).

Tài nguyên HTTP cùng vị trí của nó được xác định dựa trên đường dẫn URL (Uniform Resource Locator), sử dụng bộ URI "http" và "https". Theo như định nghĩa , các URL sẽ được mã hoá ở dạng siêu liên kết trong các tập tin tư liệu HTML để hình thành tập tin tư liệu siêu văn bản liên kết với nhau.

Ở phiên bản HTTP/1.0, một kết nối TCP đến cùng máy chủ sẽ được thực hiện cho mỗi yêu cầu tài nguyên.

Ở phiên bản HTTP/1.1, một kết nối TCP có thể được sử dụng nhiều lần để tạo ra nhiều yêu cầu tài nguyên khác (trang HTML, khung, hình ảnh, mã nguồn...). Nhờ vậy, liên lạc qua HTTP/1.1 sẽ ít gặp độ trễ hơn, vốn dĩ việc thiết lập các kết nối TCP gây ra chi phí đáng kể, đặc biệt trong điều kiện lưu lượng truy cập cao.

HTTP/2 là phần cải tiến của HTTP/1.1 trước đó nhằm giữ lại mô hình khách-chủ và phương pháp giao thức giống nhau nhưng khác nhau ở chỗ:
- để sử dụng siêu dữ liệu nhị phân nén (tiêu đề HTTP) thay vì dạng văn bản, để tiêu đề yêu cầu ít không gian hơn;
- để sử dụng một kết nối TCP/IP duy nhất (thường đã được mã hoá) cho mỗi tên miền máy chủ được truy cập thay vì từ 2 cho tới 8 kết nối TCP/IP;
- để sử dụng một hoặc nhiều luồng stream hai chiều cho mỗi kết nối TCP/IP trong đó các yêu cầu/phản hồi HTTP được chia nhỏ và truyền thành từng gói (packet) nhỏ để gần như giải quyết được vấn đề HOLB (head-of-line blocking).
- để thêm khả năng "đẩy", cho phép ứng dụng máy chủ gửi dữ liệu đến máy khách bất cứ khi nào có dữ liệu mới (không bắt buộc máy khách phải yêu cầu dữ liệu mới định kỳ đến máy chủ bằng cách sử dụng phương pháp polling).

Nhờ đó, liên lạc qua HTTP/2 sẽ giảm độ trễ đi nhiều, và nhiều lúc còn chạy nhanh hơn cả liên lạc qua HTTP/1.1.

HTTP/3 là bản tinh chỉnh của HTTP/2 nhằm sử dụng giao thức truyền tải QUIC + UDP thay cho TCP. Trước đó, phiên bản kết nối TCP/IP được sử dụng, thì giờ đây chỉ có lớp IP (được xây dựng trên UDP, như TCP) cũng cải thiện một chút tốc độ liên lạc trung bình và để tránh sự cố tắc nghẽn kết nối TCP không thường xuyên (rất hiếm) có thể tạm thời chặn đứng hoặc làm chậm luồng dữ liệu của tất cả các stream của nó (dạng khác của ""head of line blocking"").

== Lịch sử ==
Khái niệm siêu văn bản được Ted Nelson đặt ra vào năm 1965 trong dự án Xanadu lấy cảm hứng từ tầm nhìn những năm 1930 về hệ thống quản lý và truy xuất thông tin dựa trên vi phim "memex" nằm trong luận án "As We May Think" của ông vào năm 1945. Tim Berners-Lee và nhóm nghiêm cứu của ông tại CERN được ghi công phát minh HTTP nguyên thuỷ, cùng với HTML và công nghệ đi liền cho máy chủ web và giao diện người dùng máy khách được gọi là trình duyệt web. Berners-Lee thiết kế HTTP nhằm mục đích bổ trợ cho ý tưởng sáng tạo khác của ông: dự án "WorldWideWeb" lần đầu tiên công bố vào 1989 và nổi tiếng ngày nay với World Wide Web.

Máy chủ web đầu tiên được đưa vào hoạt động vào năm 1990. Giao thức được sử dụng chỉ có một phương thức duy nhất, mang tên GET, có nghĩa là yêu cầu trích xuất dữ liệu một trang từ một máy chủ. Phản hồi từ phía máy chủ luôn luôn là một trang định dạng HTML.

=== Tóm lược các cột mốc phiên bản HTTP ===
- HTTP/0.9
- HTTP/1.0-nháp
- Nhóm làm việc HTTP W3C
- HTTP/1.0
- HTTP/1.1
- Nhóm làm việc HTTP-NG W3C
- Nhóm làm việc IETF HTTP đã tái hoạt động.
- SPDY<nowiki>:</nowiki> một giao thức HTTP không chính thức được phát triển bởi Google
- HTTP/2
- Các bản cập nhật 2014 dành cho HTTP/1.1
- Ngừng sử dụng và hỗ trợ HTTP/0.9
- HTTP/3
- Cập nhật và tái cấu trúc vào năm 2022

== HTTP Session ==
Session (phiên làm việc) là một khái niệm phổ biến được dùng trong lập trình web có kết nối với database. Đặc biệt các chức năng như đăng nhập, đăng xuất người dùng sẽ khó có thể thực hiện được nếu không sử dụng session. Ví dụ email, giao dịch ngân hàng...

== HTTP Request methods ==
HTTP Request Method chỉ phương thức để được thực hiện trên nguồn được nhận diện bởi Request-URI đã cung cấp

GET

GET được sử dụng để lấy lại thông tin từ máy chủ đã cung cấp bởi sử dụng một URI đã cung cấp. Các yêu cầu sử dụng GET chỉ nhận dữ liệu và không có ảnh hưởng gì tới dữ liệu.

HEAD

Tương tự như GET, nhưng nó truyền tải dòng trạng thái và khu vực header.

POST

Một yêu cầu POST sử dụng các mẫu HTML để gửi dữ liệu tới máy chủ, như thông tin khách hàng, file tải lên...

PUT

Thay đổi tất cả các đại diện hiện tại của nguồn mục tiêu với nội dung được tải lên.

DELETE

Gỡ bỏ tất cả các đại diện hiện tại của nguồn mục tiêu bởi URI.

CONNECT

Thiết lập một tunnel tới máy chủ được xác định bởi URI đã cung cấp.

OPTIONS

Miêu tả các chức năng giao tiếp cho nguồn mục tiêu.

TRACE

Trình bày một vòng lặp kiểm tra thông báo song song với path tới nguồn mục tiêu.

== HTTP Response ==
Khi nhận và phiên dịch một HTTP Request, máy chủ sẽ gửi tín hiệu phản hồi là một HTTP Response bao gồm các thành phần sau:
- Một dòng trạng thái (Status-Line)
- Không hoặc nhiều hơn các trường Header (General | Response | Entity) được theo sau CRLF
- Một dòng trống chỉ dòng kết thúc của các trường header
- Một phần thân thông báo tùy ý

===Server response===
Một ví dụ về một HTTP Response:
HTTP/1.1 200 OK
Date: Mon, ngày 23 tháng 5 năm 2005 22:38:34 GMT
Content-Type: text/html; charset=UTF-8
Content-Encoding: UTF-8
Content-Length: 138
Last-Modified: Wed, 08 Jan 2003 23:11:55 GMT
Server: Apache/1.3.3.7 (Unix) (Red-Hat/Linux)
ETag: "3f80f-1b6-3e1cb03b"
Accept-Ranges: bytes
Connection: close

<html>
<head>
</head>
<body>
</body>
</html>
Dòng Status-Line: Một dòng Status Line bao gồm phiên bản giao thức (HTTP-Version) sau đó là mã hóa trạng thái số (Status-Code) và cụm từ thuần văn bản được liên kết của nó. Các thành phần được phân biệt bởi dấu cách.

=== HTTP Status Code ===
Mã trạng thái HTTP được máy chủ phản hồi lại mỗi khi nhận được HTTP Resquest.

Yếu tố Status-Code là một số nguyên 3 ký tự, trong đó ký tự đầu tiên của mã hóa trạng thái định nghĩa hạng (loại) phản hồi và hai ký tự cuối không có bất cứ vai trò phân loại nào. Có 5 giá trị của ký tự đầu tiên như sau:

==== 1xx: Thông tin ====
Nó nghĩa là yêu cầu đã được nhận và tiến trình đang tiếp tục.

=====   100 (Continue) =====
Máy chủ trả về mã này để chỉ ra rằng nó đã nhận được một phần đầu tiên của một yêu cầu và được chờ đợi cho phần còn lại.

===== 101 (Switching protocols) =====
Bên yêu cầu đã yêu cầu các máy chủ để chuyển đổi và máy chủ được thừa nhận rằng nó sẽ làm như vậy

==== 2xx: Thành công ====
Nó nghĩa là hoạt động đã được nhận, được hiểu, và được chấp nhận một cách thành công.

===== 200 (Successful) =====
Các máy chủ xử lý yêu cầu thành công

===== 201 (Created) =====
Yêu cầu đã thành công và các máy chủ tạo ra một nguồn tài nguyên mới.

===== 202 (Accepted) =====
Máy chủ đã chấp nhận yêu cầu, nhưng vẫn chưa xử lý nó

===== 203 (Non-authoritative information) =====
Máy chủ xử lý yêu cầu thành công, nhưng đang quay trở lại các thông tin mà có thể là từ một nguồn khác.

===== 204 (No content) =====
Các máy chủ xử lý yêu cầu thành công, nhưng không trả lại bất kỳ nội dung nào

===== 205 (Reset content) =====
Các máy chủ proccessed yêu cầu thành công, nhưng không trả lại bất kỳ nội dung. Không giống như một phản ứng 204, phản ứng này đòi hỏi người yêu cầu thiết lập lại xem tài liệu

===== 206 (Partial content) =====
Các máy chủ xử lý thành công một phần của một yêu cầu

==== 3xx: Sự điều hướng lại ====
Nó nghĩa là hoạt động phải được thực hiện để hoàn thành yêu cầu.

===== 301 (Moved permanently) =====
Các trang web yêu cầu đã bị di chuyển vĩnh viễn tới URL mới

==== 302 (Moved temporarily) ====
Trang được yêu cầu đã di chuyển tạm thời tới một URL mới

==== 304 (Not modified) ====
Các trang yêu cầu đã không được sửa đổi kể từ khi yêu cầu cuối cùng. Khi máy chủ trả về phản hồi này, nó không trả lại các nội dung của trang.

==== 4xx: Lỗi Client ====
Nó nghĩa là yêu cầu chứa cú pháp không chính xác hoặc không được thực hiện

===== 400 (Bad request) =====
Các máy chủ không hiểu được yêu cầu.

==== 401 (Not authorized) ====
Đề nghị yêu cầu xác thực. Máy chủ có thể trả về phản hồi này yêu cầu xác thực đăng nhập tài khoản và mật khẩu (thông thường máy chủ trả về phản hồi này nếu client gửi request một trang đăng nhập)

===== 403 (Forbidden) =====
Máy chủ từ chối yêu cầu.(thông thường nếu đăng nhập không thành công máy chủ sẽ trả về mã lỗi này)

===== 404 (Not found) =====
Máy chủ không thể tìm thấy trang yêu cầu. Ví dụ, máy chủ thường trả về mã này nếu có 1 yêu cầu tới một trang không tồn tại trên máy chủ.

===== 405 (Method not allowed) =====
Phương thức được xác định trong yêu cầu là không được cho phép.

===== 406 (Not acceptable) =====
Máy chủ chỉ có thể tạo một phản hồi mà không được chấp nhận bởi Client.

===== 407 (Proxy authentication required) =====
Yêu cầu client phải xác thực sử dụng một proxy. Khi máy chủ trả về phản hồi này, nó cũng chỉ ra proxy mà người yêu cầu phải sử dụng.

==== 408 (Request timeout) ====
Request tốn thời gian dài hơn thời gian máy chủ phản hồi

===== 409 (Conflict) =====
Các máy chủ gặp phải một cuộc xung đột thực hiện yêu cầu. Các máy chủ phải bao gồm thông tin về các cuộc xung đột trong các phản ứng. Máy chủ có thể trả về mã này để đáp ứng với yêu cầu PUT xung đột với yêu cầu trước đó, cùng với một danh sách các sự khác biệt giữa các yêu cầu.

===== 410 (Gone) =====
Các máy chủ trả về phản hồi này khi các nguồn tài nguyên yêu cầu đã bị loại bỏ vĩnh viễn. Nó tương tự như một 404 (Không tìm thấy) mã, nhưng đôi khi được sử dụng ở vị trí của một 404 cho nguồn lực được sử dụng để tồn tại nhưng không còn làm. Nếu tài nguyên đã di chuyển vĩnh viễn, bạn nên sử dụng một 301 để xác định vị trí mới của tài nguyên.

===== 411 (Length required) =====
Content-Length không được xác định rõ. Máy chủ sẽ không chấp nhận yêu cầu mà không có nó

===== 412 (Precondition failed) =====
Các máy chủ không đáp ứng một trong các điều kiện tiên quyết mà người yêu cầu đưa vào yêu cầu.

===== 413 (Request entity too large) =====
Máy chủ không thể xử lý yêu cầu bởi vì nó là quá lớn đối với các máy chủ để xử lý.

===== 414 (Requested URI is too long) =====
URI yêu cầu (thường là một URL) là quá dài đối với máy chủ để xử lý.

===== 416 (Requested range not satisfiable) =====
Máy chủ trả về mã trạng thái này nếu yêu cầu cho một phạm vi không có sẵn cho trang.

===== 417 (Expectation failed) =====
Máy chủ không thể đáp ứng yêu cầu của các trường yêu cầu, tiêu đề mong đợi.

==== 5xx: Lỗi Server ====
Nó nghĩa là máy chủ thất bại với việc thực hiện một yêu cầu nhìn như có vẻ khả thi.

===== 500 (Internal server error) =====
Các máy chủ gặp lỗi và không thể thực hiện yêu cầu.

===== 501 (Not implemented) =====
Các máy chủ không có các chức năng để thực hiện yêu cầu. Ví dụ, máy chủ có thể trả về mã này khi nó không nhận ra phương thức yêu cầu.

===== 502 (Bad gateway) =====
Các máy chủ đã hoạt động như một gateway hoặc proxy và nhận được một phản ứng không hợp lệ từ máy chủ ngược.

===== 503 (Service unavailable) =====
Máy chủ hiện không có sẵn (vì nó bị quá tải hoặc xuống để bảo trì). Nói chung, đây là một trạng thái tạm thời.

===== 504 (Gateway timeout) =====
Các máy chủ đã hoạt động như một gateway hoặc proxy và đã không nhận được yêu cầu kịp thời từ máy chủ ngược.

===== 505 (HTTP version not supported) =====
Các máy chủ không hỗ trợ phiên bản giao thức HTTP được sử dụng trong yêu cầu.

Sau đây là danh sách tất cả các mã trạng thái HTTP được liệt kê theo tài liệu giao thức HTTP của trang w3c

=== HTTP Response Header Fields ===
Các trường Header phản hồi cho phép Server truyền thông tin thêm về phản hồi mà không thể được đặt trong dòng Status-Line. Những trường Header này cung cấp thông tin về Server và về truy cập từ xa tới nguồn được xác định bởi Request-URI:

== Encrypted connections ==
Có 2 cách phổ biến mã hóa kết nối HTTP là HTTP secure (viết tắt HTTPS = HTTP + SSL) hoặc kết hợp HTTP và Transport Layer Securerity (TLS)

== Liên quan ==
- FTP
- HTTPS
- UDP
- TCP/IP

== Liên kết ngoài ==
1. HTTP Protocol w3c.org. Liên kết: https://www.w3.org/Protocols/
2. Hypertext Transfer Protocol wikipedia https://en.wikipedia.org/wiki/Hypertext_Transfer_Protocol
3. Bản RFC 2616 https://tools.ietf.org/html/rfc2616