Преамбула и SFD (Start Frame Delimiter) вместе занимают 8 байт (7 + 1) и необходимы сетевой карте, чтобы подготовиться к получению Ethernet кадра (frame).
Сразу за SFD начинается Ethernet кадр. Кадр состоит из двух частей:
-
Заголовок.
-
Данные.
Заголовок Ethernet кадра состоит из:
-
Адрес назначения (Destination Address).
-
Адрес источника (Source Address).
-
Поля Длина/Тип (Length/Type).
По 6 байт (48 бит) выделяется на аппаратный адрес назначения и отправителя. Обычно этот аппаратный адрес называется MAC адрес (или адрес сетевой карты или физический адрес) и записывается в виде байт в шестнадцатеричном формате разделенных двоеточием. Например D0:0D:56:77:33:C4.
Этот адрес есть у каждой сетевой карты. Вы можете самостоятельно посмотреть его у себя. Если у вас Windows, то откройте консоль (cmd.exe) и выполните команду “ipconfig /all” В результате работы команды будут перечислены все ваши локальные сетевые устройства и их параметры. Нужный вам параметр называется “Физический адрес”.
Если у вас MacOS или Linux, то в командной строке выполните команду ifconfig, как изображено на рисунке.
Note
|
В современных Linux дистрибутивах команда ifconfig считается устаревшей. Вместо неё принято использовать ip link из пакета iproute2. |
Каждый раз, когда ваша сетевая карта получает Ethernet пакет, она проверяет MAC адрес назначения. И если он совпадает с ее, то этот пакет дальше обрабатывается. Если нет, то пакет отбрасывается.
MAC адреса делятся на 3 типа:
-
Unicast - персональный MAC адрес. Такой адрес есть у каждой сетевой карты. Он всегда прошивается прямо на заводе, при этом его можно временно изменить через драйвер.
-
Multicast - групповым MAC адрес считается, если младший бит старшего байта установлен в 1 (т.е. 01:00:00:00:00:00). Этот специальный адрес сетевая карта может себе присвоить в случае, когда ожидается рассылка пакетов сразу группе хостов.
-
Broadcast - широковещательный MAC адрес, записывается как все биты установленные 1 или в шестнадцатеричном формате FF:FF:FF:FF:FF:FF. Такой адрес в поле получателя означает, что пакет должен быть обработан всеми хостами, которые получили данный пакет.
Чтобы MAC адреса случайно не пересекались, за каждым производителем сетевого оборудования закреплен определенный диапазон MAC адресов, которые он может использоваться. Номер диапазона - это три старших байта адреса. Размер диапазона - оставшиеся 3 байта или примерно 16 млн. адресов (256*256*256). Все эти диапазоны можно найти в специальном OUI файле, который публично доступен по адресу https://standards-oui.ieee.org/.
Например, MAC адрес моей сетевой карты 80:e6:50:08:b1:6a. В файле https://standards-oui.ieee.org/ легко можно найти диапазон 80-E6-50, который соответсвует Apple, Inc. И действиетльно, эта сетевая карта принадлжеит моему MacBook.
Поле Длина/Тип (Length/Type) имеет две взаимоисключающих трактовки:
-
Если значение поля равно или менее 1500 (0x05DC), то значение трактуется как длина Ethernet кадра.
-
Если значение поля равно или более 1536, то значение трактуется как идентификатор вложенного протокола. К примеру, если внутри Ethernet кадра будет лежать IP протокол, то значение поля будет 0x0800, а если ARP протокол, то 0x0806.
После Ethernet заголовка следуют сами данные (MAC client data). Размер этих данных от 46 до 1500 байт. Т.е. Ethernet кадр не может быть больше 1514 байт (1500 байт данных + 14 байт Ethernet заголовок).
Минимальный размер данных в Ethernet кадре составляет 46 байт. Это ограничение сделано для того, чтобы в момент определения коллизии можно было однозначно понять, какой именно пакет вызвал коллизию.
Почему бы не сделать пакеты побольше? Зачем это ограничение в 1500 байт? Максимальный размер в 1500 байт полезной нагрузки в пакете обеспечивает хорошую скорость для передачи данных реального времени и не слишком сильно нагружает сеть заголовками.
Чем больше максимальный размер пакета, тем больше будет задержка при отправке второго пакета.
Предположим, у вас на компьютере работает два приложения. Одно скачивает файл из сети, а по второму вы разговариваете по видео-связи с друзьями. Если максимальный размер пакета сделать очень большими, как на рисунке ниже, то пока ваша сетевая карта будет принимать пакет с данными скачиваемого файла, пакет с видео и звуковой дорожкой от ваших друзей будет ожидать где-то в буфере на прием. Вы это заметите, так как видео и звук будет замораживаться на время и разговор превратиться в мучение, а не в радость.
Если пакет сделать очень маленьким, то возрастет нагрузка на передаваемые данные. Предположим, скорость передачи данных у нас 10 Мбит/сек. Т.е. мы можем передать 10 000 000 бит в секунду. Вспомним формат Ethernet пакета: ● 7 байт преамбула ● 1 байт SFD ● 14 байт заголовок Ethernet кадра ● 1500 байт данных ● 4 байта FCS
Итого получается 1526 байт = 26 байт служебной информации + 1500 байт данных.
Добавим к этому расстояние между передаваемыми пакетами. В Ethernet вы не можете передать два пакета строго друг за другом, между ними должно быть расстояние. Это расстояние называется межпакетным интервалом (interpacket gap).
Для 10 Мбит/сек размер gap равен примерно 47 битам (почти 6 байт) (https://en.wikipedia.org/wiki/Interpacket_gap).
Получается, что для передачи 1500 байт данных, мы дополнительно передаем 26 служебных байт + 6 байт gap. Итого получается 1532 байта (1500 байт данных + 26 байт служебной информации + 6 байт gap).
1532 байта данных это 12 256 бит (1532 * 8). При скорости 10 Мбит/сек, за одну секунду мы успеем передать 815 пакетов.
В каждом пакете 1500 байт данных, получается, что за секунду мы передадим 1 223 890 байт полезных данных.
Предположим, мы уменьшим максимальный размер пакета до 1000 байт. Что получится?
1000 байт данных + 26 байт служебной информации + 6 байт gap = 1032 байта или 8 256 бит. При 10 Мбит/сек за одну секунду мы успеем передать 1211 пакетов. В каждом 1000 байт данных, получается, что за секунду мы передадим 1 211 240 байт полезной нагрузки, что на 12 649 байт меньше (это примерно 1%).
Вроде немного, при этом разница в количестве пакетов около 50%, 815 против 1211. А это означает - на 50% больше прерываний на сетевом интерфейсе при обработке и отправке пакетов, на 50% больше раз обрабатывать заголовок, и так далее.
Заканчивается Ethernet пакет полем Frame Check Sequence (FCS). Это поле содержит CRC32. CRC (Cyclic redundancy check) - алгоритм нахождения контрольной суммы, предназначенный для проверки целостности данных.
При отправке каждого Ethernet пакет сетевая карта считает его CRC32 и записывает в FCS. Во время получения Ethernet пакета, сетевая карта пересчитывает CRC32 для этого пакета и сверяет со значением в поле FCS. В случае, если эти значения не совпадают, пакет отбрасывается.
Это такой способ удостовериться, что принятый пакет не был случайно искажен во время передачи. И данные пришли именно те, которые были отправлены.