W serwisie GitHub pojawił się opis wszystkiego co dzieje się "w naszym komputerze", gdy otwieramy stronę wyszukiwarki Google. Ta banalna czynność musi być rozłożona na konkretne procesy i procedury.
Programiści zadali sobie trud by opisać wszystkie poszczególne kroki, które musi wykonać maszyna.
Przyciskając klawisz "Enter" zamykasz obwód elektryczny. Układ logiczny klawiatury nieustannie skanuje stan każdego klawisza. Kiedy wciśniesz "enter" kod potwierdzający tę informację jest przesyłany do komputera - za pomocą tradycyjnego łącza USB lub Bluetooth.
- Wygenerowany kod oznaczający wciśnięcie klawisza "Enter" (w tym wypadku jest to kod 13) jest zapamiętany w specjalnym obwodzie klawiatury zwanym "endpoint" - Kontroler USB (w komputerze) nasłuchuje tego obwodu co dziesięć milisekund - Za pomocą USB SIE (Serial Interface Engine) impuls jest przekształcany na jeden lub więcej pakietów - Pakiety z prędkością 1,5Mb/s (maksymalną dla urządzeń peryferyjnych HID) trafiają do kontrolera USB w komputerze, gdzie są interpretowane za pomocą sterownika - Wartość kodu wygenerowanego przez klawiaturę jest przekazywana do systemu - wtedy wie on, że nacisnąłeś "Enter"
Wciśnięcie klawisza powoduje niewielką zmianę pola elektrostatycznego. Skutkiem jest spadek napięcia w warstwie przewodzącej ekranu, co jest przechwytywane przez jego kontroler. Sprawdza on też dokładną pozycję, w której doszło do zmiany pola. Następnie system operacyjny powiadamia aplikację o wciśnięciu któregoś z elementów graficznego interfejsu użytkownik (czyli wyświetlonego na ekranie klawisza "Enter").
Informacja o wciśnięciu klawisza "Enter" trafia do kbhid.sys, który przekształca impuls przesłany z klawiatury na odpowiedni scancode. W tym wypadku jest to kod VK_RETURN (0x0D) . Następnie za pomocą KBDCLASS.sys kod przesyłany jest do Win32K.sys - jednego z najważniejszych "zarządców" systemu.
Win32K.sys sprawdza za pomocą polecenia GetForegroundWindow(), którego okna dotyczy informacja o wciśniętym klawiszu. Za pomocą polecenia SendMessage(hWnd, WM_KEYDOWN, VK_RETURN, lParam) system otrzymuje dokładną informację: który klawisz naciśnięto, czy naciśnięcie powtórzono, czy jednocześnie były też wciśnięte inne klawisze.
Scancodes Fot. Google/Julian J. Kennedy, Douglas K. Morris, Michael A. Morris
Fot. Google/Julian J. Kennedy, Douglas K. Morris, Michael A. Morris
Z kolei aplikacja sprawdza za stan WindowProc, by wiedzieć, że informacja o wciśnięciu klawisza dotarła w odpowiednie miejsce.
Kiedy wpisujemy samo "Google" przeglądarka wyszuka adresy związane z tym słowem, kiedy wpiszemy "Google.com" przeglądarka otworzy stronę. Wykonuje przy tym następujące czynności:
- najpierw sprawdza czy adres znajduje się w pamięci cache - jeśli nie za pomocą specjalnej biblioteki (najczęściej gethostbyname) zaczyna wyszukiwać - gethostbyname komunikuje się z serwerem DNS - Serwer DNS szuka docelowego adresu - On też najpierw sprawdza najpierw swój cache. Jeśli znajdzie w nim adres Google odpowiada komunikatem: DNS.server.ip.address = dns:mac:address
Działanie serwera DNS jest bardziej skomplikowane, gdyż wykorzystuje on protokół ARP (Address Resolution Protocol). Służy on mapowaniu logicznemu adresów warstwy sieciowej na fizyczne adresy warstwy łącza danych. Zanim nasza przeglądarka otworzy stronę Google urządzenia muszą przekazać sobie konkretne informacje takie jak nasz adres MAC, nasze IP oraz adres MAC i IP adresu docelowego:
Sender MAC: interface:mac:address:here
Sender IP: interface.ip.goes.here
Target MAC: 255.255.255.255 (Broadcast)
Target IP: target.ip.goes.here
Kiedy już urządzenia się skomunikują musi nastąpić otwarcie połączenia na porcie 80 (lub 443 w przypadku bezpiecznego protokołu HTTPS). Wykorzystywany jest do tego protokół TCP (Transmission Control Protocol, strumieniowy protokół komunikacyjny). Polecenie AF_INET and SOCK_STREAM otwiera komunikację pomiędzy naszą maszyną, a adresem docelowym.
Z przeglądarki płynie następujące zapytanie:
GET / HTTP/1.1 Host: google.com [other headers]
zakończone pustą linią. To znak dla serwera, że żądanie wysłane z przeglądarki jest kompletne. Serwer odpowiada poleceniem:
200 OK [response headers]
Wtedy następuje ładowanie strony Google. A konkretnie jej poszczególnych elementów: kodu HTML (mówi o tym co ma się wyświetlać) oraz CSS (decyduje o tym w jaki sposób ma się to wyświetlać).
Warstwy strony Fot. addons.mozilla.org
Fot. addons.mozilla.org
Ostatnim etapem działań przeglądarki jest zrenderowanie strony Google. A ten proces również jest wieloetapowy. Najpierw trzeba określić wielkość strony, położenie konkretnych elementów, marginesów, ramek. Przeglądarka renderuje poszczególne elementy strony - używa do tego procesora lub układu graficznego. Decyduje też, które z warstw są widoczne dla użytkownika, rozkłada na nich poszczególne elementy strony.
I to już w zasadzie wszystko. Jeśli na stronie Google jest akurat animowany doodle przeglądarka musi jeszcze załadować dodatkowy JavaScript.