Ładowanie... proszę czekać...

Czy zastanawialiście się kiedyś, co dzieje się podczas ładowania strony www? Klikamy w link do strony na Wikipedii – jakie procesy zachodzą w chwili między kliknięciem a wyświetleniem strony na ekranie? Dzieje się całkiem sporo. Pozwólcie, że wyjaśnię. Niniejszy artykuł ma za zadanie zaspokoić waszą ciekawość, ale nie tylko.

✨ Ogłoszenie parafialne ✨

Otwieram kanał wideo. Od pewnego czasu pracuję nad pierwszym filmem. Kanał ma stanowić uzupełnienie treści Przewodnika po alternatywnym internecie. Uznałem, że taka forma prezentacji będzie bardziej przyswajalna.

Stworzenie filmu wymaga więcej nakładu pracy niż stworzenie artykułu. Nagrywanie dźwięku wymaga odpowiednich warunków. Nie można tego zrobić w drodze na zajęcia. Trzeba też przygotować materiały wizualne i wszystko to poskładać. Dlatego nie obiecuję, że inicjatywa się powiedzie, ani tym bardziej, że będę regularnie publikował. Ponieważ studiuję, mam wiele innych zajęć i niewiele czasu wolnego. Postaram się go jednak znaleźć i wykorzystać produktywnie.

👓 Przeglądarka a wyszukiwarka 🔎

Przeglądarka (www) służy do przeglądania stron. Jest to jedna z aplikacji zainstalowanych na waszym urządzeniu, obok gier, programów do obróbki zdjęć i modelowania 3D, odtwarzaczy muzyki, etc.

Wyszukiwarka służy do przeszukiwania internetu (tak naprawdę jego niewielkiej części). Jest to strona, obok Wikipedii, OpenStreetMap, Nextcloud czy Przewodnika, która pozwala odnaleźć inne strony.

Powszechne mylenie roli przeglądarki i wyszukiwarki ma kilka przyczyn, m.in. wbudowaną dla naszej wygody integrację przeglądarki z wyszukiwarką – w pasku przeglądarki wpisujemy frazę i jesteśmy odsyłani do wyszukiwarki. Możemy jednak łatwo zmienić wyszukiwarkę do jakiej nas odsyła w ustawieniach.

Ustawienia wyszukiwarki w Firefox mobile

Warto zdać sobie sprawę, że awaria wyszukiwarki to nie to samo, co brak internetu. Nadal możemy otwierać linki z zakładek i innych stron, po prostu nie działa wyszukiwanie. Dlatego warto korzystać z zakładek 👍. Poza tym, są jeszcze inne wyszukiwarki.

Linki 🔗

Disclaimer: w celu łatwiejszego odbioru artykuł stosuje pewne uproszczenia lub uogólnienia (np. pominięcie przypadków szczególnych odbiegających od reguły).

Strony www znajdują się na serwerach – specjalnych komputerach, które są zawsze włączone i można się z nimi połączyć przez internet. Serwują różne zasoby: dokumenty, grafiki, wideo, etc. tym urządzeniom, które o nie poproszą. Każdy taki zasób jest identyfikowany czymś, co nazywa się adres URL (czyli potocznie link).

Jeśli uważnie przyjrzymy się jego strukturze, zauważymy, że zawiera on 2 rzeczy – nazwę serwera i ścieżkę do zasobu na serwerze. Rzućmy okiem na kilka przykładów:

https://writefreely.pl/anedroid/f-droid-lepsze-aplikacje-na-twojego-smartfona https://pl.wikipedia.org/wiki/Skandal_Cambridge_Analytica-Facebook https://www.mimuw.edu.pl/~guzicki/materialy/Rekurencja.pdf

Kolorem czerwonym oznaczyłem nazwy serwerów, a kolorem niebieskim – ścieżki do zasobów. Zwłaszcza w ostatnim widzimy, że mamy do czynienia z plikiem pdf. Czasami w ścieżce widzimy autora, datę publikacji lub tytuł; innym razem tylko jakiś ciąg liczb. Dla przeglądarki nie ma on większego znaczenia – to serwer z początku adresu ma wiedzieć, co z nim zrobić. Dla przeglądarki liczy się nazwa serwera, by wiedzieć, dokąd skierować zapytanie.

