Hệ thống web và giao thức HTTP

    0

    Đặc điểm chung của các giao thức tầng ứng dụng

    Các giao thức tầng ứng dụng rất đa dạng và luôn đi kèm với ứng dụng sử dụng chúng. Các giao thức tầng ứng dụng thường không phải là các giao thức chung đa năng phục vụ nhiều loại ứng dụng khác nhau. Vì vậy, khi nói về giao thức tầng ứng dụng người ta đều phải nói về hệ thống phần mềm sử dụng giao thức đó. Ví dụ như giao thức FTP chỉ phục vụ hệ thống truyền file chứ không được sử dụng trong các loại phần mềm khác.

    Về cấu trúc gói tin, các giao thức tầng ứng dụng có 2 kiểu: giao thức dựa trên văn bản và giao thức dựa trên chuỗi byte. Giao thức dựa trên văn bản tạo ra gói tin là chuỗi ký tự có định dạng. Ví dụ gói tin HTTP là một chuỗi ký tự lớn. Giao thức dựa trên chuỗi byte tạo ra gói tin là một chuỗi byte, như trong giao thức ICMP.

    Các giao thức ứng dụng thường sử dụng một trong hai mô hình truyền thông tin: mô hình truy vấn phản hồi, hoặc mô hình một chiều. Mô hình truy vấn phản hồi chính là chế độ truyền thông bán song công, với dữ liệu có thể truyền 2 chiều nhưng không đồng thời, có 1 bên chủ động gửi truy vấn và 1 bên xử lý truy vấn rồi trả lời. Mô hình một chiều chính là chế độ truyền đơn công.

    Về phương thức kiểm soát dữ liệu, các giao thức ứng dụng có thể là In-band – tức là lệnh điều khiển gửi kèm với dữ liệu, như trong giao thức HTTP, hoặc theo kiểu out-of-band – tức là lệnh điều khiển và dữ liệu đi theo những kênh truyền thông riêng, giống như trong giao thức FTP.

    Tất cả các giao thức ứng dụng phải sử dụng một trong hai dịch vụ truyền thông của tầng giao vận là TCP hoặc UDP. Tùy vào yêu cầu của ứng dụng mà lựa chọn dịch vụ giao vận phù hợp.

    Hệ thống web

    Hệ thống web là một loại ứng dụng mạng bao gồm hai thành phần chính là chương trình chủ web và trình duyệt web. Trong đó:

    • Chương trình chủ web (web server) là một máy tính được thiết lập để chạy các ứng dụng web và cung cấp các tài nguyên như các trang web, tập tin và các ứng dụng trực tuyến khác. Cơ sở dữ liệu là nơi lưu trữ dữ liệu cho các ứng dụng web và cung cấp các dịch vụ truy vấn và lưu trữ dữ liệu.
    • Trình duyệt web (web browser hay web client) là phần mềm được cài đặt trên máy tính cá nhân hoặc thiết bị di động để truy cập các trang web và ứng dụng trên mạng Internet. Trình duyệt web giúp người dùng truy cập các nội dung trực tuyến, tương tác với các ứng dụng web và sử dụng các dịch vụ trực tuyến khác.

    Ở đây chú ý phân biệt giữa hệ thống web và ứng dụng web. Ứng dụng web thường dùng để chỉ loại phần mềm chạy trên máy chủ web kết hợp với chương trình chủ web để sinh ra dữ liệu ở dạng HTML. Ứng dụng web thường viết bằng các ngôn ngữ như PHP, C#, Java, và sử dụng một trong số các framework hỗ trợ cho ngôn ngữ đó.

    Trong một hệ thống web, giao thức HTTP được sử dụng để trao đổi dữ liệu giữa chương trình chủ web và trình duyệt web.

    HTTP hoạt động dựa trên mô hình client-server, trong đó các trình duyệt web (client) gửi các yêu cầu HTTP đến máy chủ web (server), và server trả về các phản hồi HTTP chứa các tài liệu được yêu cầu.

    Quá trình hoạt động của HTTP bao gồm các bước sau:

    1. Client gửi yêu cầu HTTP đến server: Khi người dùng nhập địa chỉ URL vào trình duyệt, trình duyệt sẽ tạo ra yêu cầu HTTP và gửi nó đến server sử dụng dịch vụ truyền thông của TCP.
    2. Server nhận yêu cầu HTTP: Khi server nhận được yêu cầu HTTP từ client, nó sẽ xử lý yêu cầu này để trả về tài liệu được yêu cầu.
    3. Server xử lý yêu cầu HTTP: Server sẽ kiểm tra yêu cầu HTTP để đảm bảo tính hợp lệ của yêu cầu, xác thực người dùng (nếu cần thiết) và tìm kiếm tài liệu được yêu cầu.
    4. Server trả về phản hồi HTTP: Sau khi server xử lý yêu cầu, nó sẽ trả về phản hồi HTTP chứa tài liệu được yêu cầu. Phản hồi này bao gồm các tiêu đề HTTP, mã trạng thái và nội dung của tài liệu.
    5. Client nhận phản hồi HTTP: Sau khi client nhận được phản hồi HTTP, trình duyệt sẽ hiển thị tài liệu được yêu cầu cho người dùng.

    Cấu trúc gói tin của HTTP

    Như ở trên đã trình bày, giao thức HTTP có hai loại gói tin với cấu trúc khác nhau: gói tin truy vấn (HTTP request) và gói tin phản hồi (HTTP response). Mỗi loại gói tin thực chất chỉ là các chuỗi văn bản có định dạng xác định.

    Gói tin truy vấn của HTTP bao gồm các phần sau:

    • Method (phương thức): xác định hành động mà client muốn thực hiện trên tài nguyên của server, ví dụ như GET (để lấy thông tin), POST (để tạo mới tài nguyên), PUT (để cập nhật tài nguyên), DELETE (để xóa tài nguyên), và nhiều phương thức khác.
    • URL (Uniform Resource Locator): xác định địa chỉ của tài nguyên mà client muốn truy cập trên server.
    • Headers (tiêu đề): chứa các thông tin về yêu cầu của client, ví dụ như kiểu dữ liệu yêu cầu, ngôn ngữ yêu cầu, thông tin xác thực, và các thông tin khác.
    • Body (nội dung): chứa các thông tin cụ thể mà client muốn gửi đến server, ví dụ như dữ liệu form, file tải lên, v.v.

    Gói tin phản hồi của HTTP bao gồm các phần sau:

    • Status code (mã trạng thái): xác định kết quả của yêu cầu của client, ví dụ như thành công (200 OK), tài nguyên không tìm thấy (404 Not Found), lỗi server (500 Internal Server Error), v.v.
    • Headers (tiêu đề): chứa các thông tin về phản hồi của server, ví dụ như kiểu dữ liệu trả về, ngôn ngữ phản hồi, thông tin xác thực, và các thông tin khác.
    • Body (nội dung): chứa các thông tin cụ thể mà server muốn trả về cho client, ví dụ như nội dung HTML, JSON, XML, v.v.

    Như vậy, nếu biết cấu trúc chuỗi văn bản này và biết cách lập trình với giao thức TCP, chúng ta hoàn toàn có thể tự xây dựng một chương trình web server đơn giản, hoặc có thể xây dựng một chương trình để phát truy vấn HTTP tới chương trình chủ.

    Truyền dữ liệu qua HTTP

    Giao thức HTTP được sử dụng để truyền tải nhiều loại dữ liệu khác nhau giữa client và chương trình chủ web. Các loại dữ liệu thông dụng nhất bao gồm HTML, CSS, JavaScript, file ảnh, dữ liệu dạng JSON, dữ liệu dạng XML.

    Truyền các loại dữ liệu web truyền thống

    HTML (HyperText Markup Language) là loại ngôn ngữ dùng để tạo ra nội dung trên web. Bản thân dữ liệu HTML là văn bản, chứa các đánh dấu (markup), do vậy, có thể dễ dàng nhúng vào phần body của gói tin HTTP response để trả cho trình duyệt.

    CSS (Cascading Style Sheets) là ngôn ngữ dùng để mô tả cách trình bày và hiển thị các trang web được viết bằng HTML. File CSS thực chất cũng là một file văn bản, vì vậy nó có thể được nhúng trực tiếp vào phần body của gói tin HTTP response.

    JavaScript là loại ngôn ngữ lập trình được sử dụng phổ biến trên trình duyệt web để tạo ra các ứng dụng web động và tương tác trên trang web. File JavaScript có phần mở rộng js cũng là một file văn bản. Phản hồi của HTTP chứa mã nguồn của JavaScript trực tiếp trong phần body để gửi cho trình duyệt.

    Thông thường, một trang web được tạo ra từ một file HTML (chứa nội dung). Mỗi file HTML thường tham chiếu tới rất nhiều file CSS (chứa mô tả cách trình bày trang) và JavaScript (tạo tương tác động). Mỗi khi file HTML được tải về, trình duyệt sẽ căn cứ vào các tham chiếu chứa trong HTML để lần lượt tải tất cả các file có liên quan về. Chỉ khi nào tải được đầy đủ các file, trang web mới thực sự hoạt động.

    Truyền các loại dữ liệu đặc biệt

    Với các ứng dụng đơn trang, ứng dụng desktop, hoặc ứng dụng mobile, giao thức HTTP không được sử dụng để truyền tải các file. Do HTTP sử dụng văn bản cho cấu trúc gói tin, bất kỳ văn bản nào cũng có thể gửi qua giao thức này. Có hai định dạng văn bản đặc biệt được sử dụng phổ biến: JSON và XML. Chương trình server gửi các chuỗi ký tự JSON hoặc XML bên trong phần body.

    JSON là một loại định dạng dữ liệu được viết theo cú pháp tạo object của ngôn ngữ JavaScript. Thực chất JSON cũng chỉ là một chuỗi ký tự được chương trình server sinh ra theo yêu cầu từ client.

    XML là một loại ngôn ngữ định dạng dữ liệu khác cũng ở dạng văn bản. Chuỗi XML được chương trình server nhúng vào phần body của gói tin response.

    Hai loại văn bản đặc biệt này được sử dụng để định dạng dữ liệu trao đổi giữa ứng dụng Web API và ứng dụng khai thác nó, như ứng dụng mobile, ứng dụng desktop, ứng dụng web đơn trang. Cách xây dựng ứng dụng dạng Web API sẽ được xem xét trong một bài học riêng.

    Truyền dữ liệu nhị phân

    Dữ liệu nhị phân là những loại dữ liệu khác mà không thể hiện trực tiếp thành văn bản. Dữ liệu nhị phân thường dùng để lưu trữ các tập tin ảnh, âm thanh, video, phần mềm, v.v..

    Đối với dữ liệu nhị phân, cần phải có cách thức riêng để chuyển đổi nó thành văn bản trước khi có thể nhúng vào thân của truy vấn / phản hồi HTTP. Để chuyển đổi file nhị phân thành text để truyền qua giao thức HTTP, bạn có thể sử dụng thuật toán mã hóa nhị phân sang Base64.

    Base64 là một thuật toán mã hóa dữ liệu nhị phân thành dạng văn bản có thể đọc được bằng cách sử dụng bảng ký tự định sẵn. Trong quá trình chuyển đổi, các ký tự không hợp lệ hoặc không thể đọc được sẽ được thay thế bằng các ký tự an toàn. 

    Để chuyển đổi file nhị phân sang Base64, bạn có thể sử dụng các thư viện mã hóa Base64 có sẵn trong các ngôn ngữ lập trình. Sau khi chuyển đổi file nhị phân sang chuỗi Base64, bạn có thể truyền dữ liệu qua giao thức HTTP như với bất kỳ dữ liệu văn bản nào.

    Cơ chế truyền dữ liệu trong HTTP

    Do sử dụng dịch vụ truyền TCP, giao thức HTTP có hai cơ chế truyền dữ liệu: persistent (keep-alive) và non-persistent.

    Trong cơ chế non-persistent mỗi yêu cầu HTTP được gửi qua một kết nối mới giữa máy khách và máy chủ và kết nối sẽ bị ngắt sau khi phản hồi HTTP được trả về cho máy khách. Cơ chế này giúp tối ưu hóa sử dụng tài nguyên mạng và giảm thiểu khối lượng thông tin được gửi qua mạng. Tuy nhiên, nó cũng tăng thời gian phản hồi do mỗi yêu cầu phải thiết lập một kết nối mới.

    Trong cơ chế persistent (còn gọi là “keep-alive”) kết nối giữa máy khách (client) và máy chủ (server) được duy trì cho nhiều vòng phát truy vấn và nhận phản hồi. Thay vì mỗi yêu cầu từ máy khách tạo ra một kết nối mới đến máy chủ và ngắt kết nối sau khi phản hồi được trả về, kết nối keep-alive cho phép nhiều yêu cầu được gửi trên cùng một kết nối giữa máy khách và máy chủ. Điều này giảm thiểu chi phí kết nối và giảm độ trễ (latency) trong việc truyền tải dữ liệu giữa máy khách và máy chủ.

    Các trình duyệt web hiện đại thường tự động sử dụng kết nối keep-alive khi gửi yêu cầu HTTP đến máy chủ. Tuy nhiên, một số máy chủ và ứng dụng web cũ hơn có thể không hỗ trợ kết nối keep-alive hoặc có thể tắt tính năng này để giảm tải cho máy chủ.

    Việc hiểu hai cơ chế truyền dữ liệu này có vai trò quan trọng trong việc tối ưu hóa các ứng dụng web. Nếu máy chủ sử dụng cơ chế non-persistent, ứng dụng web thường cố gắng tạo ra ít file nhất có thể, bằng cách gộp nhiều file css/js nhỏ thành một file lớn để gửi đi trong 1 phản hồi. Nếu máy chủ sử dụng cơ chế keep-alive, việc gộp file này không cần thiết nữa.

    Theo dõi
    Thông báo của
    guest

    0 Thảo luận
    Phản hồi nội tuyến
    Xem tất cả bình luận