Tóm tắt sự khác biệt giữa các version của HTTP 1.0, 1.1 và 2.0

Table of contents

Khái niệm HTTP, các phiên bản của HTTP. Sự khác biệt giữa HTTP 1.0 vs. HTTP 1.1, và sự khác biệt giữa HTTP 2.0 vs. HTTP 1.1.

1. HTTP là gì?

HTTP hay Hypertext Transfer Protocol, là một protocol hay giao thức truyền tải dữ liệu giữa máy chủngười dùng, theo kiến trúc server - client, thông thường được biết đến qua trình duyệt web.

Đây là một giao thức nằm ở tầng ứng dụng (application layer) trong các mô hình OSI (mô hình 7 tầng) hay mô hình TCP/IP (mô hình 4 tầng).

Format thông thường cho 1 HTTP request

1st Line : OST /cgi-bin/process.cgi HTTP/1.1
Header   : User-Agent: Mozilla/4.0 (compatible; MSIE5.01; Windows NT)
           Host: www.tutorialspoint.com
           Content-Type: application/x-www-form-urlencoded
           Content-Length: length
           Accept-Language: en-us
           Accept-Encoding: gzip, deflate
           Connection: Keep-Alive
Body     : licenseID=string&content=string&/paramsXML=string

Cụ thể

  • 1st Line: Method _ Path _ HTTP Version
  • Header: list (name _ value)
  • Body: data

2. HTTP Versions

Các phiên bản của HTTP gồm: 0.9, 1.0, 1.12.0

2.1. HTTP 1.1 vs. HTTP 1.0

HTTP 1.1 cải thiện phiên bản tiền nhiệm:

  • Chuẩn hóa các mở rộng của phiên bản 1.0
  • Hỗ trợ persistentpipeline connection
  • Hỗ trợ chunked transfers, compressiondecompression
  • Hỗ trợ virtual hosting (nhiều domain được phân giải đến 1 IP)
  • Hỗ trợ byte-range transfers, cho phép resume các connection bị gián đoạn
  • Hỗ trợ nhiều cơ chế caching
  • Hỗ trợ đa ngôn ngữ
  • Mở rộng status code
  • Cải thiện tính an toàn, bảo mật và toàn vẹn

Lợi ích mà 1.1 đem lại

  • Sử dụng IP một cách linh động, hiệu quả và tiết kiệm khi có thể phân giải nhiều domain đến cùng 1 địa chỉ IP
  • Nhờ có persistent connection, có thể thực hiện nhiều request trong cùng một connection, tránh thực hiện lại 3-way handshaking, giúp response nhanh hơn
  • Chunked-encoding cải thiện response đến người dùng tốt hơn, tăng trải nghiệm người dùng.
  • Tiết kiệm băng thông, response nhanh hơn khi hỗ trợ nhiều cơ chế caching.

Các cải thiện cần lưu tâm

  • Thêm mới một method OPTIONS
  • Mở rộng cơ chế caching với nhiều conditional headers, header cache-control chỉ thị loại caching ở cả request và response, giới thiệu header ETag (entity tag) giúp xác định version của resource.
  • Status 100 continue giúp client biết được liệu server có thể process được request lớn hay không, tránh lãng phí băng thông không cần thiết.
  • Cải thiện privacy của người dùng đối với header Referer, tránh lộ các URL riêng tư của người dùng khi gửi request hoặc truy cập vào trang khác.

2.2. HTTP 2.0 vs. HTTP 1.1

HTTP 2.0 là một giao thức mới được phát triển bởi Google và được công bố vào năm 2015.

Dưới góc nhìn kỹ thuật, một yếu tố quan trọng nhất để phân biệt 2 phiên bản này chính là việc dữ liệu được mã hóa dạng binary trong phiên bản 2.0. Ở phiên bản tiền nhiệm, mọi requests và responses được vận chuyển dưới dạng plain text. Phiên bản 2.0 sử dụng binary framing layer đóng gói dữ liệu dưới dạng nhị phân, đồng thời giữ lại các khái niệm và kiến trúc mà 1.1 đã thực hiện.

