Todo tiene que ver con el arbitraje. Cualquier sistema que requiera la conexión de múltiples dispositivos necesita alguna forma de determinar quién debe hablar y cuándo. Hay diferentes esquemas, como es de esperar, según la aplicación.
Un ejemplo común: en las redes tenemos muchos nodos que se comunican entre sí. Esto lo hace cada nodo que tiene una dirección (por ejemplo, dirección IP), y cuando un nodo quiere hablar con otro nodo, envía un paquete a esa dirección. Luego tiene dispositivos como enrutadores que toman los paquetes que ingresan en múltiples puertos y los reenvían al puerto correcto. El arbitraje se realiza utilizando la memoria para almacenar paquetes hasta que el puerto de destino esté libre.
Ahora a USB. En realidad, esto es mucho más simple que las redes porque no todos los nodos son iguales. Tiene dos tipos, un host y un punto final. Solo hay un host, pero puede haber muchos puntos finales. En este caso, el arbitraje es mucho más fácil porque solo el puerto host puede hablar a voluntad. Los puntos finales solo pueden hablar cuando el host lo solicita , y el anfitrión solo habla con un punto final a la vez.
Para los paquetes host-> punto final, los concentradores USB simplemente pasan la solicitud del host a todos los puntos finales. Como todos los puntos finales tienen una dirección, solo el destinatario de la solicitud hará algo con ella (por ejemplo, responder), todos los demás ignorarán el paquete.
Para el punto final-> paquetes de host, el host primero envía un paquete a un punto final específico por dirección para decir "puede hablar ahora", y luego ese punto final debe enviar inmediatamente una respuesta. Debido a que solo un punto final puede hablar en un momento dado, el concentrador USB simplemente enrutará el paquete desde el puerto que responda a una solicitud del host.
En términos de cómo el host calcula qué dispositivos están conectados y cómo el punto final obtiene su dirección, esto se logra mediante la enumeración.
Todos los puertos host y hub tienen resistencias desplegables (15kOhm) en las líneas D + y D-. Estos ponen las líneas de datos de ese puerto en un estado conocido cuando no hay ningún dispositivo conectado, un estado en el que el puerto no enviará ningún dato a través de las líneas D + / D-.
Cuando se conecta un dispositivo, se da a conocer conectando la línea de datos D + (velocidad completa) o D- (velocidad baja) a VCC usando una resistencia de 1.5kOhm. Esto desencadena un evento de enumeración. El puerto comenzará el proceso de configuración del dispositivo y la asignación de una dirección. Si tuviera que conectar dos dispositivos simultáneamente, se enumerarán uno a la vez .
Si no hay concentradores, el host simplemente habla con el nuevo dispositivo y lo configura. Si hay concentradores en el sistema, es el concentrador el que informa que el nuevo dispositivo está conectado . Si un concentrador informa que un nuevo dispositivo está conectado, el anfitrión le indicará al concentrador que reinicie el nuevo dispositivo y comience las comunicaciones. Durante el restablecimiento, el punto final recibe una dirección predeterminada de 0 (*). Luego, el host puede comunicarse con el punto final utilizando la dirección predeterminada y configurarlo con una dirección única distinta de cero que le permitirá saber cuándo se está hablando.
(*) Debido a que solo se enumera un dispositivo a la vez, la dirección 0 siempre será única para el dispositivo recién conectado.
A continuación, puede preguntar, "bueno, ¿cómo puedo tener varios dispositivos todos hablando al mismo tiempo?". Supongamos que tiene un mouse, un teclado y una unidad flash, todos conectados al mismo concentrador USB. Todos sabemos que puede usar su mouse y teclado al mismo tiempo mientras también copia archivos a / desde su unidad flash, pero si solo un dispositivo puede hablar a la vez, ¿cómo puede ser posible?
Bueno, todo se reduce al hecho de que los pocos cientos de milisegundos que le toma a su cerebro notar que presionó una tecla y espera que la pantalla se actualice es una eternidad para la computadora. Una interfaz USB 2.0 puede funcionar a una velocidad de hasta 480Mbps (¡USB 3.1 puede funcionar a una velocidad de hasta 10Gbps!), Lo que significa que aunque el host solo está hablando con un punto final en un momento dado, alterna entre ellos tan rápido que puede No digas que lo está haciendo.
Host USB: "Oye, mouse en el puerto 1, dime si te has movido. Ok, ahora, en el teclado del puerto 2, ¿tienes que presionar alguna tecla para informar? Ahora estás en el puerto 3, unidad flash, almacena estos datos para mí. ¿Alguien más con quien necesito hablar? No, ok, entonces, pase el mouse por el puerto 1, dígame si se ha mudado ... "
Humano: "Oh, mira, la computadora notó que simplemente moví mi mouse, presioné una tecla en mi teclado y copié una imagen en la unidad flash, ¡todo al mismo tiempo!"
El dispositivo host realiza un seguimiento de qué direcciones de punto final se utilizan y enviará paquetes a cada uno de forma secuencial o según sea necesario (es decir, cuando el sistema operativo solicite acceso a un dispositivo específico). Entonces, si bien no todo sucede simultáneamente, el arbitraje es tan rápido que las computadoras que son mascotas no pueden notar la diferencia.