Como quase todos os outros tipos de interface de comunicação, o USB é implementado como uma pilha de protocolos. Os níveis nessa pilha que são comuns a todos ou vários tipos de dispositivos são definidos pelos próprios padrões USB, o que permite compatibilidade e impede que cada dispositivo faça um design de protocolo redundante. Além disso, cada camada do protocolo abstrai os detalhes com os quais a próxima camada acima não precisa se preocupar. Portanto, quando você está realmente escrevendo a camada específica do dispositivo, você apenas possui funções genéricas de 'enviar' e 'receber' que obtêm dados do ponto A ao ponto B. Você, como designer do dispositivo, não precisa se preocupar com como isso acontece. Além disso, níveis mais baixos na pilha de protocolos podem alterar 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 ser alterado.qual protocolo está sendo usado em algum nível inferior da pilha. De um modo geral, cada camada consecutiva abaixo da pilha encapsulará a mensagem produzida pela próxima camada mais alta dentro de seu próprio campo de carga quando uma mensagem estiver sendo enviada. Quando uma mensagem é recebida, cada camada separa a parte relevante para essa camada e encaminha sua carga útil para a próxima camada apropriada na pilha. Isso vale não apenas para USB, mas para quase todos os barramentos de comunicação. A pilha TCP / IP / Ethernet é provavelmente a mais usada, por exemplo. As tarefas pelas quais as camadas são geralmente responsáveis são descritas em modelos, como o modelo OSI .
No USB, existe um protocolo de camada física que define estados de tensão / tempo / etc. no fio e como eles devem ser interpretados. Obviamente, esse protocolo precisa fazer parte dos padrões USB, não específico 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).
Em seguida, há um protocolo de gerenciamento de barramento, usado para descrever quem pode falar no barramento quando. Isso é chamado de camada de acesso à mídia no modelo OSI. No USB, essa camada pode ser resumida como "o dispositivo pode transmitir quando o host solicita", para que não exista um protocolo particularmente complicado nessa camada no USB.
A seguir, há um protocolo padrão para descrever um pacote de dados e como ele deve ser roteado do remetente para o destinatário. Essa camada também precisa fazer parte do próprio padrão USB, para que a comunicação inicial para descobrir que tipo de dispositivo foi conectado possa ocorrer 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, também existe o conceito em USB de um ID de terminal. Isso permite que qualquer dispositivo tenha vários pontos de extremidade USB, que são multiplexados e desmultiplexados pela pilha USB padrão, da mesma maneira 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é-projetados comuns incluídos como parte do padrão USB para casos de uso comuns, como dispositivos de armazenamento em massa, mouses, teclados etc., para que todo fabricante de dispositivos não precise reinventar o roda. No entanto, dispositivos mais complicados podem criar 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 protocolo do dispositivo pode ser dividida em várias camadas independentes, mas os níveis mais baixos 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 terminal em particular do dispositivo ou de um terminal em particular para o host. Mais uma vez, ter a interface padrão entre as camadas permite a separação de preocupações; portanto, uma camada não precisa se preocupar com o funcionamento interno de outra camada, mas apenas os dados específicos aos quais deve passar ou esperar receber das camadas imediatamente acima ou abaixo na pilha.