Для всех схем, которые кодируют биты в символы, приемник, чтобы правильно расшифровывать биты, должен знать, когда символ заканчивается и начинается следующий символ. С NRZ, в котором символы — просто уровни напряжения, несколько подряд нулей или единиц оставляют сигнал неизменным. Через некоторое время трудно отделить биты, поскольку 15 нулей очень напоминают 16 нулей, если у вас нет очень точных часов.
Точные часы помогли бы с этой проблемой, но они — дорогое решение для массового оборудования. Помните, мы распределяем биты во времени по линиям связи, которые работают на высоких скоростях (много мегабит в секунду), таким образом, часы должны были бы отклоняться меньше чем на долю микросекунды в течение долгой работы. Это могло бы быть разумно для медленных каналов или коротких сообщений, но это не общее решение.
Одна из стратегий состоит в том, чтобы послать в приемник отдельный сигнал часов. Отдельная линия для часов — это не сложно для компьютерных шин или коротких кабелей, в которых есть много параллельных линий, но это расточительно для большинства сетевых каналов: если бы у нас была еще одна линия, чтобы послать сигнал, то мы могли бы использовать ее, чтобы послать данные. Здесь следует исхитриться смешать сигнал часов с сигналом данных и объединить их с помощью «исключающего или» так, чтобы никакая дополнительная линия не была необходима. Результат показан на рис. 2.17, г. Часы выполняют передачу сигнала часов в каждый момент прохождения бита, таким образом, это работает на скорости два битрейта. Когда сигнал часов объединяется с уровнем 0, происходит переход низкий-к-высокому, который является просто часами. Этот переход — логический 0. Когда он объединяется с уровнем 1, инвертируется и происходит переход от высокого к низкому. Этот переход — логическая 1. Эту схему называют Манчестерским кодированием, она использовалась для классического Ethernet.
Недостаток Манчестерского кодирования в том, что из-за часов требуется вдвое большая полоса пропускания, чем для NRZ, а мы знаем, что эта полоса часто важна. Другая стратегия основана на идее, что мы должны кодировать данные, чтобы гарантировать, что в сигнале есть достаточно много переходов. Предположим, что у NRZ будут проблемы синхронизации только для долгих последовательностей нулей или единиц. Если переходы будут происходить часто, то приемнику будет легко остаться синхронизированным с поступающим потоком символов.
В качестве шага в правильном направлении, мы можем упростить ситуацию, кодируя 1 как переход и 0 как отсутствие перехода, или наоборот. Это кодирование называют NRZI (Без возвращения к нулю с инверсией). Пример показан на рис. 2.17,
USB (Универсальная последовательная шина) — использует NRZI. В этом случае длинные последовательности единиц не вызывают проблему.
Конечно, длинные последовательности нулей все еще вызывают проблему, которую мы должны решить. Если бы мы были телефонной компанией, то могли бы просто потребовать, чтобы отправитель не передал слишком много нулей подряд. Более старые цифровые телефонные линии в США, названные линиями T1, действительно фактически требовали, чтобы по ним посылали не больше чем 15 последовательных нулей, чтобы работать правильно. Чтобы действительно решить проблему, мы можем разбить последовательности нулей, отображая небольшие группы битов, которые будут переданы так, чтобы группы с последовательным нулями были отображены на немного более длинные образцы, у которых нет слишком длинных последовательностей нулей.
Один из известных кодов для этого называется 4B/5B. Каждые 4 бита отображены в 5-битовый образец с заданной таблицей преобразования. Эти пять комбинаций двоичных разрядов выбраны так, чтобы никогда не встречались больше трех последовательных нулей. Отображение показано в табл. 2.4. Эта схема добавляет 25 % накладных расходов, что лучше чем 100 % при Манчестерском кодировании. Так как имеется 16 входных комбинаций и 32 выходных комбинации, некоторые из выходных комбинаций не используются. За вычетом комбинаций со слишком многими последовательными нулями остаются еще некоторые. В качестве награды мы можем использовать эти коды, не соответствующие данным, чтобы представить управляющие сигналы физического уровня. Например, иногда «11111» обозначает свободную линию, а «11000» обозначает начало фрейма.
Таблица 2.4. Отображение 4B/5B
Данные (4B)
Ключевое слово (5B)
Данные (4B)
Ключевое слово (5B)
0000
11110
1000
10010
0001
01001
1001
10011
0010
10100
1010
10110
0011
10101
1011
10111
0100
01010
1100
11010
0101
01011
1101
11011
0110
01110
1110
11100
0111
01111
1111
11101