Bulk обеспечивает передачу данных с подтверждением и повторной передачей в случае возникновения ошибок (гарантированная доставка). При этом данные передаются потоком один пакет вслед за другим. Каждый bulk endpoint в устройстве имеет тип IN либо OUT и соответственно предназначен для передачи данных только в одном направлении. Ответ NACK от устройства на token пакет означает что пакет получен без ошибок оно еще не готово к приему или передаче данных и поэтому хосту следует повторить попытку через некоторе время. Соответственно ответ NACK на пакет с данными от хоста (OUT) означает
что данные хост должен послать данные еще раз несколько позже. Если устройство довольно медленное, то последнее может приводить к неоправданному расходу пропускной способности шины! Поэтому в USB2.0 предусмотрен специальный тип пакетов ping, предназначенных для проверки состояния готовности устройства. Благодаря этому механизму, хост может не производить повторную посылку пакета данных пока не получит информацию о готовности устройства.
В случае если какой-либо пакет требует повторной передачи (ответный handshake пакет не получен) хост может попытаться произвести повторную посылку или прием пакета. Ответ handshake STALL означает что произошла ошибка, требующая вмешательства ПО для восстановления состояния устройства. При успешном получении пакета данных хост так же отвечает устройству АСК.
Процедура передачи пакета (как мы видели) делится на три стадии: token, data и handshake. Весь этот механизм обеспечивает гарантированную доставку пакетов в течении не гарантированного времени. На практике это означает что ошибки передачи выливаются в увеличенное время, поэтому устройства кторым необходим непрерывный поток данных не содержащих ошибки (например такие как устройства зсписи CDROM) должны иметь достаточно большой внутренний буфер для компенсации временных задержек, кроме того они должны стараться держать этот буфер заполненным (в частности начинать процесс записи только после того, как получат от хоста достаточный объем данных). Кроме того, на примере CDR/W, скорость записи на диск должна быть не слишком высокой чтобы подкачка оставшихся данных в буфер могла быть произведена за время записи данных, уже находящихся в буфере. Понятно что выполнение этих условий сильно зависит от скорости передачи, общего количества передаваемых данных и объема буфера и в принципе поддается оценке в каждом конкретном случае. Поэтому если мы хотим избежать "игры в Русскую рулетку" нам следует выбрать скорость записи ниже средней скорости передачи bulk через шину USB. Последнее, в силу того что каналы bulk не имеют выделенной специально под каждый канал полосы пропускания на шине а конкурируют за нее в процессе работы, вообще говоря не избавляет нас от возможных проблем, связанных с наличием других устройств (которые могут в самый неподходящий момент захотеть передать большой объем информации). Тут невольно хочется вспомнить времена старого доброго однозадачного DOS. Следующий рисунок иллюстрирует транзакции типа bulk.
Bulk транзакции
Bulk обеспечивает передачу данных с подтверждением и повторной передачей в случае возникновения ошибок (гарантированная доставка). При этом данные передаются потоком один пакет вслед за другТакже по теме: