Poniżej przedstawiono różnice między HTTP 1.1 a HTTP 2.0:
W tradycyjnym zachowaniu HTTP przy wysyłaniu wielu żądań przez to samo połączenie klient musi czekać na odpowiedź każdego żądania przed wysłaniem następnego. To sekwencyjne podejście znacząco zwiększa czas ładowania zasobów strony. Aby rozwiązać ten problem, HTTP/1.1 wprowadził funkcję zwaną potokowaniem (pipelining), pozwalającą klientowi wysyłać wiele żądań bez oczekiwania na odpowiedzi serwera. Serwer natomiast odpowiada klientowi w tej samej kolejności, w jakiej otrzymał żądania.
Chociaż pipelining wydawał się rozwiązaniem, napotykał na trudności:
W celu optymalizacji ładowania stron z serwerów obsługujących HTTP/1.1 przeglądarki internetowe zastosowały obejście. Otwierają od sześciu do ośmiu równoległych połączeń z serwerem, umożliwiając jednoczesne wysyłanie wielu żądań. Ten równoległy mechanizm ma na celu złagodzenie problemów związanych z potokowaniem i poprawę ogólnego czasu ładowania strony.
Wybór sześciu do ośmiu równoległych połączeń przez przeglądarki internetowe wynika z optymalizacji. Konkretne powody wyboru tej liczby mogą wynikać z kompromisu między wykorzystaniem zasobów, efektywnością sieci i unikaniem potencjalnych wąskich gardeł.
W odpowiedzi na ograniczenia napotkane w pipelingu, HTTP/2 wprowadził funkcję zwaną multipleksowaniem. Multipleksowanie umożliwia efektywniejszą komunikację między klientem a serwerem poprzez umożliwienie jednoczesnego przesyłania wielu żądań i odpowiedzi przez pojedyncze połączenie.
HTTP/2 wykorzystuje binarny mechanizm ramkowania, co oznacza, że wiadomości HTTP są dzielone na mniejsze, niezależne jednostki zwane ramkami. Ramki mogą być przeplatane i przesyłane przez połączenie niezależnie od siebie. Po stronie odbiorczej ramki są ponownie składane w celu odtworzenia oryginalnej wiadomości HTTP.
Ten binarny mechanizm ramkowania jest fundamentem multipleksowania w HTTP/2. Umożliwia przeglądarce wysyłanie wielu żądań przez to samo połączenie bez problemów z blokowaniem. W rezultacie przeglądarki takie jak Chrome używają tego samego identyfikatora połączenia dla żądań HTTP/2, co pozwala na efektywną i nieprzerywaną komunikację między klientem a serwerem.
Dzięki funkcji multipleksowania HTTP/2, realizowanej przez mechanizm ramkowania binarnego, efektywność i szybkość wymiany danych między klientami a serwerami jest zwiększona poprzez umożliwienie jednoczesnego przesyłania wielu żądań i odpowiedzi przez pojedyncze połączenie.
Aby poprawić wydajność protokołu HTTP/2, żądania są domyślnie rozdzielane w puli wątków (domyślnie 32) za każdym razem, gdy serwer odbiera nowe żądanie HTTP/2. Pozwala to uniknąć oczekiwania, gdy pojedyncze połączenie wysyła wiele współbieżnych żądań wymagających sekwencyjnego przetwarzania w kontekście wątku połączenia bez tej puli.
Zachowanie puli wątków można skonfigurować przy użyciu następujących właściwości.
Aby precyzyjnie dostroić żądania, wybierając, które żądania muszą być przetwarzane w puli wątków (ponieważ są czasochłonne), a które mogą być przetwarzane w wątku połączenia, można użyć zdarzenia OnHttp2BeforeAsyncRequest. Zdarzenie to jest wywoływane przed umieszczeniem żądania w kolejce w puli wątków. Należy użyć parametru Async, aby określić, czy żądanie jest wielowątkowe.
procedure OnHTTP2BeforeAsyncRequest(Sender: TObject; Connection: TsgcWSConnection; const ARequestInfo: TIdHTTPRequestInfo; var Async: Boolean);
begin
if ARequestInfo.Document = '/fast-request' then
ASync := False;
end;