Контроль достоверности передачи данных — это возможность обнаружения, а иногда и исправления ошибок, возникающих при передаче. Этот контроль реализован далеко не во всех интерфейсах: где-то достоверность не очень важна, где-то вероятность возникновения ошибок пренебрежимо мала. В новых интерфейсах контролю достоверности уделяется серьезное внимание, поскольку они, как правило, рассчитываются на экстремальные условия работы (высокие частоты, большие расстояния, наличие помех).
Проверка на четность (parity check) — простейший способ обнаружения ошибок. Здесь к каждому передаваемому элементу информации (как правило, байту или слову) добавляется бит четности (parity), дополняющий число единичных информационных битов до четного (even parity) или нечетного (odd parity). Приемник проверяет количество единичных битов, включая контрольный, на четность (или нечетность, в зависимости от соглашения) и в случае несоответствия считает принятые данные искаженными. Проверка четности — самый примитивный и неэффективный вариант контроля достоверности; при заметных накладных расходах (обычно 1 бит на каждый байт) в ходе этой проверки не выявляются все ошибки четной кратности (искажения четного числа битов). Проверка четности применяется в последовательных интерфейсах (СОМ-порт), шине SCSI; раньше она применялась и для памяти.
Дублирование информации — еще более расточительный (но и более надежный) способ контроля, применяемый для небольших объемов информации. Здесь каждый информационный элемент (обычно битовое поле длиной в несколько битов) повторяется дважды, причем одна из копий может передаваться в инверсном виде. Несовпадение принятых копий считается ошибкой. Так, нацример, защищаются идентификаторы пакетов в USB. Развитие этой идеи — трехкратное повторение блока: если из трех принятых копий две совпали, то их считают верными (это можно считать и исправлением ошибки). Данный способ применяется в радиоинтерфейсе Bluetooth.
Более сложный, но и более эффективный вариант контроля — вычисление циклического избыточного кода (Cyclic Redundant Code, CRC) и добавление его к передаваемой информации. Так, 16-битный CRC-код способен с очень высокой вероятностью обнаружить ошибки в блоках данных размером до 4 Кбайт. Подсчет CRC удобно выполнять при последовательной передаче данных — для этого требуются несложные аппаратные схемы (регистр сдвига с обратными связями). При параллельной передаче (и программно на процессоре общего назначения) подсчет CRC трудоемок. Тем не менее CRC-контроль применяется и в параллельном интерфейсе IDE/ AT А, но только в режимах UltraDMA (в других режимах передачи на этой шине никак не контролируются).
Для исправления ошибок передачи применяют коды с исправлением ошибок (Error Checking and Correction, ECC). Идея заключается в подсчете нескольких проверочных битов, каждый из которых вычисляется по правилам контроля четности для определенных групп информационных битов. Специальное разделение на группы (они пересекаются) позволяет по принятым информационным и проверочным битам обнаруживать и даже исправлять ошибки. Число проверочных битов зависит от числа информационных битов и желаемой кратности (числа искаженных битов) исправляемых и обнаруживаемых ошибок. Так, для исправления однократных и обнаружения всех двукратных ошибок (и подавляющего большинства ошибок большей кратности) для 8 информационных битов требуется 4 проверочных, для 16 — 5, для 32 — 6, для 64 — 7 проверочных битов. ЕСС-коды широко применяются для контроля памяти (особенно кэшпамяти) и в ряде интерфейсов (например, PCI-X).
Под обеспечением надежности передачи понимается доведение до инициатора транзакции сведений о состоянии ее выполнения (успешно-неуспешно), что позволяет ему в случае неуспеха предпринять какие-то специальные действия (например, попытку повтора). Ряд интерфейсов (и протоколов) не обеспечивает надежности: так, на шине ISA возможно даже обращение к несуществующему устройству. При этом операции записи идут просто «в никуда», а операции чтения обычно возвращают «пустые» данные (FFh), которые инициатор не может отличить от настоящих. Шина PCI является надежной: инициатор всегда знает судьбу своих транзакций; достоверность передач проверяется (по четности или ЕСС).
Во многих случаях возникает задача согласования темпа работы устройств, связанных интерфейсом, которая решается с помощью механизмов квитирования или/и управления потоком.
Квитирование — это взаимное подтверждение отдельных шагов протокола обоими участниками транзакции, что позволяет согласовать темп работы инициатора й целевого устройства. Квитирование широко применяется в параллельных интерфейсах (в том же LPT-порте, шинах расширения), для чего используются специальные интерфейсные линии.
Управление потоком — это уведомление источника (передатчика) данных о возможностях их приема противоположной стороной: если приемник не успевает обрабатывать приходящие данные, он «просит» передатчик приостановить передачу на определенное время или до особого разрешения.
В тех интерфейсах, где имеется квитирование, отдельная задача управления потоком, как правило, не возникает (квитирование обеспечивает и согласование темпа). В последовательных интерфейсах без управления потоком в общем случае не обойтись; в СОМ-порте имеются даже два варианта протокола управления потоком.