4.3.2. Протокол MAC в классическом Ethernet
Формат фрейма, применяемый для отправки данных, показан на илл. 4.14. Сначала идет поле Preamble (Преамбула) длиной 8 байт, которое содержит последовательность 10101010 (за исключением последнего байта, в котором значения двух последних битов равны 11). Последний байт в стандарте 802.3 называется разделителем Start of Frame, SoF (начало фрейма). Манчестерское кодирование такой последовательности битов в результате дает меандр с частотой 10 МГц и длительностью 6,4 мкс. Это позволяет получателю синхронизировать свой таймер с таймером отправителя. Два последних бита 11 сообщают получателю, что сейчас начнется передача остальной части фрейма.
Илл. 4.14. Форматы фреймов. (а) DIX Ethernet; (б) IEEE 802.3
Затем следуют два адресных поля: Destination address (Адрес получателя) и Source address (Адрес отправителя). Каждый занимает по 6 байт. Первый передаваемый бит адреса получателя содержит 0 для обычных адресов и 1 для групповых. Групповые адреса позволяют нескольким станциям принимать информацию от одного отправителя. Фрейм, отправляемый групповому адресату, может быть получен всеми станциями, входящими в эту группу. Этот механизм называется групповой рассылкой (multicasting). Если адрес состоит только из единиц, то фрейм могут принять абсолютно все станции сети. Таким способом осуществляется широковещание (broadcasting). Групповая рассылка более избирательна и предусматривает управление группами, чтобы определять, какие станции в них входят. При широковещании, напротив, никакой разницы между станциями нет, поэтому управление группами не требуется.
Интересной особенностью исходных адресов станций является их абсолютная уникальность. Они централизованно назначаются IEEE, и это гарантирует, что нигде в мире нет двух станций с одинаковым адресом. Идея заключается в том, что каждая станция может быть однозначно идентифицирована по ее 48-битному номеру. Для этого первые 3 байта поля адреса используются для уникального идентификатора организации (Organizationally Unique Identifier, OUI). Значения этого поля определяются IEEE и являются индикатором производителей (каждый из них получает блок из 224 адресов). Производитель назначает последние 3 байта адреса и программирует весь адрес в сетевой карте перед тем, как она поступает в продажу.
Затем следует поле Type (Тип) или Length (Длина), в зависимости от того, к какому стандарту относится фрейм — Ethernet или IEEE 802.3. В Ethernet поле Type показывает получателю, что делать с фреймом. Дело в том, что одновременно на одном и том же компьютере может работать несколько протоколов сетевого уровня. Поэтому операционная система должна понимать, какому протоколу передать полученный фрейм Ethernet. Поле Type определяет процесс, для которого предназначается фрейм. Например, код типа 0x0800 означает, что данные содержат пакет IPv4.
Создатели IEEE 802.3 благоразумно решили, что в этом поле должна передаваться длина фрейма. Для определения этого показателя в Ethernet необходимо было заглянуть внутрь данных, а это нарушение правил использования сетевых уровней. Разумеется, это означало, что получатель никак не мог выяснить, что же ему делать с входящим фреймом в IEEE 802.3. Эту проблему решили путем добавления в данные еще одного заголовка для протокола управления логическим каналом (Logical Link Control, LLC), который мы рассмотрим позже. Он занимает 8 байт и передает 2 байта информации о типе протокола.
К сожалению, к моменту публикации стандарта IEEE 802.3 использовалось так много оборудования и программного обеспечения для DIX Ethernet, что многие производители и пользователи были не в восторге от необходимости реорганизации полей Type и Length. В 1997 году IEEE признал поражение и допустил оба способа. К счастью, значения всех полей Type, использовавшиеся до 1997 года, были больше 1500 (тогда это был максимальный размер данных). Теперь правило таково, что любое значение меньше 0x600 (1536) можно интерпретировать как Length, а больше 0x600 — как Type. Теперь в IEEE спокойны: все используют их стандарт, при этом продолжая делать то же, что и раньше, не утруждая себя мыслями о протоколе LLC и не чувствуя вины за нарушение стандарта. Вот что происходит, когда политика (в данном случае отраслевая) и технологии идут рука об руку.
Наконец, за полем Type следует поле Data (Данные), размер которого ограничен 1500 байтами. При официальном закреплении стандарта Ethernet это число было выбрано, в общем-то, произвольно. Основной причиной послужило то, что трансиверу нужно довольно много оперативной памяти для хранения всего фрейма, а память в далеком 1978 году еще была очень дорогой. Соответственно, увеличение верхней границы размера поля данных привело бы к необходимости установки большего объема памяти и удорожанию всего трансивера.
Между тем кроме верхней границы размера поля данных очень важна и нижняя. Поле данных, содержащее 0 байт, вызывает определенные проблемы. Дело в том, что когда трансивер обнаруживает коллизию, он обрезает текущий фрейм, а это означает, что отдельные куски фреймов постоянно блуждают по кабелю. Чтобы легче отличать нормальные фреймы от мусора, сети Ethernet требуется фрейм размером не менее 64 байт (от поля адреса получателя до поля контрольной суммы включительно). Если во фрейме содержится меньше 46 байт данных, в него вставляется специальное поле Pad (Заполняющие биты), с помощью которого его размер доводится до необходимого минимума.
Есть и другая (и даже более важная) цель установки нижней границы размера фрейма: предотвращение ситуации, когда станция успевает передать короткий фрейм раньше, чем его первый бит дойдет до самого дальнего конца кабеля, где он может столкнуться с другим фреймом. Эта ситуация показана на илл. 4.15. В момент времени 0 станция A на одном конце сети посылает фрейм. Пусть время прохождения фрейма по кабелю равно τ. За мгновение до того, как он достигнет конца кабеля (то есть в момент времени τ – ε), самая дальняя станция B начинает передачу. Когда B замечает, что получает большую мощность, нежели передает сама, она понимает, что произошла коллизия. Тогда она прекращает передачу и выдает 48-битный шумовой сигнал, предупреждающий остальные станции. Примерно в момент времени 2τ отправитель замечает шумовой сигнал и также прекращает передачу, затем выжидает случайное время и пытается возобновить ее.
Илл. 4.15. Обнаружение коллизии может занять 2τ
Если размер фрейма слишком маленький, не исключено, что отправитель закончит передачу прежде, чем получит шумовой сигнал в момент 2τ. В этом случае он может ошибочно предположить, что его фрейм был успешно принят. Для предотвращения этой ситуации все фреймы должны быть такой длины, чтобы время их передачи было больше 2τ. В LAN со скоростью передачи 10 Мбит/с при максимальной длине кабеля 2500 м и наличии четырех повторителей (требование спецификации 802.3) время передачи одного фрейма должно составлять в худшем случае около 50 мкс. Следовательно, длина фрейма должна быть такой, чтобы время передачи было не меньше этого минимума. При скорости 10 Мбит/с на передачу одного бита тратится 100 нс, значит, минимальный размер фрейма должен быть равен 500 бит. Из соображений надежности это число было увеличено до 512 бит, или 64 байт.
Последнее поле фрейма — Checksum (Контрольная сумма). По сути, это 32-битный код CRC того же типа, какой мы обсуждали в разделе 3.2. Если точнее, он определяется при помощи того же порождающего многочлена, что используется для PPP, ADSL и других типов каналов. Этот CRC позволяет выявлять ошибки: он проверяет, правильно ли приняты биты фрейма. Исправления не происходит — при обнаружении ошибки фрейм удаляется.
CSMA/CD с алгоритмом двоичной экспоненциальной выдержки
В классическом Ethernet используется алгоритм CSMA/CD с настойчивостью 1, который мы рассматривали в разделе 4.2. Это означает, что станция прослушивает среду передачи, когда у нее появляется фрейм для отправки, и передает данные, если канал освобождается. Затем она проверяет, не произошла ли коллизия. Если это случилось, станция прерывает передачу, посылая короткий сигнал о наличии коллизии, и повторяет отправку данных через случайный интервал времени.
На примере модели на илл. 4.5 рассмотрим, как определяется случайная длина интервала ожидания после коллизии, так как это новый метод. Когда возникает проблема, время делится на дискретные слоты. Их длительность равна максимальному времени обращения сигнала (то есть его прохождения по кабелю туда и обратно) — 2τ. Для удовлетворения потребностей Ethernet при максимальном размере сети необходимо, чтобы один слот составлял 512 битовых интервалов, или 51,2 мкс.
После первой коллизии каждая станция ждет или 0, или 1 слот, прежде чем снова предпринять попытку передачи. Если после коллизии две станции выберут одно и то же псевдослучайное число, они снова будут конфликтовать друг с другом. После второй коллизии каждая станция выбирает случайным образом 0, 1, 2 или 3 слота из набора и ждет снова. При возникновении третьей коллизии (вероятность такого события после предыдущих двух равна 1/4) слоты будут выбираться в диапазоне от 0 до 23 – 1.
В общем случае после i столкновений выбирается случайный номер в диапазоне от 0 до 2i – 1 и станция пропускает это количество слотов. Но после 10 коллизий подряд интервал рандомизации фиксируется на отметке 1023 слота. После 16 коллизий подряд контроллер признает свое поражение и возвращает компьютеру ошибку. Дальнейшим восстановлением занимаются более высокие уровни.
Это алгоритм двоичной экспоненциальной выдержки (binary exponential backoff). Он был выбран для динамического учета количества станций, пытающихся осуществить передачу. Если выбрать интервал рандомизации равным 1023, то вероятность повторной коллизии будет пренебрежимо мала, но среднее время ожидания составит сотни слотов, в результате среднее время задержки будет слишком велико. С другой стороны, если каждая станция будет выбирать время ожидания всего из двух вариантов, 0 и 1, то в случае коллизии сотни станций они будут продолжать конфликтовать вновь и вновь до тех пор, пока 99 из них не выберут 1, а одна станция — 0. Это может длиться годами. Алгоритм экспоненциально увеличивает интервал рандомизации по мере возникновения повторных коллизий. Тем самым он обеспечивает низкую задержку при коллизии небольшого числа станций и одновременно гарантирует, что при коллизии большого числа станций проблема будет решена за разумное количество времени.