Второй метод формирования кадров решает проблему восстановления синхронизации после сбоя при помощи маркировки начала и конца каждого кадра специальными байтами. Зачастую в качестве разделителя используется один и тот же байт, называемый флаговым. Он устанавливается в начале и в конце кадра. Этот байт помечен на рис. 3.4,
Рис. 3.3. Поток байтов:
Однако одна проблема все же остается. В передаваемых данных, особенно если это двоичные данные, такие как фотографии или музыка, запросто может встретиться последовательность, используемая в качестве флагового байта. Возникновение такой ситуации, скорее всего, собьет синхронизацию. Одним из способов решения проблемы является добавление специального escape-символа (знака переключения кода, ESC) непосредственно перед случайно совпавшим флаговым байтом внутри кадра. Таким образом, настоящий флаг можно отличить от «подложного» по наличию или отсутствию перед ним ESC. Канальный уровень получателя вначале убирает эти escape-символы, затем передает кадр на сетевой уровень. Такой метод называется символьным заполнением (byte stuffing).
Следующий логичный вопрос: а что если и символ ESC случайно окажется среди прочих данных? Решение такое же: вставить перед этим фиктивным escape-символом настоящий. На стороне получателя первый символ ESC будет удален, а следующий байт данных останется, даже если это еще один байт ESC или флаговый байт. Некоторые примеры показаны на рис. 3.4,
Схема символьного заполнения, показанная на рис. 3.4, — это немного упрощенная модель протокола PPP (Point-to-Point Protocol, протокол «точка-точка»), с помощью которого пакеты передаются по коммуникационным каналам. Мы изучим PPP в конце этой главы.
Третий метод разделения потока битов на кадры позволяет обойти недостатки символьного заполнения, которое обязывает использовать исключительно 8-битные байты. Делить данные на кадры можно на уровне бит, причем кадры могут содержать произвольное число бит и состоять из блоков любого размера. Данный метод был разработан для некогда популярного протокола HDLC (High-level Data Link Control — высокоуровневый протокол управления каналом передачи данных). Каждый кадр начинается и завершается специальной последовательностью бит, 01111110 (или 0x7E в шестнадцатеричной системе). Это все тот же флаговый байт. Если в битовом потоке передаваемых данных встретится пять идущих подряд единиц, уровень передачи данных автоматически вставит в выходной поток нулевой бит. Битовое заполнение (bit stuffing) аналогично символьному, при котором в кадр перед случайно встретившимся среди данных флагом вставляется escape-символ. Он также гарантирует минимальную плотность передачи, помогающую сохранять синхронизацию на физическом уровне. По этой причине битовое заполнение применяется в протоколе USB (Universal Serial Bus — универсальная последовательная шина).
Рис. 3.4. Кадр, ограниченный флаговыми байтами
Когда принимающая сторона встречает пять единиц подряд, за которыми следует ноль, она автоматически удаляет этот ноль. Битовое заполнение, как и символьное, является абсолютно прозрачным для сетевого уровня обоих компьютеров. Если флаговая последовательность битов (01111110) встречается в данных пользователя, она передается в виде 011111010, но в памяти принимающего компьютера сохраняется опять в исходном виде: 01111110. На рис. 3.5 приведен пример битового заполнения.
Благодаря битовому заполнению границы между двумя кадрами могут быть безошибочно распознаны с помощью флаговой последовательности. Таким образом, если приемная сторона потеряет границы кадров, ей нужно всего лишь отыскать в полученном потоке битов флаговый байт, поскольку он встречается только на границах кадров и никогда — в данных пользователя.
Побочный эффект как битового, так и байтового заполнения заключается в том, что длина кадра зависит от содержимого, то есть от входящих в него данных. Например, если в данных флаговых байт нет, то 100 байт данных можно передать в кадре размером приблизительно 100 байт. Если же данные состоят исключительно из флаговых байт, то перед каждым таким байтом вставляется специальный символ, и длина кадра