HTTP/2

**HTTP/2** (ban đầu có tên **HTTP/2.0**) là phiên bản cải tiến lớn của giao thức mạng HTTP được sử dụng bởi World Wide Web. HTTP/2 được phát triển dựa trên giao thức thử nghiệm SPDY do Google phát triển, và được chuẩn hóa bởi Nhóm công tác HTTP (httpbis) thuộc Lực lượng Đặc nhiệm Kỹ thuật Internet (IETF).

HTTP/2 được phê duyệt làm Tiêu chuẩn đề xuất vào ngày 17 tháng 2 năm 2015, và được xuất bản chính thức dưới dạng RFC 7540 vào ngày 14 tháng 5 năm 2015. Đây là phiên bản mới đầu tiên của HTTP kể từ HTTP/1.1 được chuẩn hóa trong RFC 2068 năm 1997.

## Lịch sử
### Từ SPDY đến HTTP/2
HTTP/2 bắt nguồn từ giao thức SPDY (phát âm là "speedy", nghĩa là "nhanh"), được phát triển bởi một dự án nghiên cứu do Google dẫn đầu. SPDY được thiết kế nhằm giảm thời gian tải trang web bằng các kỹ thuật như nén, ghép kênh (multiplexing) và ưu tiên hóa.

Điểm khác biệt lớn nhất giữa HTTP/1.1 và SPDY là mỗi hành động của người dùng trong SPDY được gán một "stream ID" (mã định danh luồng), cho phép sử dụng một kênh TCP duy nhất kết nối người dùng với máy chủ. SPDY cho thấy cải thiện rõ rệt so với HTTP, với tốc độ tải trang tăng từ 11% đến 47%.

### Quá trình tiêu chuẩn hóa
Nhóm công tác HTTP (httpbis) của IETF đã sử dụng SPDY làm điểm khởi đầu cho việc phát triển HTTP/2. Trong quá trình phát triển, một trong những thay đổi quan trọng là HTTP/2 sử dụng thuật toán nén header dựa trên mã Huffman cố định thay vì nén dựa trên luồng động của SPDY, nhằm giảm nguy cơ tấn công như CRIME attack.

Vào tháng 12 năm 2014, Nhóm công tác đã trình HTTP/2 lên IESG để xem xét, và được phê duyệt làm Tiêu chuẩn đề xuất vào ngày 17 tháng 2 năm 2015. Đặc tả chi tiết được xuất bản dưới dạng RFC 7540 vào ngày 14 tháng 5 năm 2015.

Vào ngày 9 tháng 2 năm 2015, Google thông báo kế hoạch loại bỏ hỗ trợ cho SPDY trong Chrome để ưu tiên cho HTTP/2.

## Đặc điểm kỹ thuật
### Mục tiêu thiết kế
HTTP/2 được thiết kế với các mục tiêu chính sau:

* Tạo cơ chế thương lượng cho phép máy khách và máy chủ lựa chọn HTTP/1.1, HTTP/2 hoặc các giao thức khác
* Duy trì khả năng tương thích cao với HTTP/1.1 (ví dụ: phương thức, mã trạng thái, URI và hầu hết các trường header)
* Giảm độ trễ để cải thiện tốc độ tải trang trong trình duyệt web
* Hỗ trợ các trường hợp sử dụng phổ biến của HTTP như trình duyệt web, API web, máy chủ web, proxy và mạng phân phối nội dung

HTTP/2 giữ nguyên tất cả ngữ nghĩa cấp cao của HTTP/1.1, như phương thức, mã trạng thái, trường header và URI. Điều này có nghĩa là các ứng dụng web hiện tại không cần thay đổi để hoạt động với HTTP/2, nhưng các ứng dụng mới có thể tận dụng các tính năng mới để tăng tốc độ.

### Các tính năng chính
#### Giao thức nhị phân
Khác với HTTP/1.1 sử dụng giao thức văn bản, HTTP/2 sử dụng **giao thức nhị phân**. Điều này mang lại nhiều lợi ích:

* Tiêu tốn ít băng thông hơn
* Phân tích cú pháp hiệu quả hơn
* Ít lỗi hơn
* Giảm tải mạng
* Loại bỏ các vấn đề bảo mật liên quan đến bản chất văn bản của HTTP/1.1 như tấn công phân tách phản hồi

#### Ghép kênh (Multiplexing)
**Ghép kênh** là tính năng tiên tiến nhất của HTTP/2, cho phép gửi nhiều yêu cầu dữ liệu song song qua một kết nối TCP duy nhất. Điều này:

* Cho phép tải xuống các tệp web không đồng bộ từ một máy chủ
* Giải quyết vấn đề head-of-line blocking ở cấp giao dịch HTTP trong HTTP/1.1
* Giảm thời gian vòng lặp (RTT - Round Trip Time)
* Làm cho trang web tải nhanh hơn mà không cần tối ưu hóa bổ sung
* Loại bỏ nhu cầu phân mảnh tên miền (domain sharding)

#### Nén header (Header Compression)
HTTP/2 nén một số lượng lớn các khung header dư thừa bằng đặc tả HPACK. Cách thức hoạt động:

* Cả máy khách và máy chủ duy trì danh sách các header đã sử dụng trong các yêu cầu trước đó
* HPACK nén giá trị riêng lẻ của mỗi header trước khi chuyển đến máy chủ
* Máy chủ tra cứu thông tin được mã hóa trong danh sách đã lưu trữ

Điều này giảm đáng kể chi phí do cơ chế khởi động chậm (slow-start) của TCP gây ra.

#### Ưu tiên hóa luồng (Stream Prioritization)
HTTP/2 cung cấp cho nhà phát triển khả năng kiểm soát chi tiết về **ưu tiên hóa**, cho phép họ quyết định tài nguyên nào của trang sẽ được tải trước. Tính năng này được gọi là "weighted prioritization" (ưu tiên hóa có trọng số):

* Nhà phát triển có thể gán giá trị trọng số khác nhau cho các luồng dữ liệu
* Giá trị này cho máy khách biết luồng dữ liệu nào cần hiển thị trước
* Tối đa hóa tốc độ tải trang cả về mặt cảm nhận lẫn thực tế

#### Server Push
**Server Push** cho phép máy chủ gửi thêm thông tin có thể lưu vào bộ nhớ cache mà máy khách chưa yêu cầu nhưng được dự đoán sẽ cần trong tương lai. Ví dụ:

* Khi máy khách yêu cầu tệp HTML, máy chủ có thể gửi kèm các tệp CSS và JavaScript liên quan
* Điều này loại bỏ chi phí của chu kỳ yêu cầu bổ sung
* Giảm độ trễ mạng và cải thiện thông lượng

#### Kiểm soát luồng (Flow Control)
HTTP/2 cung cấp kiểm soát luồng ở cả cấp độ luồng riêng lẻ và toàn bộ kết nối. Điều này cho phép:

* Máy khách có thể tải scan đầu tiên của hình ảnh, hiển thị cho người dùng để xem trước
* Trong khi đó ưu tiên tải các tài nguyên quan trọng hơn
* Sau khi tải xong tài nguyên quan trọng, tiếp tục tải phần còn lại của hình ảnh

## So sánh với HTTP/1.1

### Cải thiện hiệu suất
Các nghiên cứu cho thấy HTTP/2 mang lại cải thiện đáng kể về hiệu suất:

* LinkedIn giảm thời gian tải trang **34%** khi chuyển sang HTTP/2
* SPDY (tiền thân của HTTP/2) cho thấy cải thiện tốc độ từ **11% đến 47%**
* Giảm đáng kể thời gian vòng lặp (RTT)

## Hỗ trợ và triển khai
### Hỗ trợ trình duyệt
Hầu hết các trình duyệt web chính đã thêm hỗ trợ HTTP/2 vào cuối năm 2015, bao gồm:

* Google Chrome
* Mozilla Firefox
* Safari
* Microsoft Edge
* Opera
* Internet Explorer 11
* Amazon Silk