Warto zauważyć, że nie zawsze ścieżki odpowiadają nazwom plików na serwerze. Serwer może być tak zaprogramowany, aby po otrzymaniu konkretnego zapytania wykonać pewną akcję – np. przeszukania bazy danych i zwrócenia wyników lub usunięcia zasobu.

Fragmentaryczne strony 🧩

Serwer może udostępniać różne zasoby, ale najczęściej są to dokumenty w internetowym formacie html. Jeśli otwieramy stronę na komputerze, wciskając ctrl-s możemy zapisać bieżącą stronę i otworzyć ją nawet, gdy nie będzie internetu – pisałem o tym tutaj.

Html pozwala na osadzanie w dokumencie elementów zewnętrznych, takich jak zdjęcia. Kiedy przeglądarka wczyta dokument html i zobaczy, że są tam odniesienia do dodatkowych elementów, wykonuje automatycznie kolejne zapytania. Takie elementy mogą nawet pochodzić z innych serwerów. Owszem, bez problemu osadzę tutaj obrazek znajdujący się na innej stronie, wystarczy tylko link.

Porównanie kodu html a zapytań przeglądarki 💡 Kliknij aby powiększyć

Niekiedy wczytane elementy wywołują jeszcze więcej zapytań. Przykładowo arkusz stylów (plik określający układ i szczegóły wizualne strony) może zawierać odnośniki do fantazyjnego kroju czcionki użytego w nagłówku. Jak więc widzimy, otwarcie pojedynczej strony wywołuje całą lawinę zapytań, i to do różnych serwerów.

☎️ Internetowy rejestr serwerów

Rozważmy teraz, jak zasób dociera z serwera do przeglądarki. Mamy tu kilka problemów do rozważenia:

  1. Kabel od internetu jest tylko jeden, a otwartych stron wiele. Z internetu korzystają też inne aplikacje. Z kolei do serwera w każdej chwili napływają dziesiątki zapytań od urządzeń całym na świecie, na które musi odpowiadać. Jak te wszystkie strumienie danych się ze sobą nie pomieszają?
  2. Naszego urządzenie i serwera dzieli duży dystans, a transmisję danych wspomagają pośrednicy. Skąd oni wiedzą, gdzie dostarczyć dane i którędy?
  3. Co nazwa serwera mówi nam na temat jego lokalizacji?

Aby rozwiązać te problemy, wymyślono podział komunikacji sieciowej na warstwy lub protokoły. Każde odpowiada za inną część problemu, a zebrane wszystkie razem kształtują internet jaki znamy.


Sama nazwa serwera w zasadzie nic nie mówi na temat jego fizycznej lokalizacji. Nawet końcówki krajowe, jak .pl, wcale nie znaczą, że serwer znajduje się w danym kraju, tym bardziej ogólne końcówki jak .com czy .org. Dużo więcej na temat lokalizacji mówią adresy IP. Kontynenty, kraje i regiony mają przyporządkowane pewne pule adresów (na tej stronie można sprawdzić przybliżoną lokalizację).

Nie da się przesłać pakietu przez sieć bez znajomości adresu docelowego, tak więc nazwy serwerów (tzw. domeny) pełnią głównie funkcję dekoracyjną, podobną do znaku towarowego; łatwiej skojarzyć coś z nazwą niż z ciągiem liczb. Gdyby nie domeny, nasze linki wyglądałyby bardziej tak: http://136.243.44.143/en/about – Fundacja nr 136.243.44.143 😉

Podobno u zarania internetu każdy komputer miał kopię pliku łączącego domeny z adresami. Szybko rosnąca liczba serwerów i domen zrodziła potrzebę bardziej skalowalnego rozwiązania. Obecnie funkcjonują specjalne serwery DNS, które, zapytane o domenę odsyłają adres IP. Tak więc zanim przeglądarka będzie mogła nawiązać połączenie z serwerem www, najpierw musi sprawdzić adres w takiej internetowej książce adresowej.

Wdrożenie DNS „niechcący” umożliwiło podpinanie wielu domen pod jeden adres. Z „wirtualnymi hostami” mamy do czynienia, gdy jeden serwer serwuje różne strony dla różnych domen. Dlatego próba podmiany w linku nazwy na IP może się nie udać – serwer nie będzie wiedział, o co nam chodzi.

