View on GitHub

Methodics of Linux Network Protocols

Practical materials for learning TCP/IP and its implementation on Linux

Курс, разработанный при поддержке компании «BaseALT СПО», читает Георгий Курячий, ведущий разработчик компании, член ALT Linux Team, преподаватель ВМК МГУ.

Курс читается в качестве основного курса 6ого семестра на кафедре АСВК, однако команда очень приветствует и поддерживает внешних вольных слушателей. Некоторые теоретические знания, описываемые или упоминаемые в курсе, основываются на информации из пройденного студентами в 5ом семетре курса «Введение в сети».

Каждая лекция сопровождается домашним заданием, выполняемым на одной или нескольких виртуальных машинах. В домашнее задание входит настройка некоторой топологии сети, её конфигурация и сбор этих данных в отчёт специального вида с помощью встроенных в виртуальные машины утилит.

Изобретение сетевых протоколов

Временно отвлечемся от уже полученных знаний о сетевых протоколах и постараемся самостоятельно понять, как формируются уровни при обеспечении связи в интернете. Общая цель, которую мы преследуем — передача данных с любого устройства на любое, используя надлежащую дисциплину этой передачи.

Среда передачи данных

Любая передача данных начинается с того, где эти данные передаются. На этом уровне нет никакой абстракции, нет особых интерпретации передаваемого: просто данные, которые просто передаются. Поэтому основная задача уровня это определение среды передачи данных, как носителя информации между компьютерами. От определения носителя зависит множество будущих решений относительно передачи, при этом сама среда может быть абсолютно любой (к примеру, существует официально утверждённый интернет-протокол (IP) передачи данных посредством почтовых голубей).

Каждый уровень разделяется на два слоя. В рамках слоя решается отдельная подзадача. Первый слой имеет смысл некоторого унификатора взаимодействия нашего уровня с нижележащим. Так, например, для следующего уровня уже будут известны различные среды передачи данных, и унификатор будет, в общем случае, преобразовывать различные передаваемые в средах сигналы в единый формат данных. Второй слой использует унифицированные данные и использует их для решения непосредственной задачи уровня. В дальнейшем мы будем называть их слоем унификации и слоем систематизации, а из подзадачи — задачами унификации и систематизации соответственно.

Вернёмся к уровню среды передачи данных. Какие задачи ставятся на нём?

Попробуем описать уровень и его слои на примере бумажных записок. Весь уровень описывает пути, по которым можно передавать записки: можно везти по дороге, можно запускать по небу на катапульте, можно сплавлять по реке. Слой унификации описывает параметры каждого пути. Для реки это скорость течения, ширина и глубина русла, вес и плавучесть посылки с запиской. Для дороги — её ширина, виды автомобилей и пешеходов, которые по ней ходят и т.д. Слой систематизации поверх всех этих описаний будет задавать правила передачи: «Записки передаём в плавучих коробках на воде, в деревянных ящиках по земле. Для безопасности перед отправкой пишем вторую такую же записку и отправляем сразу две. Треснувшие коробки и ящики не принимаем.»

Подключение к среде передачи данных

После определения среды передачи данных необходимо решить вопрос подключения к среде со стороны компьютера. На этом уровне уже есть зависимость от выбора на предыдущем (например, при фиксации для носителя стратегии передачи данных в виде коммутации пакетов необходимо обеспечить возможность отправки тех самых пакетов).

Унификация здесь заключается в определении способа передачи и приёма данных на основе возможностей носителя. Например, для наших записок вне зависимости от того, каким путём их будут отправлять мы закрепляем правило: «Записки пишем на листах бумаги, ламинируем для защиты».

Систематизация будет определять дисциплину использования среды, к которой произведено подключение. «Записки отправляются по очереди, станция отправки подписывает записку во время её принятия» — эти правила определяются здесь.

Построение сети передачи данных

На базе первых двух уровней, вообще говоря, уже можно обеспечить передачу данных в сети: в рамках локальной сети абонентов можно отличать по идентификаторам устройств (подписям станций отправления). Однако для использования множества сред и множества локальных объединений в едином пространстве приёма-передачи данных необходимо решить вопрос объединения сред в сеть передачи данных.

В каждой локальной сети может быть закреплена своя дисциплина передачи и, что более важно, свой способ локального определения абонентов. Для уровня, обеспецивающего глобальную связность, задачей унификации является задание единого способа идентификации всех абонентов сети.

Задача систематизации уровня это обеспечение связности полученной сети на базе единой схемы идентификации. Здесь возникает необходимость определения положения абонентов в сети, а также определения пути следования данных. Во времена зарождения интернета (ARPANET) абонентов было мало, и они были статичны (интернет был, по сути, локальной сетью нескольких университетов), поэтому всех можно было просто явно описать в файлах настройки маршрутов. В наше время интернет насчитывает миллиарды абонентов сети, при этом они постоянно пропадают и появляются, поэтому задачу связности необходимо решать динамически.

Работа с потоками данных

После построения сети и обеспечения передачи данных между пользователями требуется проверить корректность передачи: все ли сообщения доходят, точно ли мы передаём то, что хотели передавать и туда, куда хотели передавать (до этого решался вопрос «Как?», а не «Что?»).

Также с точки зрения предыдущего уровня различные информационные потоки, исходящие от одного абонента, неразличимы, поскольку представляют собой просто наборы данных (пакетов / сообщений канала / …) для передачи. При этом сами потоки могут быть, вообще говоря, даже не связаны друг с другом.

Соответственно возникает задача контроля потоков данных. Необходимо проверять корректность пересылки (отправляем то, что приняли, или нет), её рациональность (или доверие уровню среды в отношении корректности передачи), обеспечивать безошибочность и однозначную кодировку / декодировку данных, их последовательность и т.д..

