Come quasi ogni altro tipo di interfaccia di comunicazione, l'USB è implementato come stack di protocollo. I livelli all'interno di questo stack che sono comuni a tutti o più tipi di dispositivi sono definiti dagli stessi standard USB, che entrambi consentono la compatibilità e impediscono a ciascun dispositivo di progettare un protocollo ridondante. Inoltre, ogni livello del protocollo estrae i dettagli di cui il livello successivo non deve preoccuparsi. Quindi, quando stai effettivamente scrivendo il livello specifico del dispositivo, hai solo funzioni generiche di "invio" e "ricezione" che ottengono i dati dall'endpoint A all'endpoint B. Tu, come progettista del dispositivo, non devi preoccuparti come succede. Inoltre, livelli inferiori all'interno dello stack di protocollo possono cambiare l'implementazione purché espongano un'interfaccia comune al livello sopra di essi. In questo modo, quando una parte dello stack del protocollo cambia, il resto dello stack non deve necessariamente cambiare.quale protocollo viene utilizzato a un livello inferiore dello stack. In linea generale, ogni livello consecutivo nello stack incapsulerà il messaggio prodotto dal livello più alto successivo all'interno del proprio campo di payload quando viene inviato un messaggio. Quando viene ricevuto un messaggio, ogni livello si stacca dalla parte relativa a quel livello e inoltra il suo payload al livello appropriato successivo nella pila. Questo è vero, non solo USB, ma quasi tutti i bus di comunicazione. Lo stack TCP / IP / Ethernet è probabilmente il più comunemente usato, ad esempio. Le attività di cui i livelli specifici sono comunemente responsabili sono descritte in modelli, come il modello OSI .
In USB, esiste un protocollo di livello fisico che definisce gli stati di tensione / temporizzazione / ecc. sul filo e come dovrebbero essere interpretati. Questo protocollo deve ovviamente far parte degli standard USB stessi, non specifici per un determinato dispositivo (soprattutto perché l'host non ha modo di sapere quale tipo di dispositivo sta per essere collegato a una determinata porta USB.)
Successivamente, c'è un protocollo di gestione del bus, usato per descrivere chi può parlare sul bus quando. Questo è chiamato livello di accesso ai media nel modello OSI. In USB questo livello può praticamente essere riassunto come "il dispositivo può trasmettere quando l'host gli dice di farlo", quindi non esiste un protocollo particolarmente complicato su questo livello in USB.
Successivamente, c'è un protocollo standard per descrivere un pacchetto di dati e come dovrebbero essere instradati dal mittente al destinatario. Questo livello deve anche far parte dello standard USB stesso, in modo che la comunicazione iniziale per scoprire quale tipo di dispositivo è stato collegato possa avvenire prima che il tipo specifico di dispositivo sia effettivamente conosciuto dall'host. Oltre a ciascun dispositivo con un ID specifico in questo livello, esiste anche il concetto in USB di un ID endpoint. Ciò consente a un determinato dispositivo di avere più endpoint USB, che sono multiplexati e demultiplati dallo stack USB standard, più o meno allo stesso modo in cui i socket sono multiplexati e demultiplati dallo stack TCP / IP standard. Un'applicazione può trattare ciascuno di questi endpoint come flussi di dati separati.
Infine, c'è il protocollo definito per il dispositivo stesso. Si noti che in realtà ce ne sono alcuni pre-progettati comuni inclusi come parte dello standard USB per casi d'uso comuni, come dispositivi di archiviazione di massa, mouse, tastiere, ecc., In modo che ogni produttore di dispositivi non debba reinventare il ruota. Tuttavia, i dispositivi più complicati sono liberi di progettare il proprio protocollo personalizzato a questo livello. L'output di questo layer per una determinata trasmissione viene passato come payload di un pacchetto di dati nel layer precedente. Si noti che, per dispositivi sufficientemente complicati, la parte specifica del protocollo del dispositivo può essere divisa in più livelli indipendenti, ma i livelli inferiori non devono saperlo o preoccuparsene. Tutto quello che devono sapere è che devono passare un determinato set di byte dall'host a un particolare endpoint del dispositivo o da un particolare endpoint del dispositivo all'host. Ancora una volta, avere l'interfaccia standard tra i livelli consente la separazione delle preoccupazioni, quindi un livello non deve preoccuparsi del funzionamento interno di un altro livello, ma solo i dati specifici a cui dovrebbe passare o aspettarsi di ricevere dai livelli immediatamente sopra o sotto di esso nello stack.