Błąd odnajdywania adresu serwera

Warto zdać sobie sprawę, że awaria DNS-a to nie to samo, co brak internetu – być może z łącznością wszystko jest ok, tylko nie z naszą konfiguracją DNS (możemy to znaleźć w ustawieniach sieci systemu operacyjnego). Polecam pamiętać, że 9.9.9.9 to adres serwera DNS, który – jak dotąd – zawsze działał.


Co zatem znaczą końcówki w domenie, jeśli nie lokalizację serwera? Tutaj sprawa się komplikuje, gdyż serwerów DNS jest wiele. Jedne są przeznaczone dla nas – to te, które zaawansowani użytkownicy wpisują w ustawieniach. Inne są dla administratorów, aby mogli dodać rekordy wskazujące na ich stronę. To tam mogą zarejestrować swoje sub-domeny.

Na przykład UMCS ma swoją stronę główną na umcs.pl, ale materiały edukacyjne są na kampus.umcs.pl – subdomenie. Ma też kilka instancji BigBlueButton do zajęć zdalnych: 1.bbb.umcs.pl, 2.bbb.umcs.pl... Oraz wspólny system logowania – login.umcs.pl. Koło informatyczne ma wydzieloną subdomenę skni.umcs.pl, a z niej odchodzą git.skni.umcs.pl i vpn.skni.umcs.pl. Niektóre serwisy tworzą subdomeny dla każdego użytkownika. Zarządzanie tym wszystkim z centralnego, globalnego serwera DNS byłoby kłopotliwe i nieefektywne.

Wyżej w hierarchii stoją komercyjni rejestratorzy domen drugiego poziomu, a nad nimi właściciele końcówek krajowych i tematycznych (np. Polskim .pl zarządza NASK). Na samym szczycie stoją ogólnoświatowe hiperserwery root należące do ICANN.

Tak więc nasz DNS który ustawiamy w ustawieniach, jeżeli nie posiada żądanego rekordu w swojej bazie, przekazuje zapytanie do serwerów odpowiedzialnych za poszczególne strefy. Cały proces możemy prześledzić tutaj. Wszystko to dzieje się w mgnieniu oka 😉.

🔒 Bezpieczeństwo warstwy transportowej 🪪

W komunikacji ze stroną pośredniczy wiele urządzeń; infrastruktura internetowa składa się z routerów – urządzeń obecnych na „skrzyżowaniach”, kierujących ruchem sieciowym. Siłą rzeczy mają dostęp do bajtów, które kopiują z jednego portu do drugiego. Jest wiele punktów, w którym dane mogą zostać przechwycone, sfałszowane...

TLS (dawn. SSL) chroni poufność i integralność danych. Jest obecny na tych stronach, których linki zaczynają się od https://. Zanim zostanie wysłane jakiekolwiek zapytanie, przeglądarka i serwer wymieniają się kluczami kryptograficznymi. Następnie cała reszta komunikacji jest szyfrowana.

Co ważne, serwer uwierzytelnia się przed przeglądarką, prezentując jej certyfikat – plik zawierający m.in. domenę, klucz publiczny i podpis elektroniczny urzędu certyfikacji. To pozwala upewnić się przeglądarce, że rzeczywiście rozmawia ze stroną, za którą się podaje.

Certyfikat X.509 na stronie openstreetmap.org Certyfikat można podejrzeć na komputerze, klikając 🔒 na pasku adresu.

Przeglądarka weryfikuje podpis – sprawdza czy odpowiada podpisanym danym i czy zostały podpisane zaufanym przez zaufany urząd certyfikacji (CA). Przeglądarki mają wbudowaną listę takich urzędów. Oczywiście domena w certyfikacie musi odpowiadać domenie, z którą się łączymy.

Zasady działania podpisów elektronicznych nie będę tutaj wyjaśniał, poza tym, że wykorzystują kryptografię i są nierozerwalnie związane z podpisanym dokumentem. Nie ma podpisów in-blanco. Najmniejsza modyfikacja unieważnia podpis.

Jak strumienie się nie mieszają? 🌊

W jednej zakładce leci muzyka, w tym samym czasie odpalona gra sieciowa i jeszcze komunikator: jednocześnie, na jednym urządzeniu, przez jedno łącze. Jak to jest, że każdy bajt zawsze trafi do właściwej aplikacji? Dzieje się to za sprawą protokołu TCP.

