ICNDv3 #5 — Кадр.

Физический уровень
PDU (Protocol Data Unit) — это один блок информации на каждом из уровней. Он же является единицой передачи в логической модели. Ниже канального уровня (Link) у нас физический уровень. На физическом уровне прописано, как в данной физической среде кодируются биты, как выглядят и работают.
Канальный уровень
Передаются эти биты цепочкой, которую назвали — Кадр (Frame). Кадр — битовая цепочка переменной длины, у которой есть некая структура. Раньше, на канальном уровне, использовались Ячейки (Cells) по 53 байта, и, считалось, что если длина битов фиксированная, то их можно будет очень быстро обрабатывать. Но практика показала, что соотношение «боевых данных» к «служебным данным» очень печальное, и кадры справляются с задачами намного лучше.
Сетевой уровень
Пакеты (Packets). В отличие от кадра, пакет живет больше, чем в одной среде передачи данных. Пример: у вас есть глобальная сеть, состоящая из нескольких офисов, в каждом из которых есть своя локальная сеть, и все это соединено через роутеры. Ethernet кадры существуют только в пределах одного экземпляра сети Ethernet. С одного узла сети приходит кадр и говорит: «Передать вот это, на соседа вот такого», кадр долетает до роутера, его там распаковывают, вытаскивают данные и все: кадр умирает. Это делается потому, что чужая сеть может быть построена на другой технологии, и пакет будет ехать между разными сетями, упаковываясь в кадр разных сетевых технологий, но будет сохранять свою структуру. Окей, с этим разобрались.
Транспортный уровень
Сегмент (Segment) — это кусочек большого блока данных (пакета).
Датаграмма (Datagram) — это «полезные данные» пакета (Payload).
На транспортном уровне много протоколов, но как самый характерный — протокол TCP. Он умеет большие куски данных сегментировать, то есть разделять их на пригодные для передачи по сети кусочки. То есть, если у вас внутри сети отличная скорость и качественная связь, можно настроить размер пакета MTU (Maximum Transmission Unit) от стандартных 1500 байт до 9000 байт. Чем больше размер пакета, тем быстрее передаются данные, потому что надо рубить пакет на меньшее количество кусков. Однако, при передаче во внешнюю сеть, пакеты будут порублены на куски по 1500 байт. А все, что выше на картинке, это Данные (User Data).
Инкапсуляция

Инкапсуляция (Encapsulation) — это процесс, когда ваши данные по пути до начала передачи обрастают служебными заголовками.
То есть, когда приложение хочет передать данные, оно ничего не знает про протоколы уровнем ниже. Соответственно, чтобы данные куда-то передать, к ним добавляется служебный заголовок, понятный соседнему уровню (и так на каждом следующем уровне).
- L4 Header (Транспортный уровень) — Чтобы данные отправить дальше, к ним добавляют Заголовок (Header). В этом заголовке содержатся служебные данные: «Это не просто кусок данных, а кусок сессии такой-то, от узла такого до такого, вот с такими характеристиками, нарезаем вот на такие куски, уведомить, что приехали все кусочки и прочее».
- L3 Header (Сетевой уровень) — Считаем, что все, что приехало с уровня выше, это некие данные, мы на них не смотрим. Далее данные пакуются в сетевой уровень и передаются на уровень ниже. Но у этого уровня задача дотащить от IP одного до IP другого.
- L2 Header (Канальный уровень) — На уровне протокола Ethernet это будет выглядеть вот как. У нас есть данные, которые пришли сверху, у нас есть сосед по сети, у него есть физический адрес (MAC). Нам надо добавить наш заголовок к данным и передать его дальше.
MAC—адрес (Media Access Control, он же Hardware Address) — это уникальный идентификатор сетевого интерфейса.
FCS (Frame Check Sequence) — 4 байтовое значение CRC (Cyclic Redundancy Check), нужное для предварительной проверки целостности, чтобы не обрабатывать «битые» данные.
Если вкратце…
- Взяли данные (User Data), добавили первый заголовок (L4 HDR), пихнули на уровень дальше.
- Следующий уровень получил данные (L4 HDR + User Data), добавил свой заголовок (L3 HDR), пихнул на уровень дальше.
- Следующий уровень получил данные (L3 HDR + User Data), добавил свой заголовок (L2 HDR) и FCS, пихнул на уровень дальше.
Де-Инкапсуляция
Де-Инкапсуляция (De-Encapsulation) — это процесс разбора кадра в обратную сторону.
- Взяли данные кадр (L2 HDR + User Data), проверили FCS, если кадр приехал не битый, то удаляем FCS, удаляем L2 заголовок, отправляем на уровень выше.
- Следующий уровень получил данные (L3 HDR + User Data), удалил свой заголовок (L3 HDR), отправил данные на уровень выше.
- Следующий уровень получил данные (L4 HDR + User Data), удалил свой заголовок (L4 HDR) и отдал данные (User Data) конечному приложению.
Современнные сетевые адаптеры многие из этих вещей делают уже на аппаратном уровне (Hardware Offload), а не на уровне драйвера ОС, что сильно экономит процессорное время ОС.
Примеры Hardware Offload:
- Hardware Checksum Offloading
- Hardware TCP Segmentation Offloading
- Hardware Large Receive Offloading
Структура кадра

- Преамбула (Preamble) — 8 Байт
- Адрес получателя (Destination Address) — 6 Байт
- Адрес отправителя (Source Address) — 6 Байт
- Тип (Type) или Длина (Lenght) — 2 Байта
- Данные (Data) — 46-1500 Байт
- Контроль целостности кадра (FCS) — 4 Байта
Преамбула
Преамбула (Preamble) — чередование битов 10101010 в определенной последовательности, нужное для оповещения других клиентов в сети, о том, что кто-то собирается начать передавать данные. Состоит из двух частей:
1. Первые 7 байт.
2. Последний 1 байт — Стартовый разделитель кадра — SFD (Start of Frame Delimiter).

Адрес получателя \ отправителя
MAC-адрес получателя, 6 байт (Пример 00:26:2d:00:1f:03). Почему сначала адрес получателя? Чем раньше ротуер получит адрес назначения, тем раньше он сможет начать подготовку к переброске кадра в целевой порт.
Разделение байт идет через : или —
Тип
Тип вложенных данных: Eth Type II \ Eth 802.3 \ Eth 802.2 \ Eth SNAP. Определение типа нужно, чтобы в рамках одного сегмента могли общаться железки (синхронизация типами).
Или VLAN Tag. IEEE 802.1Q — стандарт, который описывает процедуру тегирования трафика для передачи информации о принадлежности к VLAN по сетям.

Как устроен MAC-адрес?
MAC-адрес состоит из 6 байт. Традиционно его разделяют на 2 половинки, левую и правую.
Левая — OUI (Organizationally Unique Identifier). У всех крупных фирм, производящие сетевое оборудование, есть свой некий ID, который выдает потом всем своим устройствам.
Правая — UNI (Unique NIC Identifier). Уникальный ID оборудования.

Если рассматривать совсем тщательно OUI, то есть два службеных бита.
Самый правый бит (как на кратинке ниже) говорит о том, что если этот бит = 0, то это MAC-адрес уникальной сущности, например, сетевого адаптера. Если этот бит = 1, то это MAC-адрес не уникальный. Это или широковещание или мультикаст (группа устройств).
Второй справа бит показывает, что если бит = 0, то он «натуральный», сделанный на заводе. Если бит = 1, то он «синтезированный», полученный иначе.
