Dopo il campo di sincronizzazione sopra descritto, tutti i pacchetti sono costituiti da byte da 8 bit, trasmettendo per primo il bit meno significativo. Il primo byte è un byte identificatore di pacchetto (PID). Il PID è in realtà a 4 bit; il byte è costituito dal PID a 4 bit seguito dal suo complemento bit a bit. Questa ridondanza aiuta a rilevare gli errori. (Si noti inoltre che un byte PID contiene al massimo quattro bit 1 consecutivi e quindi non avrà mai bisogno di bit stuffing, anche se combinato con l'ultimo bit 1 nel byte di sincronizzazione. Tuttavia, il byte PID OUT termina con tre bit 1 consecutivi, quindi se il seguente indirizzo del dispositivo USB inizia con tre bit 1, sarà richiesto il bit stuffing.)
I pacchetti sono disponibili in tre tipi base, ciascuno con formato e CRC (controllo di ridondanza ciclico) diversi:
I pacchetti di handshake non sono costituiti altro che da un byte PID e vengono generalmente inviati in risposta a pacchetti di dati. I tre tipi di base sono ACK, che indica che i dati sono stati ricevuti con successo, NAK, che indica che i dati non possono essere ricevuti in questo momento e devono essere ritentati, e STALL, che indica che il dispositivo ha un errore e non sarà mai in grado di trasferire i dati con successo finché non viene eseguita un'azione correttiva (come l'inizializzazione del dispositivo).
USB 2.0 ha aggiunto due pacchetti di handshake aggiuntivi, NYET che indica che una transazione divisa non è ancora completata e un handshake ERR per indicare che una transazione divisa non è riuscita.
L'unico pacchetto di handshake che l'host USB può generare è ACK; se non è pronto a ricevere dati, non dovrebbe istruire un dispositivo a inviarne alcuno.
I pacchetti token sono costituiti da un byte PID seguito da 11 bit di indirizzo e un CRC a 5 bit. I token vengono inviati solo dall'host, mai da un dispositivo.--
I token IN e OUT contengono un numero di dispositivo a 7 bit e un numero di funzione a 4 bit (per dispositivi multifunzione) e comandano al dispositivo di trasmettere rispettivamente pacchetti DATAx o di ricevere i successivi pacchetti DATAx.
Un token IN prevede una risposta da un dispositivo. La risposta può essere una risposta NAK o STALL o un frame DATAx. In quest'ultimo caso, l'host emette un handshake ACK, se appropriato.
Un token OUT è seguito immediatamente da un frame DATAx. Il dispositivo risponde con ACK, NAK o STALL, a seconda dei casi.
SETUP funziona in modo molto simile a un token OUT, ma viene utilizzato per la configurazione iniziale del dispositivo.
Ogni millisecondo (12000 bit time a piena velocità), l'host USB trasmette uno speciale token SOF (inizio frame), contenente un numero di frame incrementale di 11 bit al posto dell'indirizzo del dispositivo. Viene utilizzato per sincronizzare i flussi di dati isocroni. I dispositivi USB 2.0 ad alta velocità ricevono 7 token SOF duplicati aggiuntivi per frame, ciascuno dei quali introduce un "microframe" da 125 µs.
USB 2.0 ha aggiunto un token PING, che chiede a un dispositivo se è pronto a ricevere una coppia di pacchetti OUT/DATA. Il dispositivo risponde con ACK, NAK o STALL, a seconda dei casi. Ciò evita la necessità di inviare il pacchetto DATI se il dispositivo sa che risponderà semplicemente con NAK.
USB 2.0 ha anche aggiunto un token SPLIT più grande con un numero di hub a 7 bit, 12 bit di flag di controllo e un CRC a 5 bit. Viene utilizzato per eseguire transazioni frazionate. Invece di impegnare il bus USB ad alta velocità inviando dati a un dispositivo USB più lento, l'hub ad alta velocità più vicino riceve un token SPLIT seguito da uno o due pacchetti USB ad alta velocità, esegue il trasferimento dei dati a piena o bassa velocità e fornisce la risposta ad alta velocità quando richiesto da un secondo token SPLIT. I dettagli sono complessi; vedere le specifiche USB.
Pacchetti di dati
Esistono due pacchetti dati di base, DATA0 e DATA1. Entrambi sono costituiti da un campo PID DATAx, da 0 a 1023 byte di carico utile di dati (fino a 1024 ad alta velocità, al massimo 8 a bassa velocità) e un CRC a 16 bit. Devono sempre essere preceduti da un token di indirizzo e solitamente sono seguiti da un token di handshake dal ricevitore al trasmettitore. I due tipi di pacchetti forniscono il numero di sequenza di 1 bit richiesto da Stop-and-wait ARQ. Se un host USB non riceve una risposta (come un ACK) per i dati trasmessi, non sa se i dati sono stati ricevuti o meno durante il transito, oppure potrebbero essere stati ricevuti ma la risposta di handshake è andata persa;
Per risolvere questo problema, il dispositivo tiene traccia del tipo di pacchetto DATAx accettato per ultimo. Se riceve un altro pacchetto DATAx dello stesso tipo, viene riconosciuto ma ignorato come duplicato. In realtà viene ricevuto solo un pacchetto DATAx del tipo opposto.
Quando un dispositivo viene ripristinato con un pacchetto SETUP, si aspetta successivamente un pacchetto DATA0.
USB 2.0 ha aggiunto anche i tipi di pacchetto DATA2 e MDATA. Vengono utilizzati solo da dispositivi ad alta velocità che eseguono trasferimenti isocroni a larghezza di banda elevata che devono trasferire più di 1024 byte per "microframe" da 125 µs (8192 kB/s).
PRE "pacchetto"
I dispositivi a bassa velocità sono supportati con un valore PID speciale, PRE. Questo segna l'inizio di un pacchetto a bassa velocità e viene utilizzato dagli hub che normalmente non inviano pacchetti a piena velocità a dispositivi a bassa velocità. Poiché tutti i byte PID includono quattro bit 0, lasciano il bus nello stato K a piena velocità, che è uguale allo stato J a bassa velocità. È seguito da una breve pausa durante la quale gli hub abilitano le loro uscite a bassa velocità, già inattive nello stato J, quindi segue un pacchetto a bassa velocità, che inizia con una sequenza di sincronizzazione e un byte PID e termina con un breve periodo di SE0. I dispositivi a piena velocità diversi dagli hub possono semplicemente ignorare il pacchetto PRE e i suoi contenuti a bassa velocità, finché il SE0 finale non indica che segue un nuovo pacchetto.