TCP jest obsługiwany przez system operacyjny. Każdemu połączeniu nadaje indywidualny numer portu, dzieli strumień na pakiety, numeruje je i do każdego pakietu dokleja te dwie informacje. Tak przygotowane pakiety mogą być dowolnie przeplatane, nie wchodząc ze sobą w konflikt.

Ponadto, TCP każdorazowo wysyła potwierdzenie odbioru. Jeżeli takowego nie otrzyma w zadanym czasie, ponowi próbę wysłania. TCP umieszcza także na pakiecie sumę kontrolną do wykrywania błędów transmisji.

Dzielenie strumienia danych na pakiety nazywamy enkapsulacją, a ich przeplot – multiplexingiem.

Porty występują po obu stronach, ale u aplikacji nawiązującej połączenie (tzw. klienta) mają charakter tymczasowy, a u serwera port jest zawsze ten sam, w trybie oczekiwania na połączenia od wielu klientów jednocześnie. Różne usługi mają swoje standardowe numery portów, np. dla https jest to 443, a dla DNS – 53.

Schemat obrazujący enkapsulację i multiplexing protokołu TCP Schemat nie uwzględnia adresów IP. Są na innych etykietach. Edit: na rysunku jest błąd. Numery paczek są w odwrotnej kolejności

Serwer http Pythona

Jak pakiet dociera do celu? 🗺️

Tym sposobem dotarliśmy do fundamentów internetu – protokołu IP (Internet Protocol). Tutaj rzeczy robią się najbardziej skomplikowane. Niestety nie mamy w pełni autonomicznego systemu wyznaczania tras. Szkoda. 😒

Tak w ogóle, mamy teraz 2 typy adresów IP. Stary – IPv4 ma postać 159.69.138.33 – czterech liczb 0-255. Wszystkich ich możliwych kombinacji jest tylko 4 miliardy – za mało. Nowy typ – IPv6 ma postać 2a01:4f8:231:1ec7::60:1 – ośmiu liczb 0-65535, ale zapisanych w systemie szesnastkowym (tam gdzie zera, można skrótowo umieścić :: ale tylko w jednym miejscu).

Wciąż używa się starego IP, choć nowe liczy sobie prawie 30 lat, a liczba adresów już dawno się wyczerpała. Obecnie za jednym adresem upycha się kilka osób. Tak działają choćby domowe routery. W lokalnej sieci urządzenia mają unikalne adresy, ale z internetu wszystkie połączenia mają ten sam adres – adres routera. Dlatego gdy ktoś w sieci coś przeskrobie, banem obrywają wszyscy. Odpowiedzialność zbiorowa to relikt przeszłości, dlatego powinniśmy już dawno przejść na IPv6.


Kto tak w ogóle przydziela adresy? W małych sieciach adresy przydzielają się same, w większych – administrator musi skonfigurować pule adresów na routerach – albo nie będzie między nimi łączności. Potrzebna jest tu umiejętność jak najlepszego wykorzystania otrzymanej puli, ponieważ nie można podzielić jej w dowolny sposób.

Istnieje kilka algorytmów wyznaczania tras. Jeden z najstarszych – RIP – co 30 sekund rozgłasza po sieci tablicę routingu, tak że routery wiedzą, gdzie kierować pakiety pod wskazany adres. Trasowanie między zorganizowanymi sieciami lokalnymi odbywa się za pomocą algorytmu BGP, który spaja cały internet.

Na tak niskim poziomie trudno o zmiany i ulepszenia, ponieważ trzeba by było wymieniać działające od lat urządzenia sieciowe na całym świecie. Nic nie stoi jednak na przeszkodzie, aby prowadzić badania i eksperymentować z nowymi rozwiązaniami. W internecie (również tym alternatywnym) funkcjonują nakładkowe sieci, które kierują się innymi zasadami. Niestety są zależne od zwykłego internetu, ale zawierają wiele ulepszeń od których „zwykły internet” mógłby czerpać inspiracje.

