Multiplexing trong HTTP/2 là gì?

HTTP/2 là gì?

HTTP/2 là cuộc cách mạng Hypertext Transfer Protocol (HTTP) mới nhất tính đến thời điểm này. HTTP là giao thức mạng được sử dụng để yêu cầu và nhận page cùng dữ liệu trên môi trường World Wide Web. Công nghệ mới này sẽ dần thay thế chuẩn HTTP/1.1 đã được sử dụng rộng rãi trong hơn hai thập kỷ gần đây

Multiplexing

Multipllexing là một phương thức trong HTTP/2 theo đó nhiều request có thể được gửi và nhiều response có thể được nhận một cách bất đồng bộ thông qua duy nhất một kết nối TCP. Multiplexing là trái tim của giao thức HTTP/2.

Frames và Steams

HTTP/2 là một giao thức nhị phân. Mọi request và response của HTTP/2 được đặt cho 1 unique ID được gọi là stream id và một HTTP request và response được chia thành các frame, frame là các phần của dữ liệu. Stream id được sử dụng để định danh xem nó thuộc về các request hay response nào. Một stream id là một tập hợp các frame với cùng stream id.

Để tạo một HTTP Request, đầu tiên client chia các request thành những các binary frame và gán cho chúng stream ID của request. Sau đó nó sẽ khởi tạo kết nối với server và tiếp theo client bắt đầu gửi các frame đến server. Một khi server sẵn sàng trả về response, nó sẽ chia response thành các frame và đưa ra các frame của response có chung stream ID. Cuối cùng server sẽ trả về response qua frame.

Stream ID là cần thiết bởi vì nhiều request có chung nguồn được thực hiện bằng cách sử dụng một kết nối TCP duy nhất vì vậy stream ID khiến nó có thể định danh xem là các frame thuộc về request hay response nào.

Multiple HTTP Request

Một kết nối TCP có thể được sử dụng để tạo ra các HTTP Request chỉ với duy nhất một nguồn. Với nhiều nguồn, nhiều kết nối TCP là điều bắt buộc.

Một khi một kết nối TCP được khởi tạo, tất cả các request cho nguồn đó được thực hiện thông qua kết nối TCP đó. Nhiều HTTP/2 request được chia thành các frame và được đặt cho các stream id tương ứng. Tất cả các frame được gửi dạng bất đồng bộ và server cũng gửi lại response theo cách bất đồng bộ. Vì vậy, nếu một response mất quá nhiều thời gian thì các response còn sẽ không phải chờ cho đến khi response đó được hoàn thành. Client sẽ nhận các frame và sắp xếp chúng theo stream id tương ứng.

Request và response cùng diễn ra song song. Tức là trong khi client đang gửi các frame thì cũng gửi lại các frame ngược về cho client.

Sơ đồ trên đây sẽ cho thấy làm thế nào mà các request và các response diễn ra song song nhau. Nó cũng cho chúng ta thấy cách mà nhiều request/response được chia thành các frame riêng và được gửi từng cái một cách bất đồng bộ.

Khi các request của các nguồn cụ thể được gửi xong thì kết nối TCP sẽ được mở trong một thời gian trước khi bị đóng.

Sự ưu tiên

Một luồng (stream) hay một request có thể có giá trị ưu tiên. Sử dụng giá trị này, server sẽ quyết định xem cần sử dụng bao nhiêu bộ nhớ, CPU và băng thông để tiếp nhận request. Mặc định, server gửi các frame của các request một cách bất đồng bộ mà không sắp xếp thứ tự tức là sẽ xử lý chúng song song nhau. Nhưng độ ưu tiên có thể khiến máy chủ gửi response frame trước các phản hồi khác.

Các setting cho Frame

Kiểm soát luồng là phương thức giúp kiểm soát tốc độ truyền tải dữ liệu giữa client và server. Client và server sẽ quyết định xem tốc độ truyền tải khi mà một kết nối bắt đầu được khởi tạo (trước khi data thực sự đựoc truyền).

Kiểm soát luồng TCP và kiểm soát luồng HTTP/2 là hai thứ hoàn toàn khác nhau. Luồng TCP chỉ quyết định cho toàn bộ cả kết nối trong khi việc kiểm soát luồng HTTP/2 quyết định cho từng luồng riêng lẻ và cho cả kết nối.

Khi kết nối TCP HTTP / 2 được thiết lập, client và server sẽ trao đổi các setting cho frame trước, nó sẽ cho biết có bao nhiêu stream có thể được mở tại một thời điểm (hoặc có bao nhiêu request song song), có bao nhiêu byte mà server sẵn sàng nhận cho một luồng và cho toàn bộ kết nối và tốc độ dữ liệu có thể được gửi hoặc nhận.

Nguồn tiếng anh: http://qnimate.com/what-is-multiplexing-in-http2/