Задача унификации это обеспечение цельности передаваемых данных и надёжности передачи. На этом слое определяются потоки данных, их свойства. Дальнейшее взаимодействие абонентов определяется уже не передачей пакетов, а работой с потоками. Цельность передачи включает в себя обработку запросов на подтверждение получения данных, контроль потерь или репликации данных.

Непосредственно слой систематизации занимается различием потоков и управлением ими. Относительно управления потоками решается задача самоорганизации этих потоков для предотвращения перегрузок сети и вообще возможности передачи (например, контроль скорости передачи относительно пропускной способности сети на всём пути данных).

Работа с данными

Только после решения предыдущих вопросов взаимодействия устройств в сети можно задумываться, непосредственно, о содержимом передаваемых данных.

Слой унификации занимается доставкой потока данных до интерпретатора этих данных. Эту задачу в большей степени решает операционная система. Задача систематизации заключается в интерпретации данных в зависимости от их типа, принадлежности определённому потоку и т.д.

Независимость уровней и инкапсуляция пакетов

Получившаяся система описывает наш собственный формально заданный стек протоколов взаимодействия объектов в сети.

На первый взгляд кажется, что вся система неразрывна, и её представление в формате стека это лишь условное деление по решаемых проблемам. Действительно, решения относительно организации работы каждого следующего уровня строятся на основе решений предыдущих уровней. Однако уровни сами по себе решают независимые задачи, вся связь обеспечивается правильным согласованием интерфейсов: в каком формате один уровень отдаёт, а другой получает данные. При этом каждый из них может действовать самостоятельно. Самый простой пример здесь — интерпретатор, который может быть никак не связан с сетью и просто обрабатывать данные с STDIN и отдавать их на STDOUT. Просто работа с ним ведётся в таком формате, который будет понятен низлежащему уровню работы с потоками данных (а STDIN и STDOUT чем не потоки).

Отдельного внимания также заслуживает работа с пакетами. Поскольку принцип коммутации пакетов входит в пятерку ключевых принципов построения интернета, вся работа строится на особой обработке данных в удобном для пакетов формате. Здесь возникает понятие инкапсуляции пакетов. При переходе данных с верхнего (пятого) уровня к нижнему (первому), к данным добавляется метаинформация, необходимая для передачи данных, но не являющаяся полезной нагрузкой самого сообщения. Так, например, на уровне потоков данных к каждому блоку информации приписывается его номер в последовательном сообщении, на уровне сети к каждому пронумерованному пакету добавляются идентификационные данные получателя и отправителя, далее добавляются данные по требованиям среды передачи данных, а на уровне самой передачи добавляются преамбулы начала-конца передачи, происходит защита данных от ошибок и т.д.

Решение задач построения сети

При описании классического TCP/IP из пяти уровней построенного нами стека принято выделять лишь четыре. Изначально в работах Таттенбаума и Столлингза описывались все пять уровней:

Однако на практике очень много взаимодействий смешивают первые два уровня. Примером такого смешанного взаимодействия уровней является Ethernet. Под одним названием и одним протоколом заключается, вообще говоря, множество моделей с разной пропускной способностью. Для взаимодействия компьютеров путём Ethernet-соединения им необходимо изначально договориться о скорости передачи данных по каналам. Здесь и происходит слияние уровней: договорённость должна произойти между компьютерами (интерфейсный уровень), а скорость передачи данных описывается и настраивается для среды (физический уровень).

Вообще говоря, стек протоколов TCP/IP это не единственный способ разделения взаимодействия объектов сети на независимые блоки. Стандартом стека протоколов является модель ISO/OSI, описывающая семь уровней (physical, data link, network, transport, session, presentation, application layers). Часть международного сообщества негативно относится к данной модели. По их мнению ISO/OSI неразумно разбила транспортный уровень на три отдельных. Однако сейчас всё больше задач организации сетевого взаимодействия указывают на необходимость введения в TCP/IP уровня презентации данных. На нём будут реализованы независимые блоки шифрования и работа с кодировками данных перед формированием потока.

В действительности, даже эти жёсткие схемы разделения и распределения задач и информации по уровням не описывают весь спектр задач, который приходится решать в процессе конфигурации и настройки сети. Здесь нельзя не упомянуть программно-конфигурируемые сети, в которых решается проблема перегрузок и контроля связности сети. Отдельно можно обсуждать работу сетевых инженеров и провайдеров, которые оперируют сетями с миллионами пользователей. Здесь, на удивление, те же самые протоколы начинают вести себя совершенно непредсказуемо.

Подготовка к работе на курсе

Данный курс предполагает выполнение домашних заданий на виртуальной машине. В качестве менеджера виртуальных машин используется VirtualBox, каждая лекция будет сопровождаться образом виртуального диска, на основе которого будет создана основная система, на её основе будут создаваться копии для работы.

Домашнее задание:

  1. Установить VirtualBox.
  2. Скачать образ виртуальной машины (Внимание: Образ может меняться. Рекомендуется перед каждым использованием проверять и обновлять версию образа)
  3. Импортировать его согласно инструкции
  4. Запустить машину:
    • залогиниться root-ом
    • сделать скриншот экрана («Вид → Сделать снимок экрана»)
  5. Для возможности получения оценки по С/К надо на него зарегистрироваться:
    • Прислать этот скриншот во вложении на email uneexlectures@cs.msu.ru
    • В теме письма обязательно должно быть «слово» LinuxNetwork2027 (почту разбирают роботы, не ошибитесь!)
    • Необходимо указать:
      • ФИО
      • группу (и факультет/курс, если вы не с ВМК)