Mục tiêu của việc chuyển đổi dưới dạng nhị phân trong phiên bản 2.0 nhằm phục vụ cho phương thức mới trong việc vận chuyển dữ liệu (data delivery), cải thiện những thiếu sót mà 1.1 còn vướng phải.

a. Head-of-Line Blocking ở HTTP 1.1

Nhắc lại về HTTP 1.0, mỗi request ở phiên bản 1.0 yêu cầu tạo một TCP connection, điều này khiến lãng phí thời gian và resource. Do đó phiên bản 1.1 đã giải quyết vấn đề này bằng khái niệm persistent connection, tức cho phép nhiều requests/responses trong một connection. Tuy nhiên cách giải quyết này vẫn còn một khuyết điểm chính là bottleneck trong một connection. Mỗi request cần phải được thực hiện tuần tự trong một connection, dẫn đến việc blocking cho các requests sau, gọi là Head-of-Line Blocking. Có thể giải quyết vấn đề này bằng cách tạo nhiều TCP connection giữa client và server, tuy nhiên gặp phải vấn đề giới hạn cho lượng concurrent requests.

HTTP 2.0 sử dụng binary framing layer nhằm giải quyết vấn đề này. Data sẽ được encode thành dạng nhị phân và được tách nhỏ ra thành nhiều packets (frame). Khi một TCP connection được thiết lập, các frames này sẽ được đóng gói thành nhiều streamgửi đi đồng thờikhông bị blocking như ở phiên bản trước. Tiến trình này còn được gọi là multiplexing.

Ngoài ra, với phương thức vận chuyển mới này, HTTP 2.0 đặc biệt thích hợp với HTTPS, khi mỗi TCP connection đều yêu cầu SSL handshaking.

Demo trực quan cho cải thiện này có thể thử tại đây https://http2.golang.org/gophertiles

b. Header compression

HTTP 1.1, mỗi request/response đều được compress nhằm tiết kiệm băng thông và tối đa khả năng truyền tải dữ liệu. Tuy nhiên 2 đặc điểm cần nhìn nhận ra ở các requests trong một connection như sau:

  • Hầu hết header đều có kích thước nhỏ so với body
  • Các headers ở các requests trong connection thường có format giống nhau, chỉ khác nhau ở một số trường thông tin nhất định (như path)

Do HTTP 2.0 sử dụng binary framing layer, do đó nó hoàn toàn có thể quản lý được dữ liệu mà nó gửi/nhận trong mỗi connection. Dựa trên 2 đặc điểm trên, HTTP 2.0 tách header ra khỏi data thực hiện gửi/nhận, và sử dụng cơ chế compress riêng cho phần header nhằm giảm tối đa kích thước mà header cần. Do các header ở mỗi request có cấu trúc tương đồng, giải thuật compress mà HTTP 2.0 sử dụng là Huffman coding (HPACK), từ đó cải thiện được kích thước của headers.

Liên kết các khái niệm và cơ chế hoạt động đã định nghĩa, có thể hình dung kiến trúc sau cùng mà HTTP 2.0 thực hiện như sau:

c. Server Push

TÍnh năng này cho phép server gửi trước thông tin resource mà client cần request trước khi response được gửi về hoàn tất. Ví dụ khi tải 1 trang html, một số file script sẽ được trình duyệt tải sau khi có đủ nội dung html được tải về. Ở HTTP 2 thì thông tin file script này có thể được đẩy về cho trình duyệt trước khi file html được load xong. Lúc này trình duyệt có thể hoặc tải sẵn file script, hoặc decline nếu đã có trong cache. Việc này giúp tăng tốc độ load trang cho người dùng.

3. Conclusion

Bài viết này mình đã nói sơ qua về các phiên bản http, cũng như một số khác biệt và phân biệt về các versions này. Bài viết còn khá đơn sơ, mong mọi người thông cảm.

4. References