Co to jest HTTP?

HTTP, czyli Protokół Przesyłania Dokumentów Hipertekstowych (ang. Hypertext Transfer Protocol)

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)

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)

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).
Komponenty URI
schemat://źródło/ścieżka?kwerenda#fragment

Komponent źródło (ang. authority) zawiera trzy podkomponenty:

  • infoużytkownika (ang. userinfo) (opcjonalne),
  • host (wymagane), i,
  • port (optional).
URI z podkomponentami daneużytkownika, host i port
schemat://infoużytkownika@host:port/ścieżka?kwerenda#fragment

Podkomponent infoużytkownika może być dalej podzielony na następujące podkomponenty:

  • nazwaużytkownika (ang. username) (wymagana), i
  • hasło (ang. password) (opcjonalne).
Pełna składnia URI
schemat://nazwaużytkownika:hasło@host:port/ścieżka?kwerenda#fragment

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.

URL, w którym wskazane są wyłącznie protokół i ścieżka
file:///Users/johndoe/Documents/mystuff.json

URL Syntax.

Protokół (ang. protocol) URL

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.

Źródło (ang. authority) URL

Źródło (ang. authority) URL

Źródło (ang. authority) URL jest opcjonalnym komponentem URL który wskazuje serwer lub serwery, z których zasób URL ma być podawany, oraz opcjonalnie umożliwia uwierzytelnianie (ang. authentication) użytkownika podczas dokonywania dostępu do tych serwerów, oraz wskazuje port, poprzez który te serwery powinny podlegać dostępowi.

Żródło URL składa się z trzech podkomponentów:

  • infoużytkownika (opcjonalne),
  • host (wymagany), i
  • port (opcjonalny).

Infoużytkownika (ang. username) w źródle (ang. authority) URL

Infoużytkownika (ang. username) w źródle (ang. authority) URL

Infoużytkownika (ang. username) w źródle (ang. authority) URL jest opcjonlanym podkomponentem w opcjonalnym źródle (ang. authority) URL, który wskazuje wymaganą nazwaużytkownika (ang. username) oraz opcjonalne hasło na potrzeby uwierzytelniania (ang. authentication) podczas dokonywania dostępu do hosta URL.

Dane w podkomponencie hasło podawane są jako tekst odkryty (ang. plain text) i, z tego względu, jego użycie jest odradzane, a nawet oficjalnie dezaprobowane (ang. deprecated).

Host (ang. host) w źródle (ang. authority) URL

Host (ang. host) w źródle (ang. authority) URL

Host (ang. host) w źródle (ang. authority) URL jest wymaganym podkomponentem w opcjonalnym źródle (ang. authority) URL, który wskazuje serwer lub serwery, z których zasób URL ma być podawany.

Host może być:

  • zarejestrowaną nazwą domeny (np. example.net), która może być poprzedzona opcjonalną subdomeną (np. www), lub
  • adresem IP (np. 127.0.0.1).

W zarejestrowanej nazwie domeny ostatni podkomponent (np. com, net, pl) nazywany jest sufiksem domeny (ang. domain suffix).

Zarejestrowana nazwa domeny mapowana jest do jednego lub wielu adresów IP przez System Nazw Domen (ang. Domain Name System, DNS).

Z drugiej strony, wiele różnych zarejestrowanych nazw domen może być mapowanych do jednego adresu IP, gdy w grę wchodzi tak zwany wirtualny hosting.

URL z zarejestrowaną nazwą domeny jako hostem
https://www.example.net/movies/?director=scott
URL z adresem IP jako hostem
http://127.0.0.1:8080/users

Port w źródle (ang. authority) URL

Port w źródle (ang. authority) URL

Port w źródle (ang. authority) URL jest opcjonalnym podkomponentem w opcjonalnym źródle (ang. authority) URL, który identfyikuje proces klienta (ang. client process), który dokonuje dostępu do hosta.

Niektóre numery portów uznazwane są za zarezerwowane i powinny być używane tylko przez procesy używające określonych protokołów.

Powszechnie używany port dla serwerów sieciowych to 8080, jednakże gdy port nie jest wskazany HTTP używa domyślnie portu 80, a HTTPS używa domyślnie portu 443. Te numery portów zarezerwowane są dla tych celów.

URL ze wskazanym numerem portu
https://example.net:443

Ścieżka (ang. path) URL

Ś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

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 (&).

URL z kwerendą
https://www.example.net/movies?director=scott&year=1982

Fragment (ang. fragment) w URL

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 (#).

URL z kwerendą i fragmentem
https://www.example.net/movies?director=scott&year=1982#actors

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.

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)

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).