Nach dem oben beschriebenen Synchronisierungsfeld bestehen alle Pakete aus 8-Bit-Bytes, wobei das niedrigstwertige Bit zuerst übertragen wird. Das erste Byte ist ein PID-Byte (Packet Identifier). Die PID beträgt tatsächlich 4 Bit; Das Byte besteht aus der 4-Bit-PID, gefolgt von ihrem bitweisen Komplement. Diese Redundanz hilft, Fehler zu erkennen. (Beachten Sie auch, dass ein PID-Byte höchstens vier aufeinanderfolgende 1-Bits enthält und daher niemals Bit-Stuffing benötigt, selbst wenn es mit dem letzten 1-Bit im Synchronisierungsbyte kombiniert wird. Das OUT-PID-Byte endet jedoch mit drei aufeinanderfolgenden 1-Bits. Wenn also die folgende USB-Geräteadresse mit drei 1-Bits beginnt, ist Bit-Stuffing erforderlich.)
Es gibt drei Grundtypen von Paketen mit jeweils unterschiedlichem Format und CRC (Cyclic Redundancy Check):
Handshake-Pakete bestehen lediglich aus einem PID-Byte und werden im Allgemeinen als Antwort auf Datenpakete gesendet. Die drei Grundtypen sind ACK, was angibt, dass die Daten erfolgreich empfangen wurden, NAK, was angibt, dass die Daten zu diesem Zeitpunkt nicht empfangen werden können und erneut versucht werden sollten, und STALL, was angibt, dass das Gerät einen Fehler aufweist und nie in der Lage sein wird, Daten erfolgreich zu übertragen, bis eine Korrekturmaßnahme (z. B. Geräteinitialisierung) durchgeführt wird.
USB 2.0 fügte zwei zusätzliche Handshake-Pakete hinzu: NYET, das anzeigt, dass eine geteilte Transaktion noch nicht abgeschlossen ist, und ein ERR-Handshake, das anzeigt, dass eine geteilte Transaktion fehlgeschlagen ist.
Das einzige Handshake-Paket, das der USB-Host generieren kann, ist ACK; Wenn es nicht bereit ist, Daten zu empfangen, sollte es ein Gerät nicht anweisen, Daten zu senden.
Token-Pakete bestehen aus einem PID-Byte, gefolgt von 11 Adressbits und einem 5-Bit-CRC. Token werden nur vom Host gesendet, niemals vom Gerät.--
IN- und OUT-Token enthalten eine 7-Bit-Gerätenummer und eine 4-Bit-Funktionsnummer (für Multifunktionsgeräte) und weisen das Gerät an, DATAx-Pakete zu senden bzw. die folgenden DATAx-Pakete zu empfangen.
Ein IN-Token erwartet eine Antwort von einem Gerät. Die Antwort kann eine NAK- oder STALL-Antwort oder ein DATAx-Frame sein. Im letzteren Fall gibt der Host gegebenenfalls einen ACK-Handshake aus.
Auf einen OUT-Token folgt unmittelbar ein DATAx-Frame. Das Gerät antwortet je nach Bedarf mit ACK, NAK oder STALL.
SETUP funktioniert ähnlich wie ein OUT-Token, wird jedoch für die Ersteinrichtung des Geräts verwendet.
Jede Millisekunde (12.000 Bitzeiten mit voller Geschwindigkeit) überträgt der USB-Host ein spezielles SOF-Token (Start of Frame), das anstelle einer Geräteadresse eine um 11 Bit aufsteigende Framenummer enthält. Dies dient der Synchronisierung isochroner Datenflüsse. Hochgeschwindigkeits-USB-2.0-Geräte erhalten 7 zusätzliche doppelte SOF-Token pro Frame, die jeweils einen „Mikroframe“ von 125 µs einführen.
USB 2.0 hat einen PING-Token hinzugefügt, der ein Gerät fragt, ob es bereit ist, ein OUT/DATA-Paketpaar zu empfangen. Das Gerät antwortet je nach Bedarf mit ACK, NAK oder STALL. Dadurch entfällt die Notwendigkeit, das DATA-Paket zu senden, wenn das Gerät weiß, dass es nur mit NAK antworten wird.
USB 2.0 fügte außerdem einen größeren SPLIT-Token mit einer 7-Bit-Hub-Nummer, 12 Bit Steuerflags und einem 5-Bit-CRC hinzu. Dies wird verwendet, um geteilte Transaktionen durchzuführen. Anstatt den Hochgeschwindigkeits-USB-Bus zum Senden von Daten an ein langsameres USB-Gerät zu binden, empfängt der nächste Hochgeschwindigkeits-fähige Hub einen SPLIT-Token, gefolgt von einem oder zwei USB-Paketen mit hoher Geschwindigkeit, führt die Datenübertragung mit voller oder niedriger Geschwindigkeit durch und liefert die Antwort mit hoher Geschwindigkeit, wenn er von einem zweiten SPLIT-Token dazu aufgefordert wird. Die Details sind komplex; siehe USB-Spezifikation.
Datenpakete
Es gibt zwei grundlegende Datenpakete, DATA0 und DATA1. Beide bestehen aus einem DATAx-PID-Feld, 0–1023 Bytes Datennutzlast (bis zu 1024 bei hoher Geschwindigkeit, höchstens 8 bei niedriger Geschwindigkeit) und einem 16-Bit-CRC. Ihnen muss immer ein Adress-Token vorangestellt sein, und ihnen folgt normalerweise ein Handshake-Token vom Empfänger zurück zum Sender. Die beiden Pakettypen stellen die 1-Bit-Sequenznummer bereit, die für Stop-and-Wait-ARQ erforderlich ist. Wenn ein USB-Host keinen empfängt Bei der Übertragung einer Antwort (z. B. einer Bestätigung) für die von ihm gesendeten Daten ist nicht bekannt, ob die Daten während der Übertragung verloren gegangen sind oder ob sie empfangen wurden, die Handshake-Antwort jedoch verloren gegangen ist.
Um dieses Problem zu lösen, verfolgt das Gerät den Typ des zuletzt akzeptierten DATAx-Pakets. Wenn es ein weiteres DATAx-Paket desselben Typs empfängt, wird es bestätigt, aber als Duplikat ignoriert. Es wird tatsächlich nur ein DATAx-Paket des entgegengesetzten Typs empfangen.
Wenn ein Gerät mit einem SETUP-Paket zurückgesetzt wird, erwartet es als nächstes ein DATA0-Paket.
USB 2.0 fügte auch die Pakettypen DATA2 und MDATA hinzu. Sie werden nur von Hochgeschwindigkeitsgeräten verwendet, die isochrone Übertragungen mit hoher Bandbreite durchführen und mehr als 1024 Bytes pro 125 µs „Mikroframe“ (8192 kB/s) übertragen müssen.
PRE „Paket“
Geräte mit niedriger Geschwindigkeit werden mit einem speziellen PID-Wert, PRE, unterstützt. Dies markiert den Anfang eines Pakets mit niedriger Geschwindigkeit und wird von Hubs verwendet, die normalerweise keine Pakete mit voller Geschwindigkeit an Geräte mit niedriger Geschwindigkeit senden. Da alle PID-Bytes vier 0-Bits enthalten, verlassen sie den Bus im K-Zustand mit voller Geschwindigkeit, der mit dem J-Zustand mit niedriger Geschwindigkeit identisch ist. Es folgt eine kurze Pause, in der die Hubs ihre Low-Speed-Ausgänge aktivieren, die sich bereits im J-Zustand befinden. Anschließend folgt ein Low-Speed-Paket, das mit einer Synchronisierungssequenz und einem PID-Byte beginnt und mit einer kurzen SE0-Periode endet. Andere Full-Speed-Geräte als Hubs können das PRE-Paket und seinen Low-Speed-Inhalt einfach ignorieren, bis der letzte SE0 anzeigt, dass ein neues Paket folgt.