9.6. Пакети та маршрутизація¶
IP-адреса вказує, кому призначено повідомлення. Механізм, що фактично доставляє його, називається маршрутизацією, і це покроковий процес, за допомогою якого пакет подорожує з локальної мережі відправника до локальної мережі отримувача, можливо дуже далеко.
9.6.1. Коротко про пакет¶
Пакет – це одиниця роботи мережевого рівня IP: фрагмент байтів із невеликим заголовком та корисним навантаженням. Заголовок має два поля, важливі для маршрутизації:
IP-адреса джерела (звідки надійшов пакет).
IP-адреса призначення (куди він прямує).
Корисне навантаження – це те, що транспортний рівень попросив мережевий рівень доставити. Заголовок пакета також містить лічильник часу існування, контрольну суму заголовка та кілька прапорів керування. Жодне з них не торкається безпосередньо код Python камери.
Пакети не обіцяють нічого більшого, ніж «ми спробували» – вони можуть бути втрачені, продубльовані або доставлені не по порядку. Надійність і впорядкованість – це проблеми, які вирішує транспортний рівень вище; мережевий рівень лише намагається пересилати кожен пакет до пункту призначення.
9.6.2. Перехід за переходом¶
Пакет залишає камеру і надходить до першого пристрою, що не знаходиться в локальному сегменті камери: шлюзу за замовчуванням. (На попередній сторінці згадувалося, що DHCP передає камері адресу шлюзу під час встановлення мережі.) Цей пристрій є маршрутизатором – коробкою, завдання якої – отримувати пакети, дивитися на їх пункт призначення та пересилати їх далі.
Пакет від камери до пункту призначення переходить між маршрутизаторами, кожен з яких на крок ближчий.¶
Маршрутизатор має таблицю маршрутизації – список правил виду «для пунктів призначення, що відповідають цьому шаблону, відправити пакет через цей інтерфейс». Для пунктів призначення в тій самій мережі, що й камера, запис каже «відправити назад по кабелю, з якого він прийшов». Для пунктів призначення в ширшому інтернеті запис каже «відправити на вищестоящий маршрутизатор». Для відомих шаблонів пунктів призначення (корпоративна VPN, мережа конкретного бізнес-партнера, супутниковий канал) маршрутизатор може мати більш конкретний запис, що перевизначає стандартний.
Вищестоящий маршрутизатор робить те саме. І наступний. І ще наступний. Кожен перехід має однакову форму: отримати пакет, знайти пункт призначення в таблиці, відправити через правильний інтерфейс. Зрештою пакет надходить до маршрутизатора, який знаходиться в тому самому локальному сегменті, що й цільова IP. Цей маршрутизатор виконує фінальний перехід, пункт призначення отримує пакет, і подорож завершена.
9.6.3. Кінцеві точки не знають маршруту¶
Камера, що надсилає пакет на віддалений сервер, не знає, як пакет туди потрапить. Вона знає лише IP-адресу призначення та адресу власного шлюзу за замовчуванням. Все між ними – які маршрутизатори, які волокна, які підводні кабелі – вирішують маршрутизатори по дорозі, ґрунтуючись на власних таблицях. Самі маршрутизатори знають лише своїх безпосередніх сусідів та приблизний напрямок до поширених пунктів призначення; жоден окремий пристрій в інтернеті не має повної карти його.
Ця децентралізація – ось чому мережа продовжує працювати, коли окремі шляхи виходять з ладу. Обрив кабелю десь посередині стає подією перемаршрутизації для кількох маршрутизаторів; кінцеві точки цього навіть не помічають. Також саме тому пакет від камери в Токіо до сервера в Дубліні може успішно дійти, не знаючи жодна зі сторін, які країни знаходяться між ними.
9.6.4. Що це означає для Python-скрипта¶
Завдання камери на мережевому рівні зводиться до:
Мати IP-адресу.
Знати адресу шлюзу за замовчуванням (DHCP заповнює це автоматично).
Передавати вихідні пакети, адресовані будь-якій IP, цьому шлюзу та довіряти решті шляху.
Скрипт ніколи не вибирає маршрут, ніколи не вказує проміжний перехід і ніколи не бачить маршрутизатори посередині. Він записує IP-адресу призначення в пакет, а мережевий рівень бере на себе решту. Для Python-скрипта вся маршрутизація – лише властивість мережі, до якої приєдналася камера: «шлюз відправляє пакети кудись корисним для мене».
Транспортний рівень, що йде далі, припускає, що маршрутизація просто працює, і будує на цьому надійність, упорядкованість і адресацію між програмами.