Weźmy za przykład sieć Yggdrasil: – Urządzenie ma stały, losowy adres IPv6, niezależny ani od lokalizacji ani połączonych węzłów. – Każde inne urządzenie może się z nim połączyć – nie trzeba kupować publicznego adresu IP aby udostępnić stronę z własnego komputera. – Cała komunikacja jest szyfrowana na poziomie sieci (por. TLS, który szyfruje tylko indywidualne porty dla aplikacji, które to obsługują). – Sieć wykorzystuje własny, w pełni autonomiczny algorytm routingu. Jedyne, co muszą wybrać użytkownicy, to swoich sąsiadów.

Z wad – DNS jeszcze się tam nie rozwinął. Większość stron nie ma domen, sam adres. Choć i w tym obszarze prowadzone są badania.

Rozwiń

  1. Przeglądarka zgłasza systemowi operacyjnemu chęć połączenia się z serwerem example.com, port 443.
  2. System operacyjny wysyła zapytanie o domenę example.com do skonfigurowanego serwera DNS (9.9.9.9 aka Quad9).
  3. Zapytanie dociera do serwera DNS. Szuka w bazie danych rekordu dla example.com, ale go nie znajduje.
  4. Quad9 rozpoczyna rekurencyjne rozwiązywanie: wysyła zapytanie o domenę example.com do globalnego serwera DNS (e.root-servers.net)
  5. Globalny DNS nie zajmuje się domenami 2 poziomu i przekierowuje Quad9 do serwera odpowiedzialnego za .com (a.gtld-servers.net)
  6. Quad9 kieruje zapytanie do a.gtld-servers.net o example.com.
  7. a.gtld-servers.net wyciąga ze swojej bazy rekord od example.com. Jest w nim przekierowanie do DNS-a administratora example.com (b.iana-servers.net). Przekierowuje tam Quad9.
  8. Quad9 kieruje się do b.iana-servers.net z tym samym zapytaniem.
  9. b.iana-servers.net zwraca adres IP domeny example.com (93.184.215.14).
  10. Quad9 zapamiętuje rekordy aby na przyszłość skrócić czas oczekiwania. Odsyła wynik komputerowi.
  11. Komputer nawiązuje połączenie TCP z 93.184.215.14 (example.com) na porcie 443 z portu 10598 (SYN).
  12. example.com potwierdza połączenie (SYN ACK).
  13. Komputer odsyła potwierdzenie przyjęcia potwierdzenia (ACK ACK).
  14. System operacyjny przekazuje kontrolę nad połączeniem przeglądarce.
  15. Przeglądarka rozpoczyna sesję TLS.
  16. Serwer wysyła swój certyfikat (dla example.com, podpisany przez DigiCert Inc.)
  17. Przeglądarka weryfikuje podpis, stwierdza, że należy do zaufanego CA i kontynuuje nawiązywanie bezpiecznego połączenia.
  18. Przeglądarka i serwer ustalają klucz sesji.
  19. Przeglądarka wysyła zapytanie o stronę https://example.com
  20. Serwer odsyła plik HTML i zamyka połączenie.
  21. Przeglądarka odbiera plik i postanawia załadować ikonę favicon.ico (https://example.com/favicon.ico).
  22. Przeglądarka nawiązuje kolejne połączenie z example.com i wysyła zapytanie.
  23. Serwer stwierdza, że nie ma u siebie takiego pliku i odsyła błąd 404, ponownie zamykając połączenie.
  24. Przeglądarka przechodzi w stan gotowości.

Napisałem dla własnej satysfakcji. Dużo, prawda? Nie wspomniałem tu o podziale na pakiety i routingu! 😆

Właśnie dlatego dokonano podziału sieci na warstwy, które można rozpatrywać niezależnie.

Zagrożenia 💀🌋

Jedne ujawniają się przy źle zaprojektowanych, wdrożonych lub skonfigurowanych systemach, inne wykorzystują ludzką niewiedzę czy naiwność. W internecie jest wiele zagrożeń różnego rodzaju.

Wiedza, którą tutaj przedstawiłem ma nie tylko zaspokoić waszą ciekawość – posłuży za podstawę do zrozumienia możliwych ataków w przyszłych wpisach. Przyjrzymy się różnym próbom skłonienia użytkownika do odwiedzenia fałszywej strony, gdzie poda swoje dane logowania i nauczymy się odpowiednio zabezpieczyć swoją przeglądarkę i konfigurację sieci. O ile najpierw nie opublikuję filmu, oczywiście.

Do zobaczenia! 👋