I4 7Powt Materiału Książka rozdziały 1,2,9,10,11,12

background image

Przepraszam za brak obrazków ale zgodność licencyjna i
liber mocno :D (większości idzie się po prostu domyśleć a
mnie nie chce się kopiować) pozdrawiam PW [teraz tak
myślę, że rysunki jak komuś zależy są w darmowej wersji
angielskiej]


Definicje i historia

Opóźnienia

​ (ang. latency) Czas, który upływa od momentu wysłania pakietu przez

źródło do momentu odebrania pakietu przez punkt przeznaczenia.
Przepustowość

​ (ang. bandwidth) Maksymalna przepustowość logicznej lub

fizycznej ścieżki komunikacji.

Opóźnienie propagacji

​ Czas wymagany na przesłanie komunikatu od nadawcy do

odbiorcy. Jest to funkcja odległości do prędkości, z jaką rozchodzi się sygnał.
Opóźnienie transmisji

​ Czas wymagany na wypchnięcie wszystkich bitów pakietu

do łącza. Jest to funkcja długości pakietu do szybkości transmisji danych przez
łącze.
Opóźnienie przetwarzania

​ Czas wymagany na przetworzenie nagłówka pakietu,

sprawdzenie błędów na poziomie bitów oraz określenie miejsca przeznaczenia
pakietu.
Opóźnienie kolejkowania

​ Czas, jaki pakiet oczekuje w kolejce na przetworzenie.

Sieć ARPANET (ang. Advanced Research Projects Agency Network) była prekursorką
współczesnego internetu i pierwszą na świecie działającą siecią z komutacją pakietów (ang.
packet-switched network). Projekt oficjalnie ruszył w 1969 r., a w roku 1983 protokoły
TCP/IP zastąpiły wcześniejszy NCP (ang. Network Control Program), stając się głównymi
protokołami komunikacyjnymi. Reszta, jak powiadają, jest historią


IP

​(ang. Internet Protocol), czyli protokół internetowy, jest tym, co zapewnia

rutowanie i adresowanie pomiędzy hostami. Natomiast

TCP​ (ang. Transmission

Control Protocol), czyli protokół kontroli transmisji, tworzy abstrakcję niezawodnej
sieci działającej w zawodnym kanale. TCP/IP jest często określane „zestawem
protokołów internetowych” (ang. Internet Protocol Suite), a termin ten został po raz
pierwszy zaproponowany przez Vintona Cerfa i Roberta Kahna w roku 1974 w
artykule pod tytułem A Protocol for Packet Network Intercommunication.
Pierwotny dokument (RFC 675) był wielokrotnie zmieniany i w roku 1981 wersja 4.
specyfikacji TCP/IP została opublikowana nie jako pojedynczy dokument RFC, lecz
jako dwa oddzielne dokumenty: RFC 791 — Internet Protocol, RFC 793 —
Transmission Control Protocol.

Procedura three-way handshake w protokole TCP

background image

Wszystkie połączenia TCP rozpoczynają się od procedury three-way handshake
(patrz rysunek 2.1). Zanim klient lub serwer będą mogły wymienić jakiekolwiek dane
aplikacji, muszą po obu stronach uzgodnić sekwencję liczb pakietu startowego oraz
szereg innych zmiennych charakterystycznych dla danego połączenia. Ze względów
bezpieczeństwa sekwencje liczb są wybierane po każdej ze stron losowo.
Standard HTTP nie określa TCP jako jedynego protokołu transportowego. Gdybyś
chciał, mógłbyś dostarczyć treść HTTP poprzez gniazda datagramowe (UDP — ang.
User Datagram Protocol) lub poprzez inny wybrany przez Ciebie protokół
transportowy. Jednak w praktyce cały ruch HTTP jest w internecie realizowany za
pomocą protokołu TCP ze względu na wiele wspaniałych właściwości, które
zapewnia od ręki.

·

SYN

​ (synchronizacja) Klient wybiera losową liczbę x z sekwencji i wysyła pakiet

SYN, który może również zawierać dodatkowe flagi i opcje TCP.

·

SYN ACK

​ (potwierdzenie synchronizacji) Serwer zwiększa wartość x o jeden,

wybiera własną losową liczbę y z sekwencji, dołącza swój zestaw flag i opcji, a
następnie rozsyła odpowiedź.

·

ACK

​ (zatwierdzenie połączenia) Klient zwiększa obie wartości x oraz y o jeden i

kończy procedurę nawiązywania połączenia, wysyłając ostatni pakiet ACK.

Powolny START
Rozwiązanie polega na tym, by powoli rozpocząć i zwiększać wartości rozmiaru
okna w miarę potwierdzania pakietów — na tym polega mechanizm powolnego
startu! Początkowo wartość startowa cwnd została ustawiona na 1 segment sieci; w
kwietniu 1999 r. dokument RFC 2581 zaktualizował tę wartość do maksymalnie 4
segmentów sieci. Ostatnio wartość ponownie została zwiększona, tym razem do 10
segmentów, zgodnie z dokumentem RFC 6928 z kwietnia 2013 r.
Maksymalna ilość danych przesyłanych dla nowego połączenia TCP stanowi
minimalne wartości rwnd i cwnd. Tym samym serwer może wysyłać nawet cztery
segmenty sieci do klienta, potem jednak musi zatrzymać przesyłanie danych i
czekać na potwierdzenie odbioru. Następnie dla każdego odebranego pakietu ACK
algorytm powolnego startu wskazuje, że serwer może zwiększyć wielkość okna
cwnd o jeden segment — dla każdego pakietu ACK mogą zostać wysłane dwa
pakiety. Ta faza połączenia TCP jest znana powszechnie jako algorytm wzrostu
wykładniczego (patrz rysunek 2.3), kiedy klient i serwer próbują szybko uzgodnić
przepustowość dostępną na ścieżce połączenia sieciowego pomiędzy nimi

HTTP

HTTP 0.9 — protokół dla jednego połączenia (rok 1991)
· Protokół typu klient-serwer, żądanie-odpowiedź.
· Protokół tekstowy, oparty na protokołach TCP/IP.

background image

· Zaprojektowany do przesyłania dokumentów hipertekstowych (HTML).
· Połączenie między klientem a serwerem było zamykane po każdym żądaniu.
HTTP 1.0 — gwałtowny rozwój i specyfikacja RFC tworzenie

​ (1991 – 1995)

dokumenowanie (1995-1999)
W okresie nieograniczonych eksperymentów powstał pewien zbiór dobrych praktyk i
wspólnych wzorców, a w maju 1996 grupa HTTP Working Group (HTTP-WG) opublikowała
specyfikację

RFC 1945​ dokumentującą „powszechne zastosowanie” wielu samoistnych

implementacji protokołu HTTP 1.0. Pamiętajmy, że była to tylko informacyjna specyfikacja.
Protokół HTTP 1.0, jak wiemy, nie jest formalną specyfikacją ani standardem
obowiązującym w internecie!
Nagłówki zarówno żądania, jak i odpowiedzi są zapisane w kodzie ASCII, ale sam obiekt
odpowiedzi może być dowolnego typu — plikiem HTML, zwykłym plikiem tekstowym,
obrazem lub dowolną inną treścią. Wprowadzenie metadanych http (nagłówków)
Protokół HTTP 1.1 — standard tworzenie (opublikowane 1997)
Standard HTTP 1.1 uregulował mnóstwo nieścisłości znalezionych we wcześniejszych
wersjach protokołu i wprowadził kilka ważnych metod optymalizacji wydajności:
podtrzymywanie połączeń

​, transmisję danych w blokach, żądania przesłania zakresu

bajtów, dodatkowe mechanizmy zapisywania danych w pamięci podręcznej, kodowanie
przesyłanych danych i kolejkowanie żądań.
HTTP 2.0 — zwiększenie wydajności transmisji danych

​RFC 2616

Protokół HTTP 2.0 koncentruje się głównie na zwiększeniu wydajności transmisji danych,
zmniejszeniu opóźnień i uzyskaniu większych przepływności. Dowolna strona WWW lub
aplikacja może być i będzie udostępniana z wykorzystaniem protokołu HTTP 2.0 bez
konieczności modyfikacji. Nie ma potrzeby zmiany kodu aplikacji, aby wykorzystać zalety
protokołu HTTP 2.0.
Dokument hipertekstowy

​ Dokument hipertekstowy stanowił genezę sieci WWW, był

zwykłym tekstem sformatowanym w podstawowym zakresie i zawierającym odnośniki. W
świetle nowoczesnych standardów nie brzmi to nadzwyczajnie, ale wówczas zostały w ten
sposób wyznaczone założenia, wizja i wielka przydatność sieci WWW.
Strona WWW

​ Grupa robocza pracująca nad protokołem HTTP i pierwsi dostawcy

przeglądarek rozszerzyli definicję hipertekstu o obsługę dodatkowych mediów, takich jak
obrazy i dźwięk, jak również dodali wiele innych elementów wzbogacających wygląd strony.
Nadeszła era stron WWW, umożliwiających wyświetlanie bogatych treści i zawierających
różne typy mediów. Wizualnie strony wyglądały pięknie, ale w większości przypadków nie
były interaktywne, niewiele różniły się od zadrukowanej kartki.


