Kurs HTTP
Co to jest HTTP?
HTTP, czyli Protokół Przesyłania Dokumentów Hipertekstowych (ang. Hypertext Transfer Protocol) to zestaw zasad i procedur (protokół) rządzących akcjami tworzenia, czytania, aktualizowania oraz usuwania zasobów internetowych poprzez wymianę wiadomości (ang. messages) przez dwa oddzielne procesy (instancje programów komputerowych), gdzie proces, który wysyła inicjalne zapytanie (ang. request) nazywany jest klientem, a proces, który wysyła odpowiedź (ang. response) nazywany jest serwerem.
HTTP jako część Pakietu Protokołów Internetowych
HTTP jest częścią wartswy aplikacji (warstwy programistycznej) w Pakiecie Protokołów Internetowych (ang. Internet Protocol Suite) (powszechnie znanego jako TCP/IP).
Ogólnie, TCP/IP obejmuje następujące warstwy:
- warstwa aplikacji - komunikacja proces-do-procesu, obecnie obejmuje HTTP, FTP, SSH, oraz SMTP,
- warstwa transportu - komunikacja host-do-hosta (urządzenie-do-urządzenia), rządzona zasadami Protokołu Kontroli Transmisji (ang. Transmission Control Protocol, TCP) w HTTP/2 oraz Protokołu Datagramów Użytkownika (ang. User Datagram Protocol, UDP) w HTTP/3,
- warstwa internetowa - komunikacja sieć-do-sieci, intersieciowość, oraz
- warstwa łącza - komunikacja łączę-do-łącza wewnątrz pojedynczej sieci.
Początki HTTP
Rozwój TCP/IP, którego HTTP jest częścią, został zapoczątkowany w latach 60-tych XX wieku przez Agencję Zaawansowanych Projektów Badawczych Departamentu Obrony (ang. Defense Advanced Research Projects Agency, DARPA), która stworzyła Sieć Zaawansowanych Projektów Badawczych (Advanced Research Projects Agency Network, ARPANET). W latach 80-tych XX wieku niektóre wersje TCP/IP zostały zaadaptowane przez IBM, AT&T, oraz inne spółki. W 1989 Uniwersytet Kalifornijski, Berkeley, umieścił kod TCP/IP wytworzony dla BSD Unix w domenie publicznej.
Opracowanie samego HTTP zostało zapoczątkowane przez Sir Tim Berners-Lee w CERN w 1989 roku z wersją 0.9. Zbiegło się z opracowaniem HTML, czyli Hipertekstowego Język Znaczników (ang. HyperText Markup Language)
Pierwszy serwer HTTP zaczął działać w 1990 roku.
Wersje HTTP
HTTP/0.9 (HTTP wersja 0.9), który był pierwszą wersją HTTP, miał tylko metodę GET, która mogła tylko pobierać dokuemnty. HTTP/0.9 jest obecnie uważany za wygasły.
HTTP/1 został sfinalizowany w 1996 roku. Dodał metody HEAD oraz POST. W HTTP/1 oddzielne połączenie musiało być inicjowane dla każdej wymiany zapytania i odpowiedzi. HTTP/1 jest obecnie uważany za wygasły.
HTTP/1.1 został wydany w 1997 roku. Dodał metody PUT, DELETE, CONNECT, OPTIONS oraz TRACE. W HTTP/1.1 jedno połączenie może być używane dla wielu wymian pytań i odpowiedzi. HTTP/1.1 wciąż jest używany obecnie.
HTTP/2 został wprowadzodzony w roku 2015. Bazuje, do pewnego stopnia, na binarnym protokole SPDY Google'a i zwiększa prędkość wymiany wiadomości, jednakże zachowuje ogólną kompatybilność z HTTP/1.1. Pomimo tego, że HTTP/2 nie wymaga szyfrowania, to główne przeglądarki przy wymianie wiadomości z użyciem HTTP/2 wymagają, co de facto je wymusza. HTTP/2 uważany jest obecnie za przeważający standard HTTP.
HTTP/3 jest obecnie w trakcie rozwoju. HTTP/3 ogólnie używa tych samych metod, kodów stanu, oraz pól, co HTTP/2. Głównym powodem stojącym za rozwojem HTTP/3 jest zwiększenie prędkości wymiany wiadomości. Jest to osiągane poprzez użycie nowego protokołu wartwy transportu (host-do-hosta) zwanego QUIC, bazującego na Protokole Datagramów Użytkownika (ang. User Datagram Protocol, UDP), zamiast Protokołu Sterowania Transmisją (ang. Transmission Control Protocol, TCP).
HTTPS, czyli Zabezpieczony Protokół Przesyłania Dokumentów Hipertekstowych (ang. Hypertext Transfer Protocol Secure) jest rozszerzeniem HTTP dostarczającym bezpieczną komunikację pomiędzy procesami poprzez użycie Zabezpieczenia Warstwy Transportu (ang. Transport Layer Security, TLS) lub, wcześniej, Zabezpieczonej Warstwy Gniazd (ang. Secure Sockets Layer, SSL).
Bezstanowość HTTP
HTTP jest bezstanowe (ang. stateless), co oznacza, że żaden poprzedni stan nie jest kiedykolwiek potrzebny dla wykonania wymiany wiadomości zapytania i odpowiedzi.
Powyższe nie oznacza, że żadne dane nie mogą być zachowane pomiędzy wymianami wiadomości. Mogą być. Dane mogą być zachowane pomiędzy wymianami wiadomości w formie plików HTTP cookies, które wysyłane są w odpowiedziach przez serwer, zachowywane przez klienta, i dołączane do kolejnych zapytań klienta.
Połączenia i porty
Zanim następuje wymiana wiadomości zapytania i odpowiedzi klient inicjuje połączenie z serwerem.
Powszechnie używanym portem dla niezaszyfrowanych połączeń jest 80, a dla zaszyfrowanych 443.
Co to jest URL?
URL, czyli Ujednolicony Lokalizator Zasobów (ang. Uniform Resource Locator) - kolokwialnie zwany adresem internetowym (ang. web address) - to unikalna sekwencja znaków, która umożliwia lokalizowanie zasobów cyfrowych (cyfrowo zachowanych nienamacalnych wytworów ludzkiego intelektu) poprzez sieć komputerową, w tym między innymi sieć Internet, które następnie mogą podlegać dostępowi używając różnorakich protokołów transferu takich jak HTTP, czyli protokołu przesyłania dokumentów hipertekstowych (ang. Hypertext Transfer Protocol), FTP, czyli protokołu przesyłania plików (ang. File Transfer Protocol) oraz mailto dla poczty elektronicznej.
URL jako URI (ang. Uniform Resource Identifier)
URL jest rodzajem URI, czyli Ujednoliconego Identyfikatora Zasobów (ang. Uniform Resource Identifier).
URI, czyli Ujednolicony Identifikator Zasobów (ang. Uniform Resource Identifier) to unikalna sekwencja znaków, która umożliwia identyfikację zasobów fizycznych, takich jak fizyczne obiekty, miejsca, oraz ludzie, oraz zasobów logicznych (nienamacalnych wytworów ludzkiego intelektu), takich jak idee, koncepcje, dokumenty pisemne, książki, piosenki, filmy, gry, oraz zasoby cyfrowe.
Pochodzenie URL
Termin URL został zdefiniowany przez wynalazcę sieci World Wide Web, Tim Berners-Lee, w roku 1994.
Konceptualizacja URL jest powiązana z rozwojem Protokołu Przesyłania Dokumentów Hipertekstowych (ang. Hypertext Transfer Protocol, HTTP) zapoczątkowanym przez Tim Berners-Lee w CERN w 1989 roku. Aby dowiedzieć się więcej zobacz What is HTTP?.
Składnia URI
Jak zauważono powyżej, URL jest rodzajem URI.
Generyczna składnia URI zawiera 5 komponentów:
- schemat (ang. scheme) (wymagany),
- źródło (ang. authority) (opcjonalne),
- ścieżka (ang. path) (wymagana),
- kwerenda (ang. query) (opcjonalna), i
- fragment (opcjonalny).
Komponent źródło (ang. authority) zawiera trzy podkomponenty:
- infoużytkownika (ang. userinfo) (opcjonalne),
- host (wymagane), i,
- port (optional).
Podkomponent infoużytkownika może być dalej podzielony na następujące podkomponenty:
- nazwaużytkownika (ang. username) (wymagana), i
- hasło (ang. password) (opcjonalne).
Warto zapamiętać, że jedynymi wymaganymi komponentami URI są schemat i ścieżka.
Składnia URL
URL przestrzega generycznej składni URI, jednakże komponent schemat nazywany jest protokołem. Komponent protokół może mieć takie wartości, jak file, http, https, ftp oraz mailto.
A więc, URL może zawierać w sobie pięć komponentów:
- protokół (ang. protocol) (required),
- źródło (ang. authority) (opcjonalne), składające się z opcjonalnego infoużytkownika (ang. userinfo), wymaganego hosta oraz opcjonalnego portu,
- ścieżka (wymagana),
- kwerenda (opcjonalna), i
- fragment (opcjonalny).
Z tych pięciu komponentów, tylko protokół oraz ścieżka są wymagane.
URL, który odnosi się do lokalnego pliku jest przykładem URL, w którym tylko protokół oraz ścieżka są wskazane.

