Un flujo de bits (o bit stream ), también conocido como secuencia binaria , es una secuencia de bits . Un flujo de bytes es una secuencia de bytes . Normalmente, cada byte es una cantidad de 8 bits , por lo que el término flujo de octetos a veces se utiliza indistintamente. Un octeto puede codificarse como una secuencia de 8 bits de múltiples formas diferentes (consulte numeración de bits ), por lo que no existe una traducción única y directa entre flujos de bytes y flujos de bits.
Los flujos de bits y de bytes se utilizan ampliamente en telecomunicaciones e informática . Por ejemplo, los flujos de bits sincrónicos se transmiten mediante SONET , y el Protocolo de Control de Transmisión transmite un flujo de bytes asincrónico .
En la práctica, los flujos de bits no se utilizan directamente para codificar flujos de bytes; un canal de comunicación puede utilizar un método de señalización que no se traduce directamente a bits (por ejemplo, transmitiendo señales de múltiples frecuencias) y normalmente también codifica otra información, como el encuadre y la corrección de errores, junto con sus datos. [ cita requerida ]
El término flujo de bits se utiliza con frecuencia para describir los datos de configuración que se cargarán en una matriz de puertas programables en campo (FPGA). Aunque la mayoría de las FPGA también admiten un método de carga de bytes en paralelo, este uso puede haberse originado en función del método común de configuración de la FPGA a partir de un flujo de bits en serie, normalmente desde una PROM en serie o un chip de memoria flash . El formato detallado del flujo de bits para una FPGA en particular suele ser propiedad del proveedor de la FPGA.
En matemáticas, se han estudiado varias secuencias infinitas específicas de bits por sus propiedades matemáticas; estas incluyen la secuencia de Baum-Sweet , la secuencia de Ehrenfeucht-Mycielski , la palabra de Fibonacci , la secuencia de Kolakoski , la secuencia de plegado de papel regular , la secuencia de Rudin-Shapiro y la secuencia de Thue-Morse .
En la mayoría de los sistemas operativos , incluidos los de tipo Unix y Windows , las bibliotecas de E/S estándar convierten el acceso a archivos paginados o almacenados en búfer de nivel inferior en un paradigma de flujo de bytes. En particular, en los sistemas operativos de tipo Unix, cada proceso tiene tres flujos estándar , que son ejemplos de flujos de bytes unidireccionales. El mecanismo de canalización de Unix proporciona comunicaciones de flujo de bytes entre diferentes procesos.
Los algoritmos de compresión suelen codificar en flujos de bits, ya que los 8 bits que ofrece un byte (la unidad de memoria direccionable más pequeña) pueden ser un desperdicio. Aunque normalmente se implementan en lenguajes de bajo nivel , algunos lenguajes de alto nivel como Python [1] y Java [2] ofrecen interfaces nativas para E/S de flujo de bits.
Un ejemplo bien conocido de un protocolo de comunicación que proporciona un servicio de flujo de bytes a sus clientes es el Protocolo de Control de Transmisión (TCP) del conjunto de protocolos de Internet , que proporciona un flujo de bytes bidireccional.
El tipo de medio de Internet para un flujo de bytes arbitrario es application/octet-stream . Se definen otros tipos de medios para flujos de bytes en formatos conocidos.
A menudo, el contenido de un flujo de bytes se crea dinámicamente, como los datos del teclado y otros periféricos (/dev/tty), los datos del generador de números pseudoaleatorios ( /dev/urandom ), etc.
En esos casos, cuando el destino de un flujo de bytes (el consumidor) utiliza bytes más rápido de lo que pueden generarse, el sistema utiliza la sincronización de procesos para hacer que el destino espere hasta que el siguiente byte esté disponible.
Cuando los bytes se generan más rápido de lo que el destino puede usarlos y el productor es un algoritmo de software, el sistema lo pausa con las mismas técnicas de sincronización de procesos. Cuando el productor admite el control de flujo , el sistema solo envía la señal de listo cuando el consumidor está listo para el siguiente byte. Cuando no se puede pausar el productor (un teclado o algún hardware que no admita el control de flujo), el sistema generalmente intenta almacenar temporalmente los datos hasta que el consumidor esté listo para ellos, generalmente usando una cola . A menudo, el receptor puede vaciar el búfer antes de que se llene por completo. Un productor que continúa produciendo datos más rápido de lo que se pueden consumir, incluso después de que el búfer esté lleno, conduce a un desbordamiento de búfer no deseado , pérdida de paquetes , congestión de red y denegación de servicio .