Como quase todos os outros tipos de interface de comunicação, o USB é implementado como um protocolo pilha . Os níveis dentro dessa pilha que são comuns a todos ou a vários tipos de dispositivos são definidos pelos próprios padrões USB, que permitem compatibilidade e impedem que cada dispositivo faça um projeto de protocolo redundante. Além disso, cada camada do protocolo abstrai detalhes que a próxima camada não precisa se preocupar. Então, quando você está realmente escrevendo a camada específica do dispositivo, você só tem funções genéricas de 'enviar' e 'receber' que obtêm dados do ponto de extremidade A para o ponto de extremidade B. Você, como designer de dispositivo, não precisa se preocupar como isso acontece. Além disso, níveis mais baixos dentro da pilha de protocolos podem mudar a implementação, desde que exponham uma interface comum à camada acima deles. Dessa forma, quando uma parte da pilha de protocolos é alterada, o restante da pilha não precisa necessariamente mudar. Idealmente, os protocolos em níveis mais altos da pilha nem precisam se preocupar exatamente com o qual protocolo está sendo usado em algum nível inferior da pilha. De um modo geral, cada camada consecutiva ao longo da pilha encapsulará a mensagem produzida pela próxima camada mais alta dentro de seu próprio campo de carga enquanto uma mensagem estiver sendo enviada. Quando uma mensagem é recebida, cada camada descasca a parte relevante para essa camada e encaminha sua carga útil para a próxima camada apropriada na pilha. Isto é verdade, não apenas USB, mas quase todos os barramento de comunicação. A pilha TCP / IP / Ethernet é provavelmente a mais comumente usada, por exemplo. As tarefas pelas quais determinadas camadas são normalmente responsáveis são descritas em modelos, como o modelo OSI .
No USB, existe um protocolo de camada física que define os estados de tensão / temporização / etc. no fio e como eles devem ser interpretados. Esse protocolo obviamente precisa fazer parte dos próprios padrões USB, não específicos de um determinado dispositivo (especialmente porque o host não tem como saber que tipo de dispositivo está prestes a ser conectado a uma determinada porta USB).
A seguir, há um protocolo de gerenciamento de barramento, usado para descrever quem pode falar no ônibus quando. Isso é chamado de camada de acesso à mídia no modelo OSI. Em USB, esta camada pode ser resumida como "o dispositivo pode transmitir quando o host lhe diz para fazer isso", então não há um protocolo particularmente complicado nesta camada em USB.
Em seguida, há um protocolo padrão para descrever um pacote de dados e como ele deve ser roteado a partir do remetente para o receptor. Essa camada também precisa fazer parte do próprio padrão USB, de modo que a comunicação inicial para descobrir que tipo de dispositivo foi anexado pode acontecer antes que o tipo específico de dispositivo seja realmente conhecido pelo host. Além de cada dispositivo ter um ID específico nessa camada, há também o conceito em USB de um ID de terminal. Isso permite que qualquer dispositivo tenha vários terminais USB, que são multiplexados e desmultiplexados pela pilha USB padrão, da mesma forma que os soquetes são multiplexados e desmultiplexados pela pilha TCP / IP padrão. Um aplicativo pode tratar cada um desses pontos de extremidade como fluxos de dados separados.
Finalmente, há o protocolo definido para o próprio dispositivo. Observe que, na verdade, existem alguns pré-desenhados comuns incluídos como parte do padrão USB para casos de uso comum, como dispositivos de armazenamento em massa, mouses, teclados etc., para que todos os fabricantes de dispositivos não precisem reinventar o roda. No entanto, dispositivos mais complicados estão livres para projetar seu próprio protocolo personalizado nessa camada. A saída dessa camada para uma determinada transmissão é passada como a carga útil de um pacote de dados na camada anterior. Observe que, para dispositivos suficientemente complicados, a parte específica do dispositivo do protocolo pode ser dividida em várias camadas independentes, mas os níveis inferiores não precisam saber ou se preocupar com isso. Tudo o que eles precisam saber é que precisam passar um determinado conjunto de bytes do host para um endpoint de dispositivo específico ou de um endpoint de dispositivo específico para o host. Novamente, ter a interface padrão entre camadas permite a separação de interesses, portanto, uma camada não precisa se preocupar com o funcionamento interno de outra camada, mas apenas com os dados específicos que ela deve passar ou esperar receber das camadas imediatamente acima ou abaixo dela na pilha.