binary protocols

binary - protocolos binarios vs texto



protocols (7)

Me pregunto cuáles son las diferencias entre los protocolos binarios y basados ​​en texto. Leí que los protocolos binarios son más compactos / más rápidos de procesar. ¿Cómo funciona eso? ¿Ya que tienes que enviar la misma cantidad de datos? ¿No?

Por ejemplo, ¿cómo se diferenciaría la cadena "hola" en tamaño en formato binario?

Gracias


Debe tener claro qué es parte del protocolo y qué parte de los datos. Los protocolos de texto pueden enviar datos binarios y los protocolos binarios pueden enviar datos de texto.

El protocolo es la parte del mensaje que dice "Hola, ¿me puedo conectar? Tengo algunos datos, ¿dónde debería ponerlo ?, ¿Me han respondido? ¡Muy bien! ¡Gracias, adiós!"

Cada bit de la conversión es (probablemente) mucho más pequeño en un protocolo binario, Take HTTP por ejemplo (que está basado en texto):

si tuvieras un estándar de codificación, apostaba que podrías encontrar la secuencia de caracteres más pequeña que los 4 Bytes necesarios para la palabra ''PUSH''


La cadena "hola" en sí misma no difería en tamaño. La diferencia de tamaño / rendimiento se encuentra en la información adicional que introduce la serialización (la serialización es la forma en que el programa representa los datos que se transferirán para que pueda reconstruirse una vez que llegue al otro extremo del conducto).

Por ejemplo, al serializar lo siguiente en .NET usando XML (uno de los métodos de serialización de texto):

string helloWorld = "Hello World!";

Puede obtener algo como (sé que esto no es exacto):

<helloWorld type="String">Hello World!</helloWorld>

Mientras que la Serialización Binaria sería capaz de representar esos datos de forma nativa en binario sin todo el marcado adicional.


Los protocolos de texto son mejores en términos de legibilidad, facilidad de reimplementación y facilidad de depuración. Los protocolos binarios son más compactos.

Sin embargo, puede comprimir su texto usando una biblioteca como LZO o Zlib, y esto es casi tan compacto como binario (con muy poco rendimiento para compresión / descompresión).

Puedes leer más información sobre el tema aquí:
http://www.faqs.org/docs/artu/ch05s01.html


No diría que los formatos binarios son más rápidos de procesar. Si echas un vistazo al formato de texto CSV o de campo fijo, todavía se puede procesar rápidamente.

Yo diría que todo depende de quién es el consumidor. Si el ser humano está al final (como HTTP o RSS), entonces no hay necesidad de compactar de algún modo los datos, excepto tal vez de comprimirlos.

Los protocolos binarios necesitan analizadores / conversores, son difíciles de extender y mantienen la compatibilidad con versiones anteriores. Cuanto más alto va en la pila de protocolos, más protocolos orientados a los humanos son (TCP es binario, ya que los enrutadores deben procesar los paquetes a gran velocidad, pero XML es más amigable para los humanos).

Creo que las variaciones de tamaño hoy no importan mucho. Para su ejemplo, hello tomará la misma cantidad en formato binario que en formato de texto, porque el formato de texto también es "binario" para la computadora, solo importa la forma en que interpretamos los datos.


Si todo lo que estás haciendo es transmitir texto, entonces sí, la diferencia entre los dos no es muy significativa. Pero considere tratar de transmitir cosas como:

  • Números: ¿usa una representación de cadena de un número o el binario? Especialmente para números grandes, el binario será más compacto.
  • Estructuras de datos: ¿cómo denota el comienzo y el final de un campo en un protocolo de texto? A veces, un protocolo binario con campos de longitud fija es más compacto.

Si usa ASN.1 y BER para enviar "hola" en un mensaje de protocolo como este:

ProtocolMessage ::= String ;

luego toma 1 byte para codificar su octer identificador, toma 1 byte para codificar la longitud y la codificación UTF-8 de "hello" es otros 5 bytes. Entonces el mensaje de resultado es 7 bytes.


los protocolos binarios son mejores si usa bits / bytes de control

es decir, en lugar de enviar msg: Hello in binary, puede ser 0x01 seguido de tu mensaje (suponiendo que 0x01 es un byte de control que representa msg)

Entonces, dado que en el protocolo de texto se envía msg: hello / 0 ... involucra 10 bytes donde, como en el protocolo binario, sería 0x01Hello / 0 ... esto implica 7 bytes

Y otro ejemplo, supongamos que quiere enviar un número, digamos 255, en texto, sus 3 bytes, donde, como en binario, su byte 1 es decir, 0xFF