Protokół (ang. protocol) URL
Protokół (ang. protocol) URL - odpowiednik schematu URI - jest pierwszym z dwóch wymaganych komponentów URL (drugim jest ścieżka), który określa zestaw zasad i procedur rządzących sposobem, zgodnie z którym zasób URL ma podlegać dostępowi.
Częstą wartością protokołu może być file, http (razem ze swym zaszyfowanym odpowiednikiem https), ftp oraz mailto.
Ścieżka (ang. path) URL
Ścieżka (ang. path) URL jest drugim z dwóch wymaganych komponentów URL (pierwszym jest protokół), która określa logiczną lokalizację do danego zasobu URL (podczas gdy, protokół określa zasady i procedury dotyczące sposobu dostępu do tego zasobu).
Ścieżka składa się z jednego segmentu (np. /filmy) lub z wielu segmentów (np. /filmy/komedie)
Kwerenda (ang. query) w URL
Kwerenda (ang. query) w URL jest opcjonalnym komponentem URL, który wskazuje parametry używane przy dokonywaniu dostępu do zasobu URL.
W URL kwerenda poprzedzona jest znakiem zapytania (?).
Składnia kwerendy nie jest jasno zdefiniowana, ale zazwyczaj składa się z par kluczy i wartości (ang. key-value pairs) rozdzielonych znakiem znakiem ampersand (&).
Fragment (ang. fragment) w URL
Fragment (ang. fragment) w URL jest opcjonalnym komponentem URL, który wskazuje logiczną lokalizację do drugorzędnego zasobu (ang. secondary resource) URL takiego jak element w dokumencie HTML oznaczonego poprzez atrybut ID.
W URL fragment poprzedzony jest znakiem hashtag (#).
Adresy URL w zapytaniach (ang. requests) HTTP
Adresy URL używane są w zapytaniach HTTP do wskazywania zasoób podlegających dostępowi.
Zasoby, które mogą podlegać dostępowi używając HTTP oraz adresów URL to przede wszystkim dokumenty HTML.
Adresy URL w hiperłączach (ang. hiperlinks)
Adresy ULR mogą być używane w hiperłączach.
Hiperłącze (inaczej łącze lub link) to referencja do zasobu cyfrowego, za którą może podążyć użytkownik.
Na przykład, hiperłącze w HTML zbudowane jest używając elementu anchor, a wartość jego atrybutu href (ang. hypertext reference) może być oznaczona jako URL.
<a
href="https://soundof.it/co-to-jest-url"
>
Co to jest URL?
</a>Atrybut href może być również oznaczony jako relatywny URL (ang. relative URL).
Relatywny URL (ang. relative URL) to URL, w którym protokół oraz źródło (ang. authority) nie są wskazane wprost, a w sposób dorozumiany poprzez podstawienie odpowiednich wartości z URL zasobu aktualnie podlegającego dostępowi.
<a
href="/co-to-jest-url"
>
Co to jest URL?
</a>Konwersja i kodowanie URL
Dany URL może zostać użyty do transmisji danych poprzez sieć Internet, gdy składa się z bezpiecznych znaków ASCII.
Znak spoza ASCII, aby zostać użytym w URL, musi być skonwertowanym do tak zwanego Punycode składającego się z bezpiecznych znaków ASCII.
Przykładem znaku spoza ASCII jest ♥, który, aby być użytym w URL, musi zostać skonwertowany do xn--g6h.
Znak ASCII, który nie jest uznany za bezpieczny, aby być użytym w URL musi zostać zakodowany do zestawu bezpiecznych znaków ASCII składającego się z prefiksu % oraz następującego po nim numeru heksadecymalnego (ang. hexadecimal).
Przykładem znaku ASCII, który nie jest uznany za bezpieczny, jest znak spacja, który musi być zakodowany do + lub %20
Adres IRI (ang. Internationalized Resource Identifier)
IRI, czyli Zinternacjonalizowany Identyfikator Zasobów (ang. Internationalized Resource Identifier) to URL, który na potrzeby internacjonalizacji, może składać się ze znaków Unicode (w przeciwieństwie do standardowych znaków URL z ASCII).
Większość współczesnych przeglądarek wspiera adresy IRI.
Na potrzeby transmisji poprzez Internet, znaki spoza ASCII w IRI konwertowane są do tak zwanego kodu Punycode, który składa się tylko z bezpiecznych znaków ASCII.
Przykładem znaku Unicode spoza ASCII jest 人, który musi być skonwertowany do xn--gmq.
Nazwa domeny w IRI, która zawiera w sobie zinternacjonalizowane znaki, określana jest IDN, czyli Zinternacjonalizowaną Nazwą Domeny (ang. Internationalized Domain Name).