Skip to content

Latest commit

 

History

History
435 lines (338 loc) · 38.5 KB

lecture02-layer2.md

File metadata and controls

435 lines (338 loc) · 38.5 KB
title lang figureTitle figPrefix
Лекция 2. Протоколы канального уровня
ru
Рисунок
рис.

Канальный уровень (L2, link layer) занимает особое место в иерархии сетевого взаимодействия: он согласует физические аспекты передачи с логическим представлением устройства для системы и программ. У канального уровня нет четких границ: он тесно интегрирован с физическим уровнем ниже, а с другой стороны, выше канального уровня действуют протоколы, которые не относящиеся к сетевому уровню (например, ARP).

Мы будем рассматривать в основном вопросы логического характера: какие байты передаются и для чего, а не как они кодируются в среде передачи. Мы также ограничимся популярнейшей реализацией — Ethernet.

Вышестоящий логический подуровень называется LLC (logical-link control) и реализуется драйверами и ОС; подуровень для доступа к среде передачи называется MAC (media access control) и реализован в прошивке сетевой карты.

Канальный уровень действует в локальных сетях (local area network, LAN), то есть между устройствами, соединенными так, что могут передавать данные друг другу напрямую. Такую сеть называют еще L2-сегментом. В плане реализации это сети квартир, служебных и офисных помещений (но не полных организаций), размером единицы-десятки машин.

Задачи канального уровня:

  1. Формирование и считывание кадров (frame), то есть блоков данных (MAC).
  2. Доставка кадров отдельному узлу в пределах единой среды передачи (LLC).
  3. Обеспечение для сетевого уровня отправки передачи пакетов в локальной сети.

Кадр Ethernet

Стандартизацией Ethernet занимается IEEE (Институт инженеров электротехники и электроники, читается «ай-трипл-и»). В стандартизации L1 и L2 в целом участвует МЭК (IEC), ISO, ITU (Международный телекоммуникационный союз). В настоящее время актуален стандарт IEEE 802.3 — Ethernet II.

Структура кадра Ethernet показана на [@fig:ethernet-frame]:

