9.2. Шарувата архітектура протоколів¶
Надіслати кадр з камери на сервер в іншому місті означає одночасно вирішити кілька проблем. Електричний сигнал має пройти першим дротом. Байти на цьому дроті мають знайти шлях через локальний комутатор. Локальна мережа має передати повідомлення до того, що знаходиться між нею і рештою інтернету. Пакети, що пережили подорож, мають бути зібрані в правильному порядку. Отримувач має знати, якій зі своїх програм їх передати. І самі байти мають щось означати – щось, з чим погоджуються обидва кінці.
Намагання вирішити все це в одному блоці коду було б нездійсненним. Стандартна відповідь – розбити завдання на шари. Кожен шар вирішує одну чітко визначену проблему та надає простий сервіс шару вище. Програма завжди звертається лише до безпосередньо нижнього шару; шари під ним невидимі.
Кожен шар мережевого стеку вирішує одну проблему і передає чисту абстракцію наступному.¶
9.2.1. П’ять шарів¶
Назви нижче використовуються в решті цього розділу. Вони походять зі стандартної моделі, навколо якої проектувалися мережі. Точні межі між шарами іноді розмиті, але роль кожного з них стабільна.
Фізичний шар. Передає біти між двома пристроями на одному дроті або радіоканалі. Рівні напруги, світлові імпульси, радіочастотна модуляція. Завдання камери тут – переважно підключити правильний кабель або приєднатися до правильної бездротової мережі; решту робить мікросхема.
Канальний шар. Передає кадри (невеликі фрагменти байтів) між двома пристроями, що мають спільний локальний сегмент. Додає апаратні адреси, щоб кожен кадр міг бути спрямований до конкретного сусіда. Ethernet та Wi-Fi – це дві канальні технології, з якими камера стикається на практиці.
Мережевий шар. Передає пакети між будь-якими двома пристроями в інтернеті, а не лише в одному локальному сегменті. Додає програмну адресу, що ідентифікує хост незалежно від того, до якого кабелю він підключений, та механізм маршрутизації, який пересилає пакет від одного локального сегменту до наступного, поки він не прибуде. Це перший шар, де код Python на камері починає мати значення.
Транспортний шар. Розташований поверх пакетів і забезпечує доставку між програмами на двох хостах, а не лише між самими хостами. Поширені два варіанти: один доставляє підключений впорядкований потік байтів (основний для більшості трафіку), інший доставляє самодостатні повідомлення, що подорожують незалежно одне від одного (використовується, коли низькі накладні витрати важливіші за гарантії). Додає номери портів, щоб кілька програм на одному хості могли вести розмови паралельно.
Прикладний шар. Все, що знаходиться вище транспортного: протоколи, які надають байтам значення. Тут живуть протоколи, якими користується веббраузер для завантаження сторінок, – та протоколи майже кожного іншого інтернет-сервісу, яким читач вже користується щодня. Навчальний посібник детально розглядає транспортний рівень; цей шар отримує окремий наступний розділ.
9.2.2. Як шари складаються під час виконання¶
Коли камера надсилає байти мережею, кожен шар додає власний заголовок перед даними – ніби вкладаючи конверт в інший конверт:
Спочатку йдуть байти застосунку.
Транспортний шар огортає їх невеликим заголовком, що вказує, якій програмі вони належать (номер порту).
Мережевий шар огортає це заголовком, що вказує, якому хосту вони призначені (програмна адреса).
Канальний шар огортає це заголовком, що вказує, якому пристрою в локальному сегменті їх передати далі (апаратна адреса).
Фізичний шар перетворює весь пакет на біти на дроті.
На іншому кінці кожен шар знімає власний заголовок і передає решту вище. Застосунок-отримувач отримує свої байти назад, не підозрюючи, що мережевий, канальний і фізичний шари взагалі існували.
Саме через це вкладення навчальний посібник рухається знизу вгору. Розуміння того, що робить нижчий шар, робить вищий шар очевидним. Перші два шари розглядаються на одній сторінці кожен, оскільки з Python майже нема що налаштовувати. Починаючи з мережевого шару і вище, темп сповільнюється в міру зростання ролі Python.