Tính đến năm 2020, khoảng **98% trình duyệt web** đang được sử dụng có khả năng hỗ trợ HTTP/2.

**Lưu ý quan trọng**: Mặc dù đặc tả HTTP/2 không bắt buộc sử dụng mã hóa, nhưng tất cả các trình duyệt chính đều chỉ hỗ trợ HTTP/2 qua TLS (HTTPS), khiến mã hóa trở thành bắt buộc trên thực tế.

### Mức độ triển khai
Theo W3Techs, tính đến tháng 1 năm 2021, **50,2%** trong số 10 triệu trang web hàng đầu đã hỗ trợ HTTP/2. Theo Web Almanac năm 2022, **77% yêu cầu** sử dụng HTTP/2 và **66% trang web** sử dụng giao thức này.

### Cấu hình và URI
HTTP/2 được định nghĩa cho cả hai loại URI:

* **h2c**: HTTP URI không có mã hóa TLS
* **h2**: HTTPS URI qua TLS (yêu cầu TLS 1.2 trở lên) sử dụng phần mở rộng ALPN

## HTTP/3 - Thế hệ kế tiếp

Sản phẩm kế nhiệm được đề xuất của HTTP/2 là HTTP/3, một bản cải tiến lớn dựa trên các khái niệm do HTTP/2 thiết lập. Điểm khác biệt chính là HTTP/3 chạy trên giao thức QUIC thay vì TCP, được thiết kế để nhanh hơn và an toàn hơn cho nhu cầu của Internet hiện đại.

Hỗ trợ cho HTTP/3 đã được thêm vào:

* **Chrome** (tháng 9 năm 2019)
* **Safari 14** trên macOS Big Sur (2020) - trình duyệt đầu tiên hỗ trợ HTTP/3 theo mặc định
* **Firefox Nightly** (tháng 11 năm 2019)

## Lợi ích
HTTP/2 mang lại nhiều lợi ích cho cả nhà phát triển và người dùng:

* **Tốc độ tải trang nhanh hơn**: Giảm thời gian tải trang đáng kể, cải thiện trải nghiệm người dùng
* **Tối ưu hóa băng thông**: Sử dụng băng thông hiệu quả hơn nhờ nén header và ghép kênh
* **Cải thiện SEO**: Google ưu tiên các trang web sử dụng HTTP/2
* **Bảo mật tốt hơn**: Hỗ trợ TLS hiệu quả hơn, bảo vệ khỏi tin tặc và bot độc hại
* **Giảm chi phí vận hành**: Sử dụng tài nguyên mạng và máy chủ hiệu quả hơn

## Hạn chế
Mặc dù có nhiều cải tiến, HTTP/2 vẫn có một số hạn chế:

* **Head-of-line blocking ở tầng TCP**: Vì HTTP/2 chạy trên một kết nối TCP duy nhất, vẫn có khả năng xảy ra head-of-line blocking nếu các gói TCP bị mất hoặc bị trễ trong quá trình truyền
* **Độ phức tạp triển khai**: Yêu cầu nâng cấp máy chủ và cấu hình HTTPS
* **Vấn đề tương thích**: Cần đảm bảo tất cả máy chủ được nâng cấp từ HTTP/1.1

## Phê bình
Nhà phát triển FreeBSD và Varnish, Poul-Henning Kamp, đã chỉ trích rằng tiêu chuẩn được chuẩn bị theo lịch trình không thực tế ngắn, dẫn đến việc chỉ có thể dựa trên giao thức SPDY và bỏ lỡ các cơ hội cải tiến khác. Ông cũng chỉ trích giao thức vì không nhất quán, có độ phức tạp không cần thiết và vi phạm nguyên tắc phân lớp giao thức.

## Xem thêm
* HTTP/1.1
* HTTP/3
* SPDY
* QUIC
* Transport Layer Security (TLS)
* World Wide Web

## Tham khảo

## Liên kết ngoài
* Trang chủ chính thức HTTP/2
* RFC 7540 - HTTP/2
* RFC 7541 - HPACK Header Compression
* Akamai HTTP/2 Demo