Структура кадра Ethernet IEEE 802.3 (адаптировано, CC-BY-SA 3.0){#fig:ethernet-frame}

Адрес отправителя и получателя — MAC-адреса из шести октетов каждый. MAC-адреса записываются через двоеточия (12:34:56:78:90:ab), через дефисы (12-34-56-78-90-ab) или по два байта через точки (1234.5678.90ab). Анализируя адрес назначения, узел определяет, ему ли предназначен пакет, или он пришел лишь потому, что с адресатом общая среда передачи. Адрес отправителя не влияет на прием кадра, но может использоваться для формирования ответа.

Тип протокола вышестоящего уровня (EtherType) — двухбайтовый код. Например, для IPv4 он равен 0x0800 (0x08, 0x00 — порядок байтов сетевой). По нему получатель определяет, как обрабатывать полезную нагрузку (payload). Все типы имеют код от 1536 и выше, потому что в устаревшем стандарте Ethernet (не II) у тех же байт был иной смысл — длина полезных данных от 0 до 1500.

Контрольная сумма (CRC/FCS — control redundant checksum / frame check sequence) нужна для защиты от ошибок передачи. Отправитель считает контрольную сумму на основе всех остальных октетов кадра и записывает в кадр, а получатель повторяет расчет и сверяет с присланной. В случае несовпадения можно сделать вывод, что кадр был поврежден при передаче, и не обрабатывать его. Часто такая фильтрация делается на MAC-подуровне, а LLC контрольную сумму даже не наблюдает (кроме траты четырех байтов длины).

Преамбула (preamble) и межкадровый интервал (inter-frame gap) относятся к MAC-подуровню и необходимы, чтобы различать начало и конец кадра в потоке битов, генерируемом физическим уровнем. Размер межпакетного интервала отличается в разных вариантах Ethernet, от 1 до 12 октетов.

Максимальным размером кадра считается 1518 октетов с учетом контрольной суммы. Преамбула (8 октетов) и межкадровый интервал (например, 12 октетов у FastEthernet) в длину кадра не входят, но их необходимо учитывать при расчетах. Пример: известна емкость канала FastEthernet — 10 Gbps (гигабит в секунду), нужно рассчитать скорость в 64-байтовых (64 B) пакетах в секунду (pps).

Завышенная оценка: 19,53 Mpps = 10×10⁹ bps / (8 b/B × 64 B/p)
Правильный расчет:  14,88 Mpps = 10×10⁹ bps / (8 b/B × (64 + 8 + 12) B/p)

Ограничение сверху на размер кадра влечет ограничение на размер полезных данных в нем — MTU (maximum transmission unit), для Ethernet это 1500 октетов, но может быть настроено меньше. Сетевому уровню известно MTU, поэтому L3 не генерирует сообщений, превышающих его. Если же принят пакет L3 большего размера и требуется переслать его дальше, на сетевом уровне создаются два пакета с частями исходного и посылаются отдельными кадрами — происходит фрагментация, которая будет более подробно рассмотрена вместе с IP.

Адресация на канальном уровне

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

  • одному конкретному узлу — адресная рассылка (unicast);
  • каждому узлу некой группы — многоадресная рассылка на L2 (MAC multicast);
  • всем узлам локальной сети — широковещательная рассылка (broadcast).

Соответственно, узел обрабатывает кадр, если MAC-адрес назначения:

  • равен ff:ff:ff:ff:ff:ff (широковещательный адрес);
  • является групповым адресом (см. ниже), и узел считает себя членом группы;
  • совпадает с MAC-адресом, принадлежащим сетевому порту, принявшему кадр.

Большая часть трафика является адресной рассылкой. Непременное техническое требование к MAC-адресам сетевых портов для этого — уникальность в локальной сети. Как достигается уникальность, зависит от происхождения MAC-адресов.

MAC-адреса могут назначаться вручную администратором или автоматически, например, при создании виртуальных машин. За уникальностью при этом следит администратор или программа. По стандартам IEEE локально выданные MAC-адреса (locally administered) должны иметь 1 в определенном бите, например, 0a:11:11:11:11:11 (000010 1 0:…), см. [@fig:mac-address].

Портам физических устройств MAC-адреса назначаются при производстве. Производители не могут заранее знать, какие два устройства окажутся в одной сети, поэтому им назначают адреса, уникальные глобально (globally unique). Для этого регистратор IEEE выделяет производителям трехбайтовые номера (organizationally unique ID, OUI), которые используются как первые три октета MAC-адреса. Остальные три октета производитель выбирает сам так, чтобы не было двух портов с одинаковыми адресами. В Wireshark можно видеть отображаемые MAC-адреса в виде Routerbo_b3:0f:d0, где октеты OUI заменены сокращенным названием производителя (в данном случае — RouterBoard).

Структура MAC-адреса (источник, CC-BY-SA 2.5){#fig:mac-address}

Широковещательная рассылка используется либо когда MAC-адрес целевого узла неизвестен, либо для оповещения всех узлов. Чаще всего она встречается с протоколом ARP (см. ниже).

Многоадресная (или групповая) рассылка используется в основном в корпоративных и промышленных сетях. Групповые MAC-адреса имеют нечетный первый октет. Групповая рассылка используется, чтобы отправить кадр:

  1. Сразу всей группе заинтересованных узлов. В чем именно заинтересованных, то есть какой именно группе, определяется выбранным групповым адресом.
  2. Одному узлу, который в данный момент выполняет известную роль, но при этом неизвестно, какой это конкретно узел. (Термин «групповая рассылка» здесь условен.)

Так далее многоадресная рассылка подробнее не изучается, рассмотрим пример: трансляцию IP-телевидения в сети провайдера абонентам, которые могут переключать каналы.

1. Рассылка для группы узлов. Если транслировать все каналы всем (широковещательно), сеть будет перегружена. Если транслировать для каждого абонента адресно, придется отправлять одни и те же данные несколько раз и отслеживать текущие каналы абонентов, что усугубляет нагрузку на сервер трансляций.

Здесь группа заинтересованных узлов — зрители телеканала. Многоадресная передача позволяет серверу отправлять данные каждого канала один раз, а при распределении трафика по сети (см. ниже) кадры будут продублированы и получены правильными узлами.

В случае IP-телевидения многоадресная рассылка на канальном уровне используется в сочетании с многоадресной же рассылкой на сетевом уровне (IP multicast), чтобы транслировать передачи между локальными сетями. При этом используются специальные IP-адреса, а групповые MAC-адреса вида 01:00:5e:xx:xx:xx (IPv4) или 33:33:00:xx:xx:xx (IPv6) строятся из них по правилам: xx заменяются младшими байтами IP-адреса.

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

При переключении канала абонент шлет на адрес своей новой группы (смотрящих новый канал) пакет по специальному протоколу IGMP (Internet Group Management Protocol). Коммутатор отслеживает кадры всех групп 01:00:5e:xx:xx:xx. Получив такой кадр с порта, коммутатор делает вывод, что в дальнейшем кадры для этой группы нужно отправлять в порт, с которого пришло оповещение.

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

Протокол разрешения адресов (ARP)

Чтобы сформировать кадр, необходимо знать MAC-адрес получателя. Вышестоящие уровни не обладают этой информацией, а только адресом L3 (обычно IP-адресом). Получателю свой MAC-адрес известен, следовательно, он и должен его сообщить. По получателю неизвестно, что с ним пытаются связаться. Поэтому отправитель должен предварительно отправить запрос. Это нельзя сделать адресно (нет собственно MAC-адреса), нельзя сделать групповой рассылкой (любой узел может быть получателем — такая группа включала бы все узлы), следовательно, остается широковещательная рассылка запроса.

Протокол разрешения адресов (address resolution protocol, ARP) и предназначен для нахождения MAC-адреса по IP-адресу. Структура его пакетов, одинаковая для запросов и ответов, приведена на [@fig:arp-packet].

Формат пакета ARP (источник, CC-BY-SA 4.0){#fig:arp-packet}

  1. Клиент шлет широковещательный пакет на MAC-адрес ff:ff:ff:ff:ff:ff со своего MAC-адреса. Смысл пакета — запрос, чтобы тот узел, которой обладает указанным IP, ответил клиенту. IP-адрес укаызывается как target protocol address, MAC-адрес и IP-адрес отправителя заносятся как sender addresses, а target hardware address обнуляется.

  2. Если сервер, получивший запрос ARP, имеет искомый адрес, он формирует ответ со своего MAC на MAC клиента. В ответе дублируется искомый IP и MAC-адрес сервера (как sender protocol и hardware address), а также MAC-адрес и IP-адрес запросившего (как target addresses).

  3. При получении ответа ARP клиент считывает MAC-адрес и IP-адрес из ответа и добавляет их в свою таблицу ARP. (Содержимое таблицы в Windows, Linux и MacOS можно просмотреть программой arp.)

Может показаться, что ответ ARP избыточен: MAC-адрес сервера уже указан в кадре как MAC отправителя, а искомый IP-адрес дублируется из запроса. Но избыточности нет:

  • Клиент может одновременно сделать несколько ARP-запросов доя разных IP. Если не указывать искомый IP в ответе, клиент не сможет определить, к какому IP относится MAC сервера.

  • В сложных случаях для передачи запросов ARP может использоваться один протокол канального уровня, а для связи с искомым узлом — другой. При этом адрес отправителя в кадре-ответе и адрес отправителя в ответе ARP (содержимом кадра) не будут или даже не могут совпадать. Строго говоря, ARP не ограничен MAC- и IP-адресами, но применяется в основном для них.

При включении в сеть некоторые устройства и ОС посылают так называемые анонсы ARP (ARP announcement) или приветственные ARP (gratuitous ARP): ответы ARP самому себе, но посланные на широковещательный адрес. Таким образом присутствовавшие в сети устройства могут узнать о новом.

Очерк устройства и иерархической архитектуры сетей

Из-за тесной связи канального и физического уровня рассуждать о протоколах L2 непродуктивно без представления, хотя бы краткого, об устройствах и способах их связи, применяемых в локальных сетях на практике.

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

Что это за устройства?

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

Для средних и крупных организаций (десятки-сотни и сотни-тысячи узлов соответственно) целесообразно связывать устройства в иерархическую архитектуру, показанную на [@fig:hierarchy].

Иерархическая архитектура сети (источник, по материалам Cisco Press){#fig:hierarchy}

Структура реальной сети может сильно отличаться, но как правило, чем крупнее сеть, тем более отчетливо в ней проявляются черты, предписываемые архитектурой, поскольку она рациональна. Подробное обоснование и описание можно прочитать в учебниках Cisco, которая эту архитектуру предложила.

Основное промежуточное устройство сегодня — коммутатор, или свитч (switch). Его ключевая задача — имитировать для подключенных устройств нахождение в едином сегменте L2 (для связности), разделяя при этом их физические среды (для эффективности). Обычные домашние Wi-Fi точки доступа — коммутаторы: они объединяют в единую сеть устройства, подключенные к их портам и по Wi-Fi (но домашние модели совмещают функции коммутатора с другими функциями). У промышленных моделей больше портов (12, 24, 32, 48) и почти нет функций L3 и выше (обеспечивать их для стольких устройств слишком сложно и дорого). Уровень иерархии сети, на котором оконечные устройства подключаются к сети через промежуточные, называется уровнем доступа (access layer).

Коммутаторы могут соединяться в свою иерархию (то есть объединять свои сегменты) и подключаются в итоге к маршрутизатору, или роутеру (router). Маршрутизаторы связывают L3-сегменты, то есть сети с разными IP-адресами. При этом они разделяют broadcast-домены, то есть широковещательные и групповые кадры из разных локальных сетей не проходят через маршрутизатор. Этот слой иерархии называется уровнем распределения (distribution layer), на нем применяются правила маршрутизации и контроля доступа из сети в сеть.

Маршрутизаторы соединяются между собой специальными высокопроизводительными и функциональными коммутаторами в ядре сети (core layer). Это самая нагруженная часть сети, так как через нее проходит весь трафик. Поэтому же ядро обязательно резервируется, то есть строится из нескольких устройств, соединенных избыточно, чтобы выход одного из строя не парализовал работу сети. Одна из функций уровня распределения — ограничить доступ к ядру сети.

Хотя коммутаторы имитируют единую среду и не видны на канальном уровне как отдельные устройства (L2-прозрачны), это интеллектуальное оборудование. Коммутаторы не соединяют электрически каналы, а принимают кадры, обрабатывают их и отправляют далее (схема store-and-forward). Например, они отслеживают для каждого порта, устройства с какими MAC-адресами подключены к нему (ведут таблицы MAC-адресов), и пересылают кадры для этих устройств только в нужный порт, что снижает нагрузку на сеть. Возможности продвинутых коммутаторов включают агрегацию каналов (например, создание канала 40 Гбит/с из четырех портов на 10 Гбит/с), борьбу с петлями в сети (STP), защитные функции.

Виртуальные локальные сети (VLAN)

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

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

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

  • Удобство управления. Администраторам нужно иметь доступ к промежуточным устройствам. Если их трафик будет передаваться вместе с остальным, при неполадках администраторы лишатся доступа вместе со всеми и не смогут удаленно перенастроить устройство.

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

Решение есть на программном уровне: создать виртуальные локальные сети (virtual LAN, VLAN), то на одном и том же оборудовании (network fabric) обрабатывать трафик разных логических сетей отдельно.

Наделим меткой VLAN все порты коммутаторов, к которым подключены оконечные устройства этой VLAN, и все кадры этой VLAN. Кадры с определенной меткой будем обрабатывать на коммутаторах так, как будто нет портов и кадров с другими метками. Таким образом трафик оконечных устройств из одной VLAN никогда не попадет к устройствам другой VLAN, то есть каждая VLAN работает как отдельная локальная сеть, но оборудование используется всеми VLAN совместно.

Между VLAN трафик может проходить только на маршрутизаторах, если это настроено.

Сказанное относится и к широковещательным кадрам, поэтому говорят, что VLAN разделяют broadcast-домены, то есть широковещательные запросы в одной VLAN не видны в других.

Остается вопрос связности: как кадры с метками (тэгированный трафик) обрабатываются при передаче вверх по иерархии? Между промежуточными устройствами передается трафик из разных VLAN одновременно — такие каналы называются VLAN trunk. Администратор настраивает, трафик каких именно VLAN может передаваться по каждому каналу.

На [@fig:vlan] приведен пример из двух VLAN: инженерного отдела (VLAN 1) и отдела маркетинга (VLAN 2). Каждый из отделов физически присутствует на двух этажах. На каждом этаже установлено по коммутатору, к которому подключены ПК на этаже. Однако логически весь инженерный отдел (ПК на обоих этажах) находится в единой сети, обособленной от такой же сети отдела маркетинга. Access-порты инженерного отдела — 2, 3, 5 на втором этаже и 2, 4, 6 на третьем. Канал между коммутаторами работает в режиме trunk, пропуская кадры обеих VLAN.

Пример использования VLAN (источник, CC-BY-SA 4.0){#fig:vlan}

Как правило, выделяют особую VLAN управления (management VLAN), в которую входит все промежуточное оборудование, и трафик которой разрешен на всех trunk´ах. Эту сеть используют для диагностики и настройки.

Рассмотрим, как технически реализованы метки VLAN.

Чтобы пометить кадр, нужно включить в него дополнительные данные — собственно, метку — то есть поменять его формат, как показано на [@fig:vlan-frame]. Он стандартизирован IEEE 802.11Q. Метка размером 4 байта добавляется перед полем кода протокола L3. При этом MTU сохраняется 1500 октетов, то есть максимальный размер кадра IEEE 802.11Q увеличен до 1522 октетов.

Структура кадра IEEE 802.11Q (источник, CC-BY-SA 3.0){#fig:vlan-frame}

Первые два байта — всегда 0x8100 (0x81, 0x00), это идентификатор протокола тэгов IEEE 802.11Q (tag protocol identifier, TPID).

Вторые два байта — управляющие данные тэга (tag control information, TCI). Из них 12 битов — идентификатор VLAN, используемый для их различения. Еще 4 бита отвечают за приоритизацию трафика, что выходит за рамки обсуждения. Из 2¹² = 4096 номеров VLAN есть два особых: 0x000 означает, что тэг несет только информацию о приоритете трафика), 0xfff зарезервирован и не должен использоваться.

Заметим, что по одному каналу (обычно в ядре или между площадками) может идти вперемешку тэгированный и нетэгированный трафик. Идентификатор протокола тэгов позволяет различить их. Кадр начинает обрабатываться как нетэгированный. Поле TPID расположено в кадре там же, где код протокола L3. Его анализ обнаружит, что кадр тэгирован, будет учтен VLAN ID, а код протокола L3 будет прочитан вслед за меткой VLAN.

Откуда берется метка у кадров, в каком месте определяется VLAN ID?

В типичном случае это делает коммутатор. Его порты, связанные с оконечным устройством настраиваются в так называемый access-режим:

  1. Порту назначается VLAN, в которую будет входить подключенное устройство.
  2. Когда в порт поступает нетэгированный кадр, в него добавляется метка с настроенным VLAN ID.
  3. Когда в коммутатор поступает кадр на MAC-адрес подключенного к порту устройства, тэгированный тем же VLAN ID, что и у порта, метка снимается, и оконечному устройству направляется нетэгированный кадр.
  4. В остальных случаях (тэгированный кадр со стороны оконечного устройства, несоответствие VLAN ID) кадр отбрасывается, то есть не обрабатывается.

Это удобно для управления сетью:

  • Настраивается только промежуточное оборудование, которого значительно меньше, чем оконечных устройств.
  • Оконечные устройства не работают с тэгами, поэтому если их подключить к другому порту в другой VLAN, они сразу же смогут отправлять кадры, например, чтобы перенастроить IP-адрес при необходимости.

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