Photo by Hal Gatewood on Unsplash
[Basic knowledge][Internet] HTTP là gì?
Nền tảng của World Wide Web, giao thức sử dụng trên mọi trình duyệt
HTTP Overview
HTTP là một giao thức để tìm nạp các tài nguyên như tài liệu HTML.
Nó là nền tảng của bất kỳ trao đổi dữ liệu nào trên Web và nó là một giao thức máy khách-máy chủ (client - server), có nghĩa là các yêu cầu được khởi tạo bởi người nhận, thường là trình duyệt Web.
Một tài liệu hoàn chỉnh được tạo lại từ các tài liệu con khác nhau được tìm nạp, chẳng hạn như văn bản, mô tả bố cục, hình ảnh, video, tập lệnh và nhiều thành phần khác nữa
Client và server giao tiếp bằng cách trao đổi các thông điệp riêng lẻ (trái ngược với một luồng dữ liệu). Các thông điệp được gửi từ client (thường là một trình duyệt Web), được gọi là yêu cầu (request) và các thông báo được gửi bởi server dưới dạng câu trả lời được gọi là phản hồi (response).
Được thiết kế vào đầu những năm 1990, HTTP là một giao thức có thể mở rộng đã phát triển theo thời gian. Nó là một giao thức ở tầng ứng dụng (application layer) được gửi qua TCP hoặc qua kết nối TCP được mã hóa bằng TLS. Mặc dù về mặt lý thuyết, bất kỳ giao thức truyền tải đáng tin cậy nào cũng có thể được sử dụng.
Do khả năng mở rộng của nó, nó được sử dụng để không chỉ tìm nạp các tài liệu siêu văn bản, mà còn cả hình ảnh và video hoặc để đăng nội dung lên servers, ví dụ như các kết quả của HTML form. HTTP cũng có thể được sử dụng để tìm nạp các phần của tài liệu nhằm cập nhật các trang Web theo yêu cầu.
Components of HTTP-based systems
HTTP là một giao thức client-server: các yêu cầu được gửi bởi một thực thể, user-agent (hoặc một proxy thay mặt cho nó). Hầu hết thời gian user-agent là một trình duyệt Web, nhưng nó có thể là bất cứ thứ gì, ví dụ, một robot thu thập thông tin trên Web để điền và duy trì chỉ mục của công cụ tìm kiếm (search engine index).
Mỗi request riêng lẻ được gửi đến một server, server sẽ xử lý nó và cung cấp một response. Giữa client và server có rất nhiều thực thể, được gọi chung là proxy, thực hiện các hoạt động khác nhau. Ví dụ như gateways, hoặc caches
Trong thực tế, có nhiều máy tính hơn giữa trình duyệt và server để xử lý request: có bộ định tuyến (routers), modem, v.v. Nhờ thiết kế phân lớp của Web, chúng được ẩn trong network và các tầng truyền tải (transport layers). HTTP ở trên cùng, ở tầng ứng dụng (application layers). Mặc dù quan trọng đối với việc chẩn đoán các sự cố mạng, nhưng các lớp bên dưới hầu như không liên quan đến thiết kế của HTTP.
Client: the user-agent
- user-agent là bất kỳ công cụ nào hoạt động thay mặt cho người dùng. Vai trò này chủ yếu được thực hiện bởi trình duyệt Web, nhưng nó cũng có thể được thực hiện bởi các chương trình được các kỹ sư và nhà phát triển Web sử dụng để gỡ lỗi cho các ứng dụng của họ.
- Trình duyệt luôn là thực thể khởi tạo request. Không bao giờ là server (mặc dù một số cơ chế đã được thêm vào trong nhiều năm để mô phỏng các thông báo do server khởi tạo).
- Để hiển thị một trang Web, trình duyệt sẽ gửi một request ban đầu để tìm nạp tài liệu HTML đại diện cho trang đó. Sau đó, nó phân tích cú pháp tệp này, đưa ra các yêu cầu bổ sung tương ứng với các tập lệnh thực thi, thông tin bố cục (CSS) để hiển thị và các tài nguyên phụ có trong trang (thường là hình ảnh và video). Sau đó, trình duyệt Web kết hợp các tài nguyên này để trình bày tài liệu hoàn chỉnh, trang Web. Các tập lệnh do trình duyệt thực thi có thể lấy thêm tài nguyên trong các giai đoạn sau và trình duyệt Web sẽ cập nhật trang Web cho phù hợp.
- Trang Web là một tài liệu siêu văn bản (hypertext document). Điều này có nghĩa là một số phần của nội dung được hiển thị là các liên kết, có thể được kích hoạt (thường bằng cách nhấp chuột) để tìm nạp một trang Web mới, cho phép người dùng điều hướng user-agent của họ và điều hướng qua Web. Trình duyệt chuyển các hướng dẫn này thành các HTTP requests và diễn giải thêm các HTTP responses để cung cấp cho người dùng một response rõ ràng.
The Web server
- Server phục vụ theo request của client. Một server hầu như chỉ xuất hiện dưới dạng một máy duy nhất; nhưng nó thực sự có thể là một tập hợp các servers chia sẻ tải (cân bằng tải - load balancing) hoặc một phần mềm phức tạp liên kết đến các máy tính khác (như bộ nhớ cache, database server, hoặc e-commerce servers), tạo toàn bộ hoặc một phần tài liệu theo yêu cầu.
- Một Server không nhất thiết phải là một máy duy nhất, nhưng một số phiên bản phần mềm máy chủ có thể được lưu trữ trên cùng một máy. Với HTTP / 1.1 và Host header, chúng thậm chí có thể chia sẻ cùng một địa chỉ IP.
Proxies
Giữa trình duyệt Web và server, có nhiều máy tính tiếp các thông điệp HTTP. Do cấu trúc phân lớp của ngăn xếp Web, hầu hết chúng hoạt động ở tầng transport, tầng network hoặc tầng physical, và trở nên trong suốt ở tầng HTTP, có khả năng có tác động đáng kể đến hiệu suất (performance).
Những gì hoạt động ở các tầng ứng dụng (application layers) thường được gọi là proxy. Chúng có thể minh bạch, chuyển tiếp các request chúng nhận được mà không thay đổi chúng theo bất kỳ cách nào hoặc không minh bạch, trong trường hợp không minh bạch, chúng sẽ thay đổi request theo một cách nào đó trước khi chuyển nó đến server. Proxy có thể thực hiện nhiều chức năng:
- caching (bộ nhớ cache có thể công khai hoặc private, ví dụ như cache của trình duyệt)
- filtering (như chống vi-rut, hoặc các kiểm soát của phụ huynh)
- load balancing (cho phép nhiều máy chủ thực hiện các request khác nhau)
- authentication (kiểm soát quyền truy cập đến các tài nguyên khác nhau ở server)
- logging (cho phép lưu trữ thông tin lịch sử truy cập)
Basic aspects of HTTP
- HTTP rất đơn giản: Việc đơn giản đến từ thiết kế của HTTP (thậm chí cả HTTP/2, HTTP/3), rất dễ dàng tiếp cận cho các lập trình viên mới, hoặc thậm chí là bất kỳ ai
- HTTP dễ dàng mở rộng: HTTP headers giúp cho giao thức HTTP dễ dàng được mở rộng, hiện nay đã có các phiên bản HTTP/2, HTTP/3, .v.v..
- HTTP là stateless, nhưng không phải sessionless
- stateless: không có kết nối giữa 2 request được thực hiện liên tiếp trên cùng một connection.
- không phải sessionless: bản thân HTTP cookies cho phép sử dụng các phiên trạng thái để giúp các HTTPS request chia sẻ cùng một ngữ cảnh, một trạng thái (ví dụ cùng một user đang thao tác)
- HTTP và các kết nối: ⇒ bổ sung
What can be controlled by HTTP
Do tính chất có thể mở rộng của HTTP, nên theo thời gian, HTTP được phép kiểm soát nhiều hơn và chức năng của Web được mở rộng. Cache và authentication là các chức năng được xử lý sớm trong lịch sử HTTP. Chúng ta cùng đi qua một vài thứ mà HTTP có thể kiểm soát:
- Caching: Cách HTTP lưu trữ response của server tại client, và tái sử dụng cho các request tiếp theo (nếu có thể). Trong thực tế, ngoài HTTP cache (client cache) còn có rất nhiều cách caching khác nhau (tôi sẽ không trình bày thêm ở đây, để tránh đi quá xa khỏi nội dung của chủ đề)
- Giảm bớt origin constraint: Để ngăn chặn việc theo dõi và các hành vi xâm phạm quyền riêng tư, các trình duyệt Web thực thi sự tách biệt nghiêm ngặt giữa các trang web với nhau. Chỉ các trang từ cùng một nguồn gốc mới có thể truy cập tất cả thông tin của trang web đó (có thể hiểu là cùng đường dẫn, cùng port). HTTP header có thể giảm bớt sự phân tách nghiêm ngặt này ở phía server, cho phép một tài liệu trở thành một tập hợp thông tin có nguồn gốc từ các tên miền khác nhau.
- Authentication: Một số trang có thể được bảo vệ để chỉ những người dùng cụ thể mới có thể truy cập chúng. Xác thực cơ bản (basic authentication) có thể được cung cấp bởi HTTP, sử dụng WWW-Authenticate và các headers tương tự hoặc bằng cách thiết lập một phiên cụ thể bằng cách sử dụng cookie HTTP.
- Proxy và tunneling: Client hoặc Server thường được đặt trên mạng nội bộ và ẩn địa chỉ IP thực của chúng với các máy tính khác. Các HTTP request sau đó đi qua proxy để đến được server (và ngược lại). Không phải tất cả proxy đều là HTTP proxy. Ví dụ, giao thức SOCKS hoạt động ở cấp độ thấp hơn. Các giao thức khác như ftp, có thể được xử lý bởi các HTTP proxy.
- Sessions: Sử dụng HTTP cookie cho phép bạn liên kết các requests với trạng thái của server. Điều này tạo ra các phiên (sessions), mặc dù HTTP cơ bản là một giao thức state-less.
HTTP flow
Khi client giao tiếp với server, hoặc ngay cả với một proxy trung gian, nhìn chung nó sẽ thực hiện các bước sau:
- Mở kết nối TCP: Kết nối TCP được sử dụng để gửi một hoặc nhiều request và nhận lại response. Client có thể mở một kết nối mới, sử dụng lại kết nối hiện có, hoặc mở một số kết nối TCP tới các servers khác.
Gửi HTTP message: Các HTTP messages (trước HTTP/2) chưa được đóng gói, nghĩa là chúng ta có thể nhìn thấy và đọc được các messages này. Từ HTTP/2 trở đi, các tin nhắn được đóng gói trong các khung (frames) ⇒ khiến cho chúng ta không thể đọc trực tiếp, nhưng các nguyên tắc gửi và nhận thì vẫn như cũ.
Nhận và đọc response từ server
- Đóng, hoặc sử dụng lại các connection cho các request khác.
HTTP messages
HTTP messages, từ phiên bản HTTP/1.1 trở về trước chưa được đóng gói, và chúng ta có thể đọc được một cách dễ dàng
Từ HTTP/2 trở lên, những thông điệp này được nhúng vào một cấu trúc nhị phân (binary structure), một khung (frame), cho phép tối ưu hóa như nén header và multiplexing. Ngay cả khi chỉ một phần của thông báo HTTP ban đầu được gửi trong phiên bản HTTP này, ngữ nghĩa của mỗi thông báo là không thay đổi và server sẽ dịch lại (gần như toàn bộ) sang định dạng của HTTP/1.1.
Có 2 loại HTTP messages: requests và responses. mỗi loại sẽ có từng định dạng khác nhau.
HTTP request
Request bao gồm các thành phần sau
- HTTP methods, thường là một động từ như GET, POST hoặc một danh từ như OPTIONS hoặc HEAD xác định hoạt động mà ứng dụng client muốn thực hiện. Thông thường, client đơn giản muốn lấy thông tin trang web (sử dụng GET), hoặc gửi biểu mẫu thông tin (form) lên server (sử dụng POST). Trong thực tế, bên cạnh POST và GET sẽ có các phương thức khác nữa như PUT/PATCH (chúng ta sẽ tìm hiểu sau)
- Đường dẫn của tài nguyên để truy cập tới server. Một đường dẫn sẽ bao gồm các thông tin như protocol (http, https), hay TCP port (như 80, hoặc 443), nhưng chúng thường sẽ được lược bỏ (sử dụng default) ví dụ như: hoangpn.com
- Phiên bản HTTP đang sử dụng (ở hình là HTTP/1.1).
- Phần mở rộng Headers: để truyền tải thông tin cho server, giúp lấy thông tin chính xác để hoàn thiện trang web
- Body, đối với một số phương thức như POST, bao gồm các tài nguyên được gửi đi
HTTP response
Response thường bao gồm các thành phần sau
- Phiên bản HTTP đang sử dụng (ở hình là HTTP/1.1).
- Status code: chỉ ra request có thành công hay không?
- Status message: thông báo mô tả ngắn gọn về trạng thái của request
- HTTP headers (giống như request)
- Tuỳ chọn khác: ví dụ như body trả về (chứa thông tin và client mong muốn nhận được từ server)
Basic HTTP/3 vs HTTP/2 vs HTTP/1.1 comparison
Hiện tại đang có 3 version chính của HTTP đó là
- HTTP/1.1
- HTTP/2
- HTTP/3
Tôi sẽ không đi quá sâu vào phần này, đồng thời giải thích chi tiết các khái niệm, liên quan. Nhưng sẽ có một vài lưu ý như sau
- HTTP/2 đã cải tiến được việc thông tin được truyền đi sẽ biến đổi thành các binary, đóng gói thông tin (HPACK, server push). Một phần nào đó giúp cải tiến tốc độ truy cập, và tính bảo mật của thông tin
- Sang đến HTTP/3, chúng ta đã thay thế TCP thành UDP + QUIC, thay thế HPACK thành QPACK, giúp cho tốc độ truyền tải nhanh hơn cũ rất nhiều lần.
Tổng kết
Qua các phần trình bày bên trên, chúng ta đã nắm được cơ bản về HTTP, và một vài khái niệm, kiến thức đằng sau nó. Hy vọng các kiến thức trên sẽ giúp ích cho các bạn ít nhiều.
Nhưng mọi khi, tuy đã rà soát lại, nhưng cũng sẽ không tránh khỏi việc có sai sót. Mong các bạn để lại góp ý, và cùng giúp nhau tiến bộ nhé.