środa, 14 lipca 2010

Najważniejsze cechy protokołu HTTP

Przed przystąpieniem do omawiania technik optymalizacji stron internetowych trzeba wyjaśnić na jakiej zasadzie wymieniane są dane pomiędzy użytkownikiem a serwerem. Jest to konieczne do zrozumienie gdzie mogą powstawać wąskie gardła spowalniające działanie strony i w jaki sposób można je wyeliminować. Kluczowym elementem jest tu protokół HTTP za pomocą którego dochodzi do połączenia przeglądarki z serwerem na którym znajdują się żądane przez użytkownika zasoby. Obecnie obowiązującą wersją protokołu jest HTTP 1.1, jednak używana jest również jego poprzednia wersja 1.0. Z dokładną specyfikacją techniczną można zapoznać się na stronie W3C.

Podstawową metodą protokołu HTTP jest metoda GET, ma ona również zasadnicze znaczenie dla kwestii wydajności i dlatego to właśnie ona będzie głównym przedmiotem analizy. Metoda GET służy do wysłania przez przeglądarkę żądania dokumentu o określonym adresie URI oraz odebrania tego dokumentu.

Podczas drogi od przeglądarki do serwera oprócz adresu zasobu żądanie to zawiera również nazwę hosta, informację o wersji protokołu HTTP, nazwę i wersję przeglądarki z której pochodzi żądanie, a także inne informacje. Z punktu widzenia optymalizacji najistotniejsza jest właściwość określająca czy przeglądarka użytkownika akceptuje odbieranie treści w postaci skompresowanej, a jeżeli tak to jakiego typu kompresja może zostać wykorzystana. Jeżeli użytkownik nie akceptuje kompresji to nic nie da się poradzić i należy dostarczyć mu wersję nieskompresowaną. Jednak w przypadku, gdy kompresja jest akceptowana, to bardzo dobrym rozwiązaniem zastosowanie jej. (Więcej na ten temat w następnych postach)

Z punktu widzenia optymalizacji znacznie ważniejsza jest odpowiedź jakiej udziela serwer i parametry protokołu HTTP jakie się w niej znajdują. Za ich pomocą można bowiem określić jak zachowywać się będzie przeglądarka podczas kolejnych żądań tego samego zasobu. Dzięki temu możliwe jest przyspieszenie realizacji przyszłych żądań i odciążenie serwera.

Zanim jednak przejdziemy do omówienia konfiguracji nagłówków protokołu HTML konieczne jest przyjrzenie się w jaki sposób przeglądarka ustala czy powinna pobrać dany zasób z sieci, czy nie. Przeglądarki i systemy operacyjne posiadają tak zwany bufor, w którym przechowują informacje, z których użytkownik już kiedyś korzystał. Co za tym idzie konieczność pobrania danego zasobu z sieci zachodzi tylko wtedy, gdy nie ma go w buforze, lub gdy wersja w buforze jest nieaktualna.

Podstawowym mechanizmem regulującym tę kwestię jest warunkowe żądanie GET, polegające na wysłaniu żądania zawierającego parametr ‘If-Modified-Since’. Jeżeli żądany zasób był modyfikowany po dacie wskazywanej przez ten parametr, to zostanie on ponownie pobrany, tak aby użytkownik korzystał z aktualnej wersji. Jeżeli jednak nie był on modyfikowany to serwer zwróci odpowiedź zawierającą jedynie kod stanu ‘304 Not Modified’, a przeglądarka skorzysta z wersji przechowywanej w buforze. Dzięki temu skrócony zostaje czas oczekiwania, gdyż nie trzeba przesyłać zasobów przez sieć, lecz wystarczy pobrać je z dysku twardego. Ponadto odciążony zostaje serwer, który dzięki temu jest w stanie efektywniej przetwarzać te żądania, które muszą być przez niego obsłużone.

Rozwiązanie to, mimo że znacznie przyspiesza ponowne ładowanie strony, nie jest jeszcze maksimum wydajności jakie da się osiągnąć. Co prawda zasoby nie są przesyłane przez sieć, ale nadal konieczne jest wysłanie żądania i pobranie odpowiedzi potwierdzającej możliwość pobrania zasobu z bufora. Do rozwiązania tej kwestii służą parametry Expiers i Keep-Alive. Definiują one jak długo dany zasób pozostaje aktualny, tak żeby przeglądarka była w stanie podjąć decyzję o jego pobieraniu bądź nie bez konieczności komunikowania się z serwerem. Okres ważności danego zasobu jest wtedy przechowywany razem z nim w buforze i może być bezpośrednio odczytywany przez przeglądarkę. Dzięki temu nie ma konieczności przesyłania po sieci jakichkolwiek informacji.

Korzystanie z parametrów zawartych w nagłówkach protokołu HTTP i minimalizacja ilości żądań i przesyłanej treści jest zagadnieniem znacznie obszerniejszym. Więcej na ten temat w kolejnych postach.

Brak komentarzy: