Не желательно на сетевом уровне заниматься пропажей кадров. Это задача канального уровня обеспечить надежный канал. Это особенно важно при беспроводной среде передачи.
Сервис, создаваемый канальным уровнем для сетевого, опирается на сервис, создаваемый физическим уровнем. На физическом уровне протекают потоки битов. Посланное количество битов не обязательно равно принятому, значение посланного бита так же не обязательно равно принятому. Все это требует специальных усилий на канальном уровне по обнаружению и исправлению ошибок.
Типовой подход к решению этой проблемы - разбиение потока битов на кадры, подсчет контрольной суммы для каждого кадра при посылке данных. При приеме контрольная сумма вычисляется для каждого кадра заново и сравнивается с той что храниться в кадре. Если они различаются, то это признак ошибки передачи. Канальный уровень должен принять меры к исправлению ошибки, например, сбросить плохой кадр, послать сообщение об ошибке тому кто прислал этот кадр.
Разбиение потока битов на кадры - задача не простая. Один из способов - делать временную паузу между битами разных кадров. Однако, в сети где нет единого таймера нет гарантии, что эта пауза сохраниться или, наоборот, не появятся новые.
Так как временные методы ненадежны, то применяются другие. Здесь мы рассмотрим четыре основных:
- счетчик символов
- вставка специальных стартовых и конечных символов
- вставка стартовых и концевых битов
- нарушение кодировки на физическом уровне
Первый метод показан наРис1.3. В начало каждого кадра указывается сколько символов в кадре. При приеме число принятых символов подсчитывается опять. Однако, этот метод имеет существенный недостаток: счетчик символов может быть искажен при передаче. Тогда принимающая сторона не сможет обнаружить границы кадра. Даже обнаружив не совпадение контрольных сумм, принимающая сторона не сможет сообщить передающей какой кадр надо переслать, сколько символов пропало. Этот метод ныне используется редко.
Рис1.3 Поток символов: без ошибок (а); с одноц ошибкой (б)
Второй метод построен на вставке специальных символов. Обычно для этого используют аж последовательность DLE STX для начала кадра и DLE ETX для конца кадра. DLE - Data Link Escape; STX - Start TeXt, ETX - End TeXt. При этом методе если даже была потеряна граница текущего кадра, надо просто искать ближайшую последовательность DLE STX или DLE ETX. Здесь есть одна опасность: при передаче чисел или программы в объектном коде такие последовательности могут уже содержаться в передаваемых данных. Для решения этой проблемы используется прием экранирования: каждая последовательность DLE просто дублируется в передаваемых данных. Поэтому при приеме если есть два последовательных DLE, то один удаляется. Этот метод проиллюстрирован на Рис1.4.
Рис1.4 Кадр, ограниченный длаговыми байтами (а); кадр, обработанный на канальном уровне (б); данные, передаваемые на сетевой уровень (в)
Основным недостатком этого метода является то, что он жестко связан с размером байта и кодировкой ASCII. По мере развития сетей эта связь становилась все более и более обременительной.
Был предложен новый прием, позволяющий использовать любое число битов на символ и любую кодировку. Его идея состоит в том, что каждый кадр начинается и заканчивается со специального флаг-байта: 01111110. Посылающая сторона встретив последовательно 5 единиц обязательно вставит 0. Принимающая сторона, приняв 5 последовательных единиц обязательно удалит следующий за ними 0. Если в передаваемых данных встретиться конфигурация флаг-байта, то она будет преобразована в конфигурацию 011111010. Этот метод иллюстрирует Рис1.5. Ясно что он прозрачен для сетевого уровня так, же как и метод вставки байтов.
Рис1.5 Битовое заполнение: исходные данные (а); данные на линии (б); данные, сохраненные в памяти после удаления вставленных битов (в)
Таким образом, кадр легко может быть распознан по флаг-байту. Если граница очередного кадра по какой-то причине была потеряна, то все что надо делать - ловить ближайший флаг-байт.
Последний метод используется там, где применяется специальная кодировка битов на физическом уровне. Например, для передачи одного бита используется два импульса. 1 кодируется как переход высокое-низкое, 0 - как низкое-высокое. Сочетания низкое-низкое или высокое-высокое не используются для передачи данных. Их то и используют для границ кадра. Так делают в стандарте IEEE 802 для ЛВС, который мы рассмотрим позже.
Наконец, на практике используют, как правило, комбинацию этих методов. Например, счетчик символов с одним из выше перечисленных. Тогда если число символов в кадру совпадает с кодировкой границы кадра, кадр считается переданным правильно.
Решив проблему разбиения на кадры, мы приходим к следующей проблеме: как обеспечить, чтобы кадры попадали на сетевой уровень по назначению и в надлежащей последовательности? Если для отправляющей стороны все равно в какой последовательности поступают кадры, то этой проблемы нет. Например, если нам нужен сервис без уведомления и соединения, но если нам нужен сервис с подтверждением и с соединением, то как быть?
Для решения этой проблемы устанавливают обратную связь между отправителем и получателем в виде кадра подтверждения. Если кадр-подтверждение несет положительную информацию, то считается что переданные кадры прошли нормально, если там сообщение об ошибке, то переданные кадры надо передать заново.
Однако, возможны случаи когда из-за ошибок в канале кадр исчезнет целиком. В этом случае получатель не будет реагировать ни как, а отправитель будет сколь угодно долго ждать подтверждения. Для решения этой проблемы на канальном уровне вводят таймеры. Когда передается очередной кадр, то одновременно устанавливается таймер на определенное время. Этого времени должно хватать на то, чтобы получатель получил кадр, а отправитель получил подтверждение. Если отправитель не получит подтверждение раньше, чем истечет время, установленное на таймере, то он будет считать, что кадр потерян и повторит его еще раз.
Однако, если кадр-подтверждение был утерян, то вполне возможно, что один и тот же кадр получатель получит дважды. Как быть? Для решения этой проблемы каждому кадру присваивают порядковый номер. С помощью этого номера получатель может обнаружить дубли.
Другой важной проблемой, которая решается на канальном уровне - управление потоком. Дело в том, что вполне может случиться, что отправитель будет слать кадры столь часто, что получатель не будет успевать их обрабатывать. Это может случиться если, например, машина-отправитель более мощная или загружена слабее, чем машина-получатель.
1.5. Обнаружение и исправление ошибок
В рассмотрении физической среды мы отмечали, что у беспроводных систем связи, аналоговых каналов, например, петля в телефонных системах, достаточно высокий уровень ошибок в канале. Поэтому ошибки при передаче- это реальность, которую надо обязательно учитывать.
В разных средах характер ошибок разный. Ошибки могут быть одиночные, а могут возникать группами, сразу по несколько. У групповых ошибок есть свои достоинства и недостатки. Достоинство заключается в следующем. Пусть данные передаются блоками по 1000 бит, а уровень ошибки 0,001 на бит. Если ошибки изолированные и независимые, то практически каждый блок будет содержать ошибку в среднем. Если же они
Для надежной передачи кодов было предложено два основных метода. Первый - внести избыточность в форме дополнительных битов в передаваемый блок данных так, чтобы, анализируя полученный блок, можно было бы указать где возникли искажения. Это, так называемые, коды с исправлением ошибок. Второй - внести избыточность, но лишь настолько, чтобы, анализируя полученные данные, можно было сказать есть в переданном блоке ошибки или нет. Это, так называемые, коды с обнаружением ошибок.
Пусть данные занимают
разрядов и мы добавляем разрядов как контрольные разряды. Нам надо передать слово длины , которое называют n-битовым кодословом. Пусть у нас есть два кодослова 10001001 и 10110001. С помощью операции EXCLUSIVE OR легко определить число различных разрядов. В данном случае их 3. Количество разных битов в двух кодословах называется расстоянием Хемминга. Поэтому если два кодослова находятся на расстоянии по Хеммингу, это значит, что надо преобразовать ровно разрядов, чтобы преобразовать одно кодослово в другое.