Với keep-alive connection , có thể thực hiện nhiều lượt yêu cầu tài nguyên khác nhau với cùng một kết nối .
Tuy nhiên , có thể nhận thấy một khoảng thời gian chờ sau khi thực hiện một request , trong lúc đợi response về hoàn tất , sẽ không có một request nào khác được phép thực hiện . Điều này gây lãng phí tài nguyên , do băng thông vẫn còn đó trong khi request tài nguyên khác sẽ không thể request ở cùng kết nối ( connection ), và nếu tạo ra kết nối mới thì lại trở lại vấn đề với mỗi request một kết nối .
Nếu dữ liệu trả về không có thứ tự mà đi lộn xộn , thì do cùng sử dụng 1 connection chung , đầu nhận response sẽ không thể phân biệt được phần dữ liệu là thuộc request nào .
Điều này khiến HTTP pipelining phải tuân thủ một điều là phía client chỉ sau khi nhận trọn vẹn một response của request này mới được nhận tiếp response từ request khác , việc này gây ra nguy cơ về hiệu năng khi có một response bị mất hay bị xử lý chậm .
3 . HTTP / 1 PIPELINING
Hình : HTTP pipelining
Giải pháp cho phép một loạt request được gọi mà không cần response phải hoàn thành , sau đó sẽ nhận các response . Một giải pháp khá mượt , nhưng nhìn sâu hơn vấn đề một chút , đầu tiên ta quan sát lại HTTP request và response .
Một cú pháp request điển hình như sau : GET / index . html HTTP / 1.1 Host : www . example . com
Cú pháp response dạng : HTTP / 1.1 200 OK Date : Mon , 23 May 2005 22:38:34 GMT Server : Apache / 1.3.3.7 ( Unix ) ( Red-Hat / Linux ) Last-Modified : Wed , 08 Jan 2003 23:11:55 GMT ETag : “ 3f80f-1b6-3e1cb03b ” Content-Type : text / html ; charset = UTF-8Content-
Length : 138 Accept-Ranges : bytes Connection : close < html > < head > < title > An Example Page </ title > </ head > < body > Hello World , this is a very simple HTML document . </ body > </ html >
Hình : Head-of-line blocking trong HTTP pipelining
Vấn đề này được gọi là head-of-line blocking . Nếu vì một lý do nào đó request tới trước được phía server xử lý chậm hơn request sau thì các request sau nó cũng không được trả về ngay mà buộc phải đợi .
Vì vấn đề này mà hầu hết các trình duyệt dù có hỗ trợ sẵn HTTP pipelining cũng đều mặc định ở trạng thái tắt ( disabled ). Ở góc nhìn web server cũng không khá hơn mấy , một số web server sẽ gặp vấn đề khi xử lý kết nối dưới dạng HTTP pipelining .
Những vấn đề với HTTP pipelining khiến việc cải tiến tốc độ ở góc nhìn kết nối và truyền tải bị dừng lại . HTTP / 1 cứ vậy vận hành với phiên bản 1.1 cho tới khi giao thức SPDY xuất hiện , đây là nền tảng cho việc xây dựng HTTP / 2 .
Năm 2009 , Google giới thiệu giao thức SPDY , về cơ bản đây là một giao thức ở tầng TCP sử dụng binary thay vì text như trên HTTP / 1 . Giao thức cũng hỗ trợ sẵn cơ chế về nén dữ liệu , các lớp bảo mật , chế độ ưu tiên ... để tăng tốc độ truyền tải dữ liệu web .
Năm 2015 , trên nền tảng của SPDY , HTTP / 2 được tổ chức RFC công nhận như một chuẩn . Tiến trình phổ cập HTTP / 2 thay thế HTTP / 1 đang diễn ra trên toàn cầu .
DIJSKTRA 19