9.2. Protokoły warstwowe¶
Wysłanie ramki z kamery do serwera w innym mieście oznacza rozwiązanie kilku problemów naraz. Sygnał elektryczny musi pokonać pierwszy przewód. Bajty na tym przewodzie muszą znaleźć drogę przez lokalny przełącznik. Sieć lokalna musi przekazać wiadomość temu, co znajduje się między nią a resztą internetu. Pakiety, które przetrwają podróż, muszą zostać złożone z powrotem we właściwej kolejności. Odbiorca musi wiedzieć, któremu ze swoich programów je przekazać. A same bajty muszą znaczyć coś, co obie strony rozumieją tak samo.
Próba rozwiązania tego wszystkiego w jednym bloku kodu byłaby nie do opanowania. Standardowa odpowiedź to podzielenie zadania na warstwy. Każda warstwa rozwiązuje jeden dobrze zdefiniowany problem i udostępnia prostą usługę warstwie powyżej. Program rozmawia tylko z warstwą bezpośrednio pod nim; warstwy znajdujące się poniżej są niewidoczne.
Każda warstwa stosu sieciowego rozwiązuje jeden problem i przekazuje czystą abstrakcję do następnej.¶
9.2.1. Pięć warstw¶
Poniższe nazwy to te, których używa reszta tego rozdziału. Pochodzą one ze standardowego modelu, wokół którego projektowano sieci. Dokładne granice między warstwami są czasem niewyraźne, ale rola, którą pełni każda z nich, jest stała.
Warstwa fizyczna. Przenosi bity między dwoma urządzeniami na tym samym przewodzie lub fali radiowej. Poziomy napięcia, impulsy świetlne, modulacja RF. Zadaniem kamery jest tu głównie podłączenie właściwego kabla lub dołączenie do właściwej sieci bezprzewodowej; resztę robi sprzęt.
Warstwa łącza danych. Przenosi ramki (małe porcje bajtów) między dwoma urządzeniami współdzielącymi lokalny segment. Dodaje adresy sprzętowe, aby każdą ramkę można było skierować do jednego konkretnego sąsiada. Ethernet i Wi-Fi to dwie technologie łącza, z którymi kamera spotyka się w praktyce.
Warstwa sieciowa. Przenosi pakiety między dowolnymi dwoma urządzeniami w internecie, a nie tylko w tym samym lokalnym segmencie. Dodaje adres na poziomie oprogramowania, który identyfikuje host niezależnie od tego, na którym kablu się znajduje, oraz mechanizm trasowania (routingu), który przeskakuje pakiet z jednego lokalnego segmentu do następnego, aż dotrze on do celu. To pierwsza warstwa, na której kod Python kamery zaczyna mieć coś do powiedzenia.
Warstwa transportowa. Znajduje się nad pakietami i oferuje dostarczanie danych między programami na dwóch hostach, a nie tylko między samymi hostami. Powszechne są dwa warianty: jeden dostarcza połączony, uporządkowany strumień bajtów (koń pociągowy dla większości ruchu), drugi dostarcza samodzielne komunikaty, które podróżują niezależnie od siebie (używany, gdy niski narzut liczy się bardziej niż gwarancje). Dodaje numery portów, aby wiele programów na tym samym hoście mogło prowadzić rozmowy równolegle.
Warstwa aplikacji. Wszystko ponad transportem: protokoły, które nadają bajtom znaczenie. Tu mieszkają te, którymi posługuje się przeglądarka internetowa do ładowania stron – oraz te stojące za niemal każdą inną usługą internetową, z której czytelnik korzysta już codziennie. Samouczek omawia transport dogłębnie; ta warstwa dostaje własny, osobny rozdział kontynuujący temat.
9.2.2. Jak warstwy układają się w czasie działania¶
Gdy kamera wysyła bajty przez sieć, każda warstwa dodaje przed danymi własny nagłówek, niczym kopertę zagnieżdżoną w kolejnej kopercie:
Bajty aplikacji trafiają tam jako pierwsze.
Warstwa transportowa owija je małym nagłówkiem mówiącym, do którego programu należą (numer portu).
Warstwa sieciowa owija to nagłówkiem mówiącym, do którego hosta są przeznaczone (adres na poziomie oprogramowania).
Warstwa łącza danych owija to nagłówkiem mówiącym, któremu urządzeniu w lokalnym segmencie przekazać je dalej (adres sprzętowy).
Warstwa fizyczna zamienia cały pakunek w bity na przewodzie.
Po drugiej stronie każda warstwa zdejmuje własny nagłówek i przekazuje resztę w górę. Odbierająca aplikacja odzyskuje swoje bajty, nieświadoma, że warstwy sieciowa, łącza danych i fizyczna kiedykolwiek istniały.
To zagnieżdżanie jest powodem, dla którego samouczek prowadzi od dołu do góry. Zrozumienie, co robi warstwa pod spodem, sprawia, że warstwa powyżej wydaje się nieunikniona. Dwie dolne warstwy są omówione na jednej stronie każda, ponieważ z poziomu Pythona nie ma w nich prawie nic do skonfigurowania. Od warstwy sieciowej w górę tempo zwalnia, w miarę jak rola Pythona rośnie.