El USB 2.0 puede transferir 60 MB por segundo. ¿Por qué siempre, desde mi primer día en un ordenador hace 15 años, sólo he conseguido 20 MB por segundo como máximo?

Bueno, lo primero que hay que observar es que el modo de alta velocidad USB no puede realmente transferir a 60MB/s. Ese número es técnicamente la velocidad nominal de la interfaz, 480Mb/s, convertida a MB/s, pero esa es la velocidad del cable físico de bajo nivel.

Vamos a retroceder un segundo y mirar lo que es realmente el USB. El típico conector USB 1.x/2.x tiene cuatro cables: +5Vdc, D+, D- y GND. Así que tienes una fuente de alimentación de 5Vdc y un único cable diferencial para todo el protocolo y la transferencia de datos. La señalización diferencial es para la integridad de los datos: se envía la misma información en D+ y D-, pero con la polaridad invertida. En el receptor, esto permite filtrar todo el ruido de «modo común», es decir, el ruido que afecta a cada cable de la misma manera.

Ahora considere la velocidad de bits de 480Mb/s… si estoy transmitiendo a esa velocidad a través de lo que es efectivamente un solo cable, el receptor en el otro extremo necesita muestrear los datos con un reloj de algún tipo… ¿cómo sabe dónde están las transiciones de datos? Como en casi todas las transferencias de datos, los datos en USB se transmiten de forma sincrónica – los cambios de datos se producen de forma predecible en base a una señal de reloj.

En un bus paralelo, como PCI, hay una señal de reloj real en el bus, y todas las transiciones en ese bus están cronometradas en relación con el reloj PCI. Pero en un bus serie como el USB, sólo hay un cable que tiene que enviar de forma eficiente tanto los datos como la información de reloj.

Resulta que el USB, y de hecho la mayoría de los buses serie modernos de alta velocidad, utilizan un par de protocolos de datos avanzados que permiten al receptor deducir la información de reloj del flujo de datos. Hay un bucle de bloqueo de fase en el extremo del receptor que se sincroniza con los cambios en los datos seriales entrantes. Sin embargo, para que esto funcione bien, los datos deben tener transiciones regulares: enviar demasiados ceros o demasiados unos seguidos permitiría que el reloj del receptor se desviara del reloj del transmisor.

Así que, por un lado, USB on the wire utiliza un protocolo llamado NRZI. La polaridad de la señal no representa 1’s y 0’s directamente, sino que cambia. El estado actual se mantiene si el bit de datos es un 1, el estado actual se cambia en un 0. NRZI es un medio eficiente de transmisión, pero no asegura por sí mismo que la señal cambie con la suficiente frecuencia como para mantener los PLLs sincronizados. Se puede imaginar una larga cadena de 0’s, que daría lugar a una transición de estado por cada bit de reloj. Pero una larga cadena de 1’s, sin ayuda adicional, no produciría ningún cambio. Por eso, el USB utiliza una técnica llamada «relleno de bits»… añade una transición extra después de seis bits «1» seguidos, lo que, por supuesto, hace que se invierta la polaridad de los datos. Debido a esto, la tasa de datos en el peor de los casos es en realidad 6/7 de la tasa de datos en el mejor de los casos, o sea 411Mb/s = 51MB/s (gracias a Per Oresjo por la corrección… había puesto aquí algunas cosas del USB 3.0 que en realidad no están en el USB 2.0).

Pero eso no es todo. Una vez más, en un bus paralelo, hay señales extra para la gestión del bus. Algunos tienen señales de dirección y datos separadas, señales de arbitraje del bus, señales de interrupción, señales de tipo de transacción del bus, etc. Esto se maneja en cada tipo de bus serie definiendo algún tipo de paquete de datos. Encontrarás esto en USB, Ethernet, PCI Express, Firewire, incluso el antiguo bus I2C de dos hilos.

main-qimg-fa1318b756f27101d531014126c16260.webp

Ahora, antes de profundizar demasiado, considera que USB soporta transferencias isócronas – es decir, una transferencia que tiene características de tiempo garantizadas. En los malos tiempos del bus ISA, era bastante complicado conseguir que algo tan simple como una tarjeta de sonido funcionara bien. Las mejores tenían que tener grandes búferes de memoria para hacer frente al comportamiento entrecortado del bus. Las transferencias USB incorporan el tiempo como algo fundamental, y como tal, funcionan muy bien con el audio y otros requisitos de datos en tiempo real.

Un resultado de esto es que las transferencias de paquetes se construyen alrededor del tiempo. El USB tiene un tiempo de trama de 1ms. Las transferencias más lentas se basan en estos marcos de 1ms. Las transferencias de alta velocidad dividen la trama en ocho microtramas, cada una de 125μs de longitud. Eso es, por supuesto, por controlador de host, también. Es muy probable que en tu PC tengas uno o dos controladores de host que alimenten cuatro, ocho o quizás más puertos USB. Así que ese pico de transferencia posible se divide probablemente de varias maneras. Y sí, incluso mover su unidad a un puerto diferente puede posiblemente acelerarlo.

Hay diferentes tipos de transferencias a través de USB. La primera es la transferencia de control, que es más o menos sólo las comunicaciones de host USB a destino USB, de alta velocidad, pero bastante bajo contenido de datos, que se utiliza para las configuraciones. La siguiente es la transferencia isócrona, que garantiza el ancho de banda del bus. Se necesita para el audio, el vídeo, etc. Un punto final isócrono de alta velocidad/alto ancho de banda puede transferir paquetes de 1024 bytes a un pico de 192Mb/s, o 24MB/s. El siguiente es la transferencia por interrupción, que garantiza ciertos tiempos de latencia, y se utiliza sobre todo para aplicaciones de bajo ancho de banda que generan datos a intervalos aleatorios.

Y por último, está el modo de transferencia masiva. Ese es el que nos interesa aquí. Se basa en paquetes de 512 bytes, hasta 13 paquetes de este tipo enviados por microframa. Por tanto, una velocidad de transferencia máxima teórica, ignorando todos los demás tipos de paquetes, ofrece 512 bytes * 13 microfotogramas * 8 microfotogramas/fotograma * 1000 fotogramas/segundo = 53 MB/s. También es bastante común que los controladores USB permitan sólo 10 u 8 paquetes por microfotograma, produciendo picos de 41 MB/s o 33 MB/s, respectivamente.

Y también es importante tener en cuenta que los paquetes masivos llegan a utilizar «lo que sobra» en el bus USB. En el caso de una unidad, habrá paquetes de interrupción (la unidad le dice al host USB que tiene los datos listos para transferir), paquetes de control (el host le dice a uno de los objetivos de su bus USB lo que va a hacer) y quizás otras cosas como los paquetes isócronos (¿tiene un ratón o un teclado en el mismo hub?) que siempre tienen prioridad sobre los paquetes de transferencia masiva. Así que su kilometraje puede, como siempre, variar.

Vea más aquí: http://sdphca.ucsd.edu/Lab_Equip_Manuals/usb_20.pdf

Y eso es sólo USB. Tu dispositivo real puede tener otros problemas. Los discos duros tienen latencia para las búsquedas, las unidades flash no necesariamente leen tan rápido como la interfaz USB, etc. También hay un poco de sobrecarga del sistema operativo, aunque en los ordenadores modernos, no es mucho.