Aplikacja WWW

​ Wprowadzenie języka JavaScript i późniejsza rewolucja wywołana

dynamicznym protokołem HTML (DHTML) i technologią AJAX było kolejnym wstrząsem,
który przekształcił prostą stronę WWW w interaktywną aplikację, reagującą na czynności
użytkownika bezpośrednio w przeglądarce. Została przetarta droga do powstania
pierwszych w pełni funkcjonalnych aplikacji WWW, takich jak Outlook Web Access
(prekursor protokołu XMLHTTP w przeglądarce IE5), otwierających nową erę
skomplikowanych zależności między skryptami, stylami i znacznikami.
Podwórkowa definicja

PLT (ang. page load time)​ czas, po którym kółeczko w przeglądarce

przestaje się kręcić.

background image

Techniczna definicja

: PLT (ang. page load time)​: czas wystąpienia zdarzenia onload

wywoływanego przez przeglądarkę po zakończeniu ładowania dokumentu i wszystkich
zawartych w nim zasobów (skryptów JavaScript, obrazów itp.).
projekt HTTP Archive (http://httparchive.org). Śledzi on rozwój sieci, przeglądając okresowo
najpopularniejsze strony (ponad 300 000 stron z serwisu Alexa Top 1M), rejestruje i
agreguje wyniki analizy ilości zastosowanych zasobów, typów treści, nagłówków i innych
metadanych każdej strony.
Wodospad zasobów jest skutecznym narzędziem umożliwiającym wykrycie zastosowanej
metody optymalizacji lub jej braku w dowolnej stronie bądź aplikacji. Opisany wyżej proces
analizy i optymalizacji wodospadu zasobów jest często nazywany

analizą i optymalizacją

wydajności interfejsu użytkownika

​ (ang. front-end performance).

Prawdziwym wąskim gardłem jest opóźnienie sieciowe pomiędzy klientem a
serwerem.

Ogólnie mówiąc,

testy syntetyczne​ oznaczają dowolny proces wykonany za pomocą

kontrolowanego środowiska. Jednak testy syntetyczne są niewystarczające do określenia
wszystkich czynników pogarszających wydajność. Problem polega w szczególności na tym,
że zebrane wyniki nie są reprezentatywne dla szerokiego spektrum różnorodnych
czynników, które w rzeczywistym świecie wpływają na ostateczną wydajność aplikacji u
końcowych użytkowników. Czynniki powodujące powstanie takiej luki to między innymi:

·

Scenariusze wyboru i korzystania ze stron — odtworzenie rzeczywistej nawigacji

użytkownika jest trudne.

·

Pamięć podręczna przeglądarki — wydajność może zmieniać się w szerokim zakresie w

zależności od stanu pamięci podręcznej przeglądarki u użytkownika.

·

Urządzenia pośrednie — wydajność może się zmieniać w zależności od pośrednich

serwerów proxy i pamięci podręcznej.

·

Różnorodność sprzętu — szerokie spektrum wydajności procesorów, procesorów

graficznych i pamięci.

·

Różnorodność przeglądarek — szerokie spektrum wersji, starych i nowych.

·

Połączenie — nieustannie zmieniające się pasmo i opóźnienie rzeczywistych połączeń.

Kombinacja wyżej wymienionych i podobnych czynników oznacza, że oprócz syntetycznych
testów musimy uzupełnić naszą strategię pomiaru wydajności o

rzeczywiste pomiary​ (ang.

real-user measurement, RUM),

W3C Web Performance Working Group wprowadziło interfejsy pomiarowe:

·

Navigation Timing API – główna strona

·

User Timing API

·

Resource Timing API – zasoby pobierane przez stronę

Połączone interfejsy Navigation, Resource oraz User Timing tworzą zestaw wszystkich
niezbędnych narzędzi do przygotowania i przeprowadzenia rzeczywistych pomiarów
wydajności każdej aplikacji WWW.


Optymalizacja przeglądarki

background image

·

Optymalizacja dokumentu

​ Stos sieciowy jest zintegrowany z procesami przetwarzania

dokumentu, stylów CSS i wykonywania skryptów JavaScript, tak aby możliwe było
zidentyfikowanie i nadanie priorytetów krytycznym zasobom sieciowym, odpowiednio
wczesne wysłanie żądań i udostępnienie interaktywnej strony najszybciej, jak to możliwe.
Często odbywa się to przez przypisanie priorytetów zasobom, przez wyprzedzającą analizę
dokumentu i inne techniki.

·

Optymalizacja spekulatywna

​W miarę upływu czasu przeglądarka może się uczyć

charakterystyki nawigacji użytkownika i przeprowadzać spekulatywną optymalizację oraz
przewidywać prawdopodobne czynności użytkownika, np. zawczasu rozwiązywać nazwy
DNS, zestawiać połączenia do serwerów itp.
Wstępne pobieranie i ustalanie priorytetów zasobów

​ Procesy analizy dokumentu, stylów

CSS i wykonywania skryptów JavaScript mogą przekazywać do stosu sieciowego
dodatkową informację o względnych priorytetach nadanych każdemu zasobowi. Zasobom
niezbędnym do pierwszego wyświetlenia strony nadawany jest wysoki priorytet, natomiast
żądania o niskim priorytecie mogą być tymczasowo umieszczone dalej w kolejce.
Wstępne rozwiązywanie nazw DNS

​ Nazwy serwerów, które prawdopodobnie zostaną

użyte, są zawczasu rozwiązywane w celu uniknięcia opóźnienia związanego z odpytaniem
serwera DNS w przyszłym żądaniu HTTP. Wstępne rozwiązywanie nazw może być
wykonywane na podstawie zapamiętanej historii nawigacji bądź w wyniku wykonania
określonej czynności użytkownika, takiej jak umieszczenie kursora myszy nad odnośnikiem,
lub na podstawie innych sygnałów wysyłanych przez stronę.
Wstępne nawiązywanie połączeń TCP

​Po rozwiązaniu nazw za pomocą serwera DNS

przeglądarka może zawczasu nawiązać połączenie TCP, przewidując wysłanie żądania
HTTP. Jeżeli przewidywanie będzie trafne, zostanie dzięki temu wyeliminowane opóźnienie
sieciowe dotyczące nawiązania połączenia TCP.
Wstępne wyświetlenie strony

​Niektóre przeglądarki potrafią przewidzieć, jaka strona

zostanie otwarta w następnej kolejności, wstępnie ją całą wyświetlić w ukrytej zakładce i
natychmiast się na nią przełączyć, gdy użytkownik rozpocznie nawigację.
Co powinniśmy robić aby zoptymalizować czas ładowania strony:

·

Wykrywanie krytycznych zasobów w dokumencie, takich jak style CSS i skrypty JavaScript,

powinno odbywać się jak najszybciej.

·

Style CSS powinny być przesyłane możliwie jak najwcześniej, aby nie blokować

wyświetlania strony i wykonywania skryptów JavaScript.

·

Pobieranie mniej krytycznych skryptów JavaScript powinno zostać odłożone na później, aby

nie blokować tworzenia obiektów DOM i CSSOM.

·

Dokument HTML jest analizowany stopniowo przez przeglądarkę, dlatego w celu osiągnięcia

najwyższej wydajności powinien być wysyłany do przeglądarki etapami.



Oprócz tego, że można zoptymalizować strukturę strony, w samym dokumencie można
zawrzeć dodatkowe wskazówki dotyczące optymalizacji, które przeglądarka może wykonać
za nas:

·

<link rel="dns-prefetch" href="//nazwa_do_rozwiazania.com"> wstępne rozwiązanie nazwy

określonego serwera

background image

·

<link rel="subresource" href="/javascript/mojaaplikacja.js"> wstępne pobranie krytycznego

zasobu umieszczonego w dalszej części strony

·

<link rel="prefetch" href="/obrazy/duzy.jpeg"> wstępne pobranie zasobu do bieżącej i

przyszłej nawigacji

·

<link rel="prerender" href="//przyklad.org/nastepna_strona.html"> przewidywanie otwarcia

przez użytkownika określonej strony i wstępne jej wyświetlenie
HTTP 1.1 wprowadził wiele udoskonaleń i funkcjonalności mających krytyczny wpływ na
wydajność, z których te najbardziej znane to między innymi:

·

trwałe połączenia umożliwiające ich wielokrotne użycie,

·

dzielenie danych na porcje umożliwiające strumieniowanie,

·

kolejkowanie żądań umożliwiające ich równoległe przetwarzanie,

·

operacje na bajtach umożliwiające wysyłanie żądań określonego zakresu danych,

·

ulepszony i ściślej określony mechanizm przechowywania danych w pamięci podręcznej

Zalecenia

·

Zmniejsz liczbę zapytań do serwerów DNS Każde rozwiązanie nazwy hosta wymaga

przesłania komunikatu przez sieć w obie strony, co wprowadza opóźnienie, a podczas
odpytywania wstrzymywane jest wykonywanie żądania.

·

Zmniejsz liczbę żądań HTTP Nie ma szybszego żądania od tego, które nie zostało

wykonane. Usuwaj niepotrzebne zasoby ze swoich stron.

·

Stosuj rozproszoną sieć serwerów (Content Delivery Network) Umiejscowienie danych

geograficznie bliżej klienta może znacząco zmniejszyć opóźnienie sieciowe każdego
połączenia TCP i zwiększyć prędkość transmisji.

·

Dodaj nagłówek Expires i skonfiguruj ETag Potrzebne zasoby powinny być umieszczane w

pamięci podręcznej, aby zapobiec wielokrotnemu żądaniu tych samych bajtów danych przez
każdą stronę. Nagłówek Expires może być użyty do określenia czasu przechowywania
obiektu w pamięci podręcznej, dzięki czemu obiekt może być z niej odczytany, a żądanie
HTTP całkowicie pominięte. Nagłówki ETag i Last-Modified oferują skuteczny mechanizm
odnawiania terminu ważności danych — za pomocą odcisku lub znacznika czasowego
ostatniej aktualizacji.

·

Kompresuj zasoby Wszystkie zasoby tekstowe przesyłane między klientem a serwerem

powinny być skompresowane metodą gzip. Wielkość pliku jest wtedy zmniejszana średnio o
60 – 80%. Zatem jest to jedna z prostszych i najbardziej wydajnych metod
optymalizacyjnych, jakie można zastosować (wymaga tylko ustawienia flagi konfiguracyjnej
na serwerze).

·

Unikaj przekierowań HTTP Przekierowania HTTP mogą być bardzo kosztowne, szczególnie

gdy klient jest kierowany do serwera o innej nazwie, co skutkuje dodatkowym odpytaniem
serwera DNS, opóźnieniem połączenia TCP itd.


Każde połączenie TCP rozpoczyna się od wymiany trzech pakietów, co wprowadza
pełne opóźnienie w obie strony pomiędzy klientem a serwerem.

Korzyści z podtrzymywania połączeń
Kolejkowanie żądań http

background image

W praktyce z powodu braku multipleksacji kolejkowanie żądań HTTP powoduje wiele
subtelnych i nieudokumentowanych konsekwencji dla serwerów, urządzeń pośrednich i
klientów, na przykład:

·

Pojedyncza opóźniona odpowiedź blokuje wszystkie następne żądania.

·

W trakcie równoległego przetwarzania żądań serwery muszą przechowywać odpowiedzi w

buforach, co może prowadzić do wyczerpania zasobów. Co się na przykład stanie, jeżeli
odpowiedź będzie bardzo duża? Odkryty zostanie słaby punkt serwera, podatny na ataki!

·

Nieudana odpowiedź może spowodować przerwanie połączenia TCP, co zmusi klienta do

ponownego zażądania wszystkich następnych zasobów, i powtórne przetwarzanie.

·

Wykrycie kompatybilności kolejkowania żądań jest nietrywialnym zadaniem, szczególnie gdy

istnieją urządzenia pośrednie.

·

Niektóre urządzenia pośrednie nie obsługują kolejkowania żądań i mogą przerywać

połączenie, a inne mogą serializować wszystkie żądania.
Użycie wielu połączeń TCP

Maksymalne zwielokrotnienie żądań przy braku kolejkowania jest równe liczbie otwartych
połączeń. Ponadto wielkość okna TCP jest w rzeczywistości przemnożona przez liczbę
otwartych połączeń, co umożliwia klientowi obejście skonfigurowanego ograniczenia liczby
pakietów podczas wolnego startu transmisji TCP. Jak na razie, rozwiązanie wydaje się
dobre! Rozważmy jednak kilka kosztów tej metody:

·

dodatkowe wykorzystanie zasobów przez gniazda po stronie klienta, serwera i wszystkich

urządzeń pośrednich, dodatkowe bufory pamięci i obciążenie procesora;

·

rywalizację równoległych strumieni TCP o współdzielone pasmo łączy;

·

znacznie bardziej skomplikowaną implementację obsługi zestawu gniazd;

·

ograniczone możliwości równoległego przetwarzania danych przez aplikację, nawet przy

równoległych strumieniach TCP.

Rozdrobnienie domeny
W takim razie dlaczego ograniczać się do tego samego serwera? Zamiast wysyłać zasoby z
tego samego źródła (np. www.przyklad.com), możemy je ręcznie „rozdrobnić” między wiele
poddomen {dom1,domn}.przyklad.com. Ponieważ nazwy serwerów będą różne, więc
pośrednio zwiększymy liczbę połączeń na serwer i osiągniemy wyższy poziom
zrównoleglenia. Im większe rozdrobnienie, tym wyższe zrównoleglenie!
Oczywiście nic nie ma za darmo i rozdrobnienie domen (ang. domain sharding) nie jest tu
wyjątkiem. Każda nowa nazwa serwera wymaga osobnego odpytania serwera DNS, co
powoduje zajęcie kolejnych zasobów po obu stronach dodatkowego połączenia, a co
najgorsze, wymaga od twórcy strony ręcznego określenia, jak i gdzie mają być rozdzielone
zasoby.
Pomiar i kontrola narzutu protokołu
Protokół HTTP 0.9 zaczynał od prostego, jednowierszowego żądania dokumentu
hipertekstowego, które wprowadzało minimalny narzut. Wersja 1.0 rozszerzyła protokół
HTTP i wprowadziła pojęcie nagłówków żądań i odpowiedzi, umożliwiających obu stronom
wymianę dodatkowych metadanych. I wreszcie protokół HTTP 1.1 ustanowił standard tego
formatu — nagłówki mogą być łatwo rozszerzane przez serwer lub klienta i są zawsze
przesyłane jako zwykły tekst, aby były kompatybilne z poprzednimi wersjami protokołu
HTTP.

background image

Konkatenacja i kompozycja zasobów

Konkatenacja

​ (ang. concatenation) Wiele plików JavaScript i CSS jest łączonych w

jednym żądaniu.
Kompozycja (

​and. spriting) Z wielu obrazów jest komponowany jeden złożony obraz.

Pliki JavaScript i CSS można bezpiecznie połączyć bez wpływu na zachowanie i
wykonywanie kodu, o ile zostanie niezmieniona kolejność ich wykonywania.
Podobnie kilka obrazów może być połączonych w „kompozycję”, a style CSS mogą
być użyte do wybrania i umieszczenia części kompozycji w odpowiednim miejscu w
oknie przeglądarki. Korzyści z zastosowania powyższych technik są dwojakie:
Mniejszy narzut protokołu

​ Dzięki połączeniu plików w jeden zasób eliminowany jest

narzut protokołu wprowadzany przez każdy plik. Narzut ten, jak widzieliśmy
wcześniej, może łatwo skutkować przesyłaniem dodatkowych kilobajtów
nieskompresowanych danych.
Kolejkowanie na poziomie aplikacji

​Ostateczny efekt zastosowania obu

powyższych technik, rozumiany jako prędkość przesyłania danych, jest taki sam jak
w przypadku kolejkowania HTTP: dane z wielu odpowiedzi są przesyłane jedne po
drugich, eliminując dzięki temu dodatkowe opóźnienie. W ten sposób po prostu
przesunęliśmy algorytm kolejkowania o jeden poziom wyżej, do naszej aplikacji.

Osadzanie zasobów
Osadzanie zasobów

​ (ang. resource inlining) jest inną popularną metodą optymalizacyjną

umożliwiającą zmniejszenie liczby wysyłanych żądań poprzez osadzenie zasobów w
dokumencie. Kody JavaScript i CSS mogą być umieszczone bezpośrednio na stronie w
odpowiednich blokach HTML, a inne zasoby, takie jak obrazy, a nawet pliki dźwiękowe lub
PDF, mogą być osadzone w schemacie danych URI


Oczekuje się, że protokół HTTP 2.0 wprowadzi następujące zmiany:

·

W przypadku większości stron w znaczący i wymierny sposób zostanie zmniejszone

opóźnienie postrzegane przez użytkowników w porównaniu z protokołem HTTP 1.1
wykorzystującym TCP.

·

Zostanie rozwiązany problem blokowania początku kolejki w protokole HTTP.

·

Do zrównoleglenia obsługi żądań nie będzie wymagane nawiązywanie wielu połączeń z

serwerem, dzięki czemu w większym stopniu będzie wykorzystany protokół TCP,
szczególnie pod kątem sterowania spiętrzeniami ruchu.

·

Zostanie zachowane działanie protokołu HTTP 1.1 zgodnie z istniejącą dokumentacją,

wykorzystujące metody HTTP (ale nie tylko), kody stanów, identyfikatory URI i pola
nagłówka tam, gdzie będzie to zasadne.

·

Będzie jasno zdefiniowana interakcja z protokołem HTTP 1.x, szczególnie w urządzeniach

pośrednich.

·

Będą jasno określone miejsca umożliwiające rozbudowę protokołu i zasady ich właściwego

wykorzystania.
Warstwa ramkowania binarnego

​ Rdzeniem wszystkich udoskonaleń wydajnościowych

wprowadzonych w protokole HTTP 2.0 jest nowa warstwa ramkowania binarnego (patrz
rysunek 12.1), która określa sposób enkapsulacji i przesyłania komunikatów między klientem
a serwerem.

background image

Elementy protokołu HTTP, takie jak słowa kluczowe, metody i nagłówki, pozostają takie
same, ale zmiana polega na sposobie ich kodowania podczas transmisji. W odróżnieniu od
protokołu HTTP 1.x, opartego na zwykłym tekście podzielonym znakami nowego wiersza, w
protokole HTTP 2.0 wszystkie przesyłane dane są podzielone na mniejsze komunikaty i
ramki zakodowane w formacie binarnym.
Klient używający protokołu HTTP 1.x nie zrozumie serwera używającego tylko protokołu 2.0,
i odwrotnie.


Strumienie, komunikaty ramki
Ramka

​najmniejsza jednostka danych w http 2.0, zawierająca nagłówek identyfikujący

przynajmniej strumień, do którego ramka należy.

Cała komunikacja odbywa się w ramach jednego połączenia TCP.

Multipleksacja żądań i odpowiedzi

Nowa warstwa ramkowania binarnego w protokole HTTP 2.0 usuwa te ograniczenia i
umożliwia pełną multipleksację żądań i odpowiedzi, dzięki czemu klient i serwer
mogą dzielić komunikaty HTTP na niezależne ramki (patrz rysunek 12.3), mieszać je
i ponownie składać po drugiej stronie.
Możliwość dzielenia komunikatów HTTP na niezależne ramki, mieszanie ich i
składanie po drugiej stronie to najważniejsze udoskonalenie wprowadzane przez
protokół HTTP 2.0. W rzeczywistości protokół oferuje wiele pochodnych korzyści
wydajnościowych w całym stosie technologii WWW. Umożliwia między innymi:

·

mieszanie wielu równoległych żądań bez ich wzajemnego blokowania,

·

mieszanie wielu równoległych odpowiedzi bez ich wzajemnego blokowania,

·

użycie jednego połączenia do równoległego przesyłania wielu żądań i odpowiedzi,

·

szybsze ładowanie stron dzięki eliminacji niepotrzebnych opóźnień,

·

usunięcie z kodu aplikacji niepotrzebnych napraw usterek protokołu HTTP 1.x,

Priorytety żądań

​ Po podzieleniu komunikatu HTTP na kilka osobnych ramek ich

kolejność przesyłania może być zoptymalizowana i w ten sposób może być
zwiększona wydajność naszej aplikacji. Aby to osiągnąć, każdemu strumieniowi jest
przypisana 31-bitowa wartość oznaczająca priorytet (0 najważniejsze, ostatni
najmniej ważny)
Jedno połączenie na serwer

​ Dzięki nowemu mechanizmowi ramkowania protokół

HTTP 2.0 nie potrzebuje wielu połączeń TCP, aby równolegle multipleksować wiele
strumieni. Zamiast tego każdy strumień jest dzielony na wiele ramek, które mogą być
mieszane i przesyłane z określonymi priorytetami. W rezultacie wszystkie połączenia
są trwałe, a pomiędzy klientem a serwerem jest używane tylko jedno połączenie.
Wypychanie zasobów

​ Bardzo użyteczną nową funkcjonalnością protokołu HTTP

2.0 jest możliwość wysyłania przez serwer wielu odpowiedzi na żądanie klienta.
Oznacza to, że serwer w odpowiedzi na żądanie klienta może wypchnąć dodatkowe
zasoby (patrz rysunek 12.4) bez konieczności żądania ich wprost przez klienta!
Ręcznie osadzając zasoby w dokumencie, w rzeczywistości wypychamy je do klienta
bez oczekiwania, aż ich zażąda. Jedyna różnica wprowadzana przez protokół HTTP

background image

2.0 polega na przesunięciu tej czynności z aplikacji do samego protokołu, co
przynosi istotne korzyści:

·

Wypchnięte zasoby mogą być zapisane w pamięci podręcznej klienta.

·

Wypchnięte zasoby mogą być odrzucone przez klienta.

·

Wypchnięte zasoby mogą być wielokrotnie wykorzystane na różnych stronach.

·

Wypchnięte zasoby mogą mieć priorytety nadane przez serwer.

Serwer musi stosować mechanizm żądanie-odpowiedź i wypychać zasoby tylko w
odpowiedzi na żądanie klienta. Serwer nie może sam zainicjować wypychanego
strumienia. Ramki PUSH_PROMISE muszą zostać wysłane przed wysłaniem
odpowiedzi, aby uniknąć efektu wyścigu, tj. żądania przez klienta tych samych
zasobów, które serwer zamierza wypchnąć.


Kompresja nagłówka
Aby zmniejszyć narzut i poprawić wydajność, protokół HTTP 2.0 kompresuje
metadane w nagłówku:

·

Zamiast ponownego przesyłania tych samych danych w każdym żądaniu i

odpowiedzi protokół HTTP 2.0 stosuje „tabele nagłówków” po stronie klienta i
serwera do śledzenia i przechowywania wcześniej przesłanych par klucz-wartość.

·

Tabele nagłówków są tworzone dla całego połączenia HTTP 2.0 i są stopniowo

aktualizowane zarówno po stronie klienta, jak i serwera.

·

Każda nowa para klucz-wartość jest albo dołączana do istniejącej tabeli, albo

zastępuje poprzednią parę.



Krótkie wprowadzenie do ramkowania binarnego
Po nawiązaniu połączenia HTTP 2.0 klient i serwer komunikują się między sobą,
wymieniając ramki będące najmniejszą jednostką danych w protokole. Wszystkie
ramki mają taki sam 8-bajtowy nagłówek (patrz rysunek 12.6), zawierający długość
ramki, jej typ, pole z flagami i 31-bitowy identyfikator strumienia.


Inicjowanie nowego strumienia

​ Zanim zostaną przesłane jakiekolwiek dane

aplikacyjne, musi zostać utworzony nowy strumień i muszą być przesłane
odpowiednie metadane, takie jak priorytet strumienia i nagłówki HTTP. W protokole
HTTP 2.0 nowe strumienie mogą być zainicjowane zarówno przez klienta, jak i
serwer, a więc należy rozważyć dwa przypadki:

·

Klient inicjuje nowe żądanie, wysyłając ramkę HEADERS (patrz rysunek 12.7),

zawierającą jednolity nagłówek z identyfikatorem strumienia, opcjonalnym
31-bitowym priorytetem, a w polu danych zestaw nagłówków HTTP z parami
klucz-wartość.

background image

·

Serwer inicjuje wypychany strumień, wysyłając ramkę PUSH_PROMISE, która jest

praktycznie identyczna z ramką HEADERS, z tym jednym wyjątkiem, że zawiera
dodatkowy „identyfikator obiecanego strumienia”, a nie jego priorytet.
Ramki obu typów są używane do przesyłania jedynie metadanych opisujących każdy
nowy strumień, a właściwe dane są dostarczane osobno w ramkach typu DATA.
Ponadto, ponieważ obie strony mogą inicjować nowe strumienie, ich numeracja jest
rozdzielona: strumienie inicjowane przez klienta mają parzyste identyfikatory, a
inicjowane przez serwer — nieparzyste. Taki podział eliminuje kolizje w numeracji
strumieni. Każda strona ma własny licznik zwiększany podczas inicjowania nowego
strumienia.
Przesyłanie danych

​ ​aplikacyjnych​ Po utworzeniu nowego strumienia i przesłaniu

nagłówków HTTP do przesłania danych aplikacyjnych (jeżeli takie istnieją) są
stosowane ramki DATA (patrz rysunek 12.8). Dane są dzielone na wiele ramek, z
których ostatnia ma w nagłówku ustawioną flagę END_STREAM, oznaczającą
koniec komunikatu.


Wyszukiwarka

Podobne podstrony:
10,11,12
24 05 2010 B&K, Bazy Danych 10 11 12
klima pytania, 7 8 9 10 11 12
Dom Nocy 09 Przeznaczona rozdział 10 11 TŁUMACZENIE OFICJALNE
24.05.2010 B&K Bazy Danych 10 11 12
pkmiu zadania 1 2 3 4 6 7 8 10 11 12, ściągi III OP
Marketing?nkowy materialy do zajec 10 11
2013 2014 ZARZADZANIE ZASOBAMI LUDZKIMI wyklad 10 11 12
prezentacja ze szkolenia 10 11 12 2011 coaching
10,11,12
10,11,12
10, 11, 12
Instrukcja F, Poniedziałek - Materiały wiążące i betony, 10. (08.12.2011) Ćw F - Badanie właściwości
odpowiedzialność materialna - zadanie domowe, prawo 11-12
Język jako narzedzie komunikacji wykł 10 11.12.07
10, 11, 12, 10
10, 11, 12, 10
7,8,9,10,11, 12

więcej podobnych podstron