Skip to main content

[Thủ Thuật Linux] Tìm hiểu về HTTP/2

HTTP/2 là gì

HTTP / 2 là bản nâng cấp đầu tiên cho Giao thức truyền siêu văn bản (Hypertext Transfer Protocol) từ năm 1999. Mục tiêu của nó là cải thiện hiệu suất trang web bằng cách tối ưu hóa cách HTTP được thể hiện “trực tuyến”(on-the-wire). Nó không thay đổi core của HTTP, có nghĩa là các header, status và cookie hoạt động giống hệt như trong HTTP / 1.1.

HTTP / 2 bắt đầu ra đời với tư cách là giao thức SPDY của Google, được họ thiết kế để giải quyết nhiều vấn đề về hiệu suất vốn có trong HTTP / 1.1. Các lợi ích cốt lõi của SPDY đã được đưa vào HTTP / 2, được cải thiện bởi cộng đồng Internet toàn cầu và được chính thức hóa thành Tiêu chuẩn Internet.

Lợi ích HTTP/2 mang lại

HTTP / 2 giới thiệu một số tính năng mới và tất cả chúng đều được thiết kế nhằm cải thiện thời gian tải trang cho khách truy cập trang web của bạn.

Multiplexing

Multiplexing có lẽ là lợi ích đáng kể nhất của HTTP / 2. HTTP / 1.1 yêu cầu mỗi yêu cầu sử dụng kết nối TCP của riêng nó. Ngược lại, Multiplexing cho phép trình duyệt bao gồm nhiều yêu cầu trong một kết nối TCP duy nhất.

Image
Multiplexing HTTP 1.1 và HTTP/2

 

Vấn đề là một trình duyệt chỉ có thể mở một số lượng hạn chế kết nối TCP tại bất kỳ thời điểm nào. Đối với HTTP / 1.1, điều này có nghĩa là một trình duyệt chỉ có thể tải một tài nguyên duy nhất tại một thời điểm - mọi nội dung trong một trang web được gửi trở lại trình duyệt một cách tuần tự.

Multiplexing trong HTTP/2 lại cho phép trình duyệt yêu cầu tất cả các nội dung này song song. Điều này dẫn đến một hiệu suất tăng đáng kể.

Image
HTTP 1.1 khi request

Image
HTTP /2 Khi request

 HTTP / 1.1 tương tự như mua một món hàng tại cửa hàng tạp hóa, mang về nhà, quay lại cửa hàng để mua món hàng tiếp theo bạn cần và lặp lại cho đến khi phòng đựng thức ăn của bạn được dự trữ đầy đủ.

Multiplexing trong HTTP/2 cung cấp cho bạn một giỏ hàng để bạn có thể chọn mọi thứ bạn cần trong một chuyến đi.

Header Compression

Các trang web hiện nay chứa nhiều nội dung bên ngoài: hình ảnh, CSS, JavaScript và phông chữ ... Mỗi khi trình duyệt yêu cầu một trong những nội dung này, nó sẽ bao gồm header HTTP kèm theo yêu cầu. Khi máy chủ gửi nội dung trở lại trình duyệt, nó cũng bao gồm header phản hồi HTTP điều đó sẽ khiến dung lường thông tin truyền qua lại sẽ tăng lên.

HTTP / 2 buộc tất cả các header HTTP được gửi ở định dạng nén, giảm lượng thông tin cần trao đổi giữa trình duyệt và máy chủ trong khi HTTP / 1.1 không cung cấp bất kỳ hình thức nén tiêu đề nào. Do đó tốc độ của HTTP/2 sẽ nhanh hơn HTTP/ 1.1

Server Push

HTTP / 2 Server Push cho phép network của chúng ta gửi nội dung web trở lại trình duyệt của bạn trước khi trình duyệt biết nó cần sủ dụng chúng.

Điều này tăng tốc thời gian tải trang bằng cách loại bỏ các chuyến đi vòng không cần thiết.

Ví dụ: khi trình duyệt yêu cầu một trang HTML, bạn có thể “đẩy” tất cả các biểu định kiểu CSS, tài nguyên hình ảnh và các nội dung khác vào bên trong trang web đó. Sau khi trình duyệt phân tích cú pháp HTML và tìm thấy tất cả các nội dung đó, chúng sẽ được tải vào bộ nhớ cache cục bộ của trình duyệt. Điều này tránh các yêu cầu bổ sung trở lại máy chủ cho lần tiếp theo.

Stream Priority

Stream Priority là cơ chế để trình duyệt chỉ định nội dung nào họ muốn nhận trước.

Ví dụ: một trình duyệt nhận biết HTTP / 2 có thể sử dụng ưu tiên luồng để tải HTML cho một trang trước tiên, tiếp theo là CSS, sau đó là JavaScript và cuối cùng là nội dung hình ảnh. Thứ tự này cho phép trình duyệt hiển thị trang nhanh nhất có thể.

Bạn có thể coi mức độ ưu tiên của luồng như một sự tối ưu hóa trên Multiplexing. Multiplexing cho phép bạn gửi một số yêu cầu trong một kết nối TCP duy nhất và ưu tiên luồng cho phép bạn xác định thứ tự của các phản hồi.

HTTP /2 mang lại gì cho bạn

Bạn có thể phân phát các ứng dụng hiện có của mình qua HTTP / 2 mà không có bất kỳ thay đổi nào đối với code của mình, nhưng để tận dụng tối đa tất cả những gì HTTP / 2 cung cấp.

Tối ưu hóa Web và HTTP / 2

Phần lớn việc tối ưu hóa trang web cho HTTP / 1.1 xoay quanh việc giảm thiểu số lượng kết nối TCP với máy chủ. Điều này dẫn đến các phương pháp như nối nhiều tệp CSS hoặc JavaScript thành một tệp duy nhất, kết hợp nhiều tệp hình ảnh thành một biểu đồ duy nhất và trải rộng nội dung trang web của bạn trên nhiều miền (sharding).

Nhiều kỹ thuật trong số này không còn cần thiết trong HTTP / 2 và một số kỹ thuật trong số đó có thể giúp cải thiện hiệu suất.

 

Nối các tệp không còn là phương pháp hay nhất trong HTTP / 2. Mặc dù việc ghép nối vẫn có thể cải thiện tỷ lệ nén, nhưng nó buộc các lỗi vô hiệu hóa bộ nhớ cache đắt tiền. Ngay cả khi chỉ một dòng CSS được thay đổi, các trình duyệt buộc phải tải lại tất cả nội dung. Trong HTTP / 2, tốt hơn nên gửi các tài nguyên chi tiết và tối ưu hóa cách chúng được lưu vào bộ nhớ đệm.

Nên tránh chia nhỏ tên miền trong HTTP / 2. Mục tiêu của sharding là tối đa hóa số lượng kết nối TCP đang hoạt động.

Tuy nhiên, mỗi kết nối này đều phải chịu chi phí không cần thiết và cạnh tranh với nhau về băng thông. Việc loại bỏ phân vùng miền cũng giúp quá trình xây dựng và triển khai đơn giản hơn, vì tất cả nội dung của bạn hiện có chứa trên một máy chủ duy nhất.

Encryption và HTTP/2

Về mặt kỹ thuật, HTTP / 2 không yêu cầu kết nối được mã hóa (Encryption), nhưng phần lớn các triển khai chỉ hỗ trợ HTTP / 2 khi được sử dụng kết hợp với SSL / TLS.

Hiện không có trình duyệt nào hỗ trợ HTTP / 2 qua kết nối không được mã hóa. Đối với các mục đích thực tế, điều này có nghĩa là trang web của bạn phải có HTTPS để tận dụng HTTP / 2.