Кадрирование
Поскольку задача канального уровня заключается в доставке кадров через канал, он также должен быть в состоянии определить, где в этом потоке битов начинается и заканчивается каждый кадр. Кадрирование кадров является отличным, и совершенно независимым требованием от кадрирования битов, и это одна из причин того, что некоторые модели сети делят канальный уровень на два уровня, нижний уровень, который управляет физическими аспектами отправки и получения отдельных битов и верхний уровень, который реализует стратегию транспортировки целых кадров.
Существует множество способов кадрирования кадров. Один простой способ - выбрать в качестве разметки разделителя кадров некоторую последовательность битов, например, семь разрядов подряд. Отправитель просто вставляет эту метку в поток битов в конце каждого кадра. Всякий раз, когда эта схема появляется в полученных данных, приемник принимает ее, чтобы отметить конец предыдущего кадра, и предполагает, что все последующие биты относятся к следующему кадру. Эта схема хорошо работает, пока поток данных о полезной нагрузке никогда не содержит выбранного шаблона битов.
Вместо того чтобы объяснять более высоким уровням сети, что они не могут передавать определенные шаблоны битов, канальный уровень реализует метод, известный как набивка битов. Передающий конец канального слоя, помимо вставки отметки кадр-сепаратор между кадрами, проверяет сам поток данных, и если он обнаруживает шесть раз подряд, то в поток засовывает дополнительный бит, равный нулю. Приемник, в свою очередь, следит за входящим потоком битов для длинных строк из них. Когда он видит шесть разрядов подряд, он исследует следующий бит, чтобы решить, что делать. Если седьмой бит равен нулю, приемник отбрасывает нулевой бит, тем самым меняя порядок заполнения, выполняемого отправителем. Если седьмой бит равен единице, то приемник принимает семь битов в качестве разделителя кадров.
На рисунке показана простая псевдокодовая реализация процедуры отправки кадра с набивкой битов, а на рисунке показана соответствующая процедура на принимающей стороне канала. (Для простоты иллюстрированная процедура получения игнорирует два важных соображения). Во-первых, приемник использует только один буфер кадров. Лучшая реализация будет иметь несколько буферов, чтобы получить следующий кадр при обработке текущего. Во-вторых, тот же поток, который получает бит, также выполняет протокол сетевого уровня, вызывая LINK_RECEIVE. Лучшая реализация, вероятно, НЕ ПРИНИМАЕТСЯ, чтобы отдельный поток вызывал протокол более высокого уровня, и этот поток продолжал бы обрабатывать больше входящих битов.
Фаршировка битов является одним из многих способов кадрирования кадров. Нет необходимости исследовать все возможные альтернативы, потому что кадрирование легко задается и передается исполнителю канального уровня - весь канальный уровень, наряду с кадрированием битов, часто выполняется в аппаратном обеспечении, так что теперь мы переходим к другим вопросам.
Обработка ошибок
Важным вопросом является то, что должна делать принимающая сторона канального уровня с битами, которые приходят с сомнительными значениями. Поскольку обычная конструкция толкает скорость передачи данных по каналу связи до тех пор, пока приемник едва может отличить единицы от нулей, даже небольшое количество дополнительного шума может привести к ошибкам в принимаемом битовом потоке.
Первая и, возможно, самая важная линия защиты при работе с ошибками передачи - это требование, чтобы конструкция канала связи была хороша для обнаружения таких ошибок, когда они возникают. Обычным методом является кодирование данных с помощью кода обнаружения ошибок, что влечет за собой добавление небольшого количества избыточности. Простой формой такого кода является расчет передатчиком контрольной суммы и размещение контрольной суммы в конце каждого кадра. Как только приемник получает полный кадр, он пересчитывает контрольную сумму и сравнивает ее результат с копией, которая идет с кадром. Тщательно продумав алгоритм контрольной суммы и сделав количество битов в контрольной сумме достаточно большим, можно сделать вероятность не обнаружить ошибку столь низкой, как хотелось бы. Более интересная проблема заключается в том, что делать при обнаружении ошибки. Есть три альтернативы:
- Попросите отправителя кодировать передачу с помощью кода исправления ошибок, который является достаточно избыточным для того, чтобы приемник мог идентифицировать и исправить отдельные биты, содержащие ошибки. Этот метод широко используется в ситуациях, когда шумовое поведение канала передачи хорошо известно и избыточность может быть направлена на исправление наиболее вероятных ошибок. Например, компактные мембраны записываются с помощью кода исправления ошибок, специально разработанного для того, чтобы особенно хорошо справляться с пылью и царапинами.
- Попросите отправителя повторно передать кадр, содержащий ошибку. Эта альтернатива требует, чтобы отправитель держал кадр в буфере до тех пор, пока у получателя не появится возможность пересчитать и сравнить его контрольную сумму. Отправитель должен знать, когда безопасно повторно использовать этот буфер для другого кадра. В большинстве таких конструкций приемник однозначно подтверждает правильность (или неправильность) получения каждого кадра. Если время распространения от отправителя к получателю длительное по сравнению со временем, необходимым для отправки одного кадра, в полете может быть несколько кадров, и подтверждения (особенно те, которые просят о ретрансляции) являются разрушительными. При высокопроизводительном соединении явная система подтверждения может быть удивительно сложной.
- Позвольте приемнику сбросить кадр. Эта альтернатива является разумным выбором в свете нашего наблюдения (о том, что перегрузка на более высоких уровнях сети должна быть устранена путем отбраковки пакетов в любом случае). Какой бы протокол более высокого уровня ни использовался для работы с этими отбракованными пакетами, он также позаботится о любых кадрах, которые будут отбраковываться, поскольку они содержат ошибки.
В реальной жизни такие методы часто сочетаются, например, путем применения отправителем простого кода исправления ошибок, который выявляет и исправляет наиболее распространенные ошибки и надежно обнаруживает и сообщает о любых более сложных и непоправимых ошибках, а затем путем удаления получателем кадров, которые невозможно исправить с помощью кода исправления ошибок.