protocolli binari v. protocolli di testo


94

qualcuno ha una buona definizione di cosa sia un protocollo binario? e cos'è effettivamente un protocollo di testo? come si confrontano tra loro in termini di bit inviati sul filo?

ecco cosa dice wikipedia sui protocolli binari:

Un protocollo binario è un protocollo che dovrebbe essere letto da una macchina piuttosto che da un essere umano ( http://en.wikipedia.org/wiki/Binary_protocol )

Oh andiamo!

per essere più chiari, se ho un file jpg come verrebbe inviato tramite un protocollo binario e come tramite uno di testo? in termini di bit / byte inviati in rete ovviamente.

alla fine della giornata se guardi una stringa è essa stessa un array di byte, quindi la distinzione tra i 2 protocolli dovrebbe basarsi su quali dati effettivi vengono inviati sul filo. in altre parole, su come i dati iniziali (file jpg) vengono codificati prima di essere inviati.


possibile duplicato di protocolli binari vs testuali
dkinzer

Risposte:


169

Il protocollo binario rispetto al protocollo di testo non riguarda il modo in cui vengono codificati i BLOB binari. La differenza è davvero se il protocollo è orientato attorno a strutture dati o stringhe di testo. Faccio un esempio: HTTP. HTTP è un protocollo di testo, anche se quando invia un'immagine jpeg, invia solo i byte grezzi, non una loro codifica di testo.

Ma ciò che rende HTTP un protocollo di testo è che lo scambio per ottenere il jpg ha questo aspetto:

Richiesta:

GET /files/image.jpg HTTP/1.0
Connection: Keep-Alive
User-Agent: Mozilla/4.01 [en] (Win95; I)
Host: hal.etc.com.au
Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, */*
Accept-Language: en
Accept-Charset: iso-8859-1,*,utf-8

Risposta:

HTTP/1.1 200 OK
Date: Mon, 19 Jan 1998 03:52:51 GMT
Server: Apache/1.2.4
Last-Modified: Wed, 08 Oct 1997 04:15:24 GMT
ETag: "61a85-17c3-343b08dc"
Content-Length: 60830
Accept-Ranges: bytes
Keep-Alive: timeout=15, max=100
Connection: Keep-Alive
Content-Type: image/jpeg

<binary data goes here>

Si noti che questo potrebbe essere stato molto facilmente imballato in modo molto più stretto in una struttura che avrebbe (in C) qualcosa di simile

Richiesta:

struct request {
  int requestType;
  int protocolVersion;
  char path[1024];
  char user_agent[1024];
  char host[1024];
  long int accept_bitmask;
  long int language_bitmask;
  long int charset_bitmask;
};

Risposta:

struct response {
  int responseType;
  int protocolVersion;
  time_t date;
  char host[1024];
  time_t modification_date;
  char etag[1024];
  size_t content_length;
  int keepalive_timeout;
  int keepalive_max;
  int connection_type;
  char content_type[1024];
  char data[];
};

Dove i nomi dei campi non dovrebbero essere trasmessi affatto e dove, ad esempio, responseTypenella struttura della risposta è un int con il valore 200 invece di tre caratteri "2" "0" "0". Questo è ciò che è un protocollo basato su testo: progettato per essere comunicato come un flusso piatto di righe di testo (di solito leggibili dall'uomo), piuttosto che come dati strutturati di molti tipi diversi.


19
+1 per la definizione di una riga "La differenza sta nel fatto che il protocollo sia orientato attorno a strutture di dati o stringhe di testo."
Frank Shearar

2
Tyler, grazie per la risposta, piuttosto profonda dovrei dire. scenario geek che risiede su ciò su cui siamo tutti d'accordo, sul filo viaggiano solo 0 e 1. dimmi, per favore, se questo cattura ciò che dici. diciamo che voglio inviare il numero 15 (dec) sulla rete (hai 2 computer identici sulla rete, nessun grande / piccolo caos indiano ecc.). se intendo utilizzare un protocollo binario (diciamo che lo mando tramite un socket TCP) questo andrà in rete come 00001111 ma se userò un protocollo di testo andrà come 00110001 (ASCII per char 1) E 00110101 (ASCII per char 5) vero o schifo? :)
der_grosse

1
È corretto. Il vantaggio di farlo nel modo testuale non è solo la leggibilità umana, ma anche non doversi preoccupare dell'endianness se i tuoi numeri sono lunghi più di un byte.
Tyler McHenry

1
Non sono d'accordo con la definizione di 1 riga né con l'esempio di invio di char 15, per vedere le differenze, come ho inserito nella mia risposta, devi conoscere l'intero set di caratteri ei delimitatori / protocollo, Non puoi dire basato su un singolo esempio di dati se il protocollo è basato su testo o binario. Potresti "guardare" il cavo e vedere un 65 (carattere 'A') e non puoi ancora dire che è un protocollo basato su testo o binario. Entrambi potrebbero avere la stessa rappresentazione per un singolo carattere o meno, ma non è fondamentale.
Hernán Eche

25

Ecco una sorta di definizione di scappatoia:

Lo saprai quando lo vedrai.

Questo è uno di quei casi in cui è molto difficile trovare una definizione concisa che copra tutti i casi d'angolo. Ma è anche uno di quei casi in cui i casi d'angolo sono completamente irrilevanti, perché semplicemente non si verificano nella vita reale.

Praticamente tutti i protocolli che incontrerai nella vita reale avranno questo aspetto:

> fg,m4wr76389b zhjsfg gsidf7t5e89wriuotu nbsdfgizs89567sfghlkf
>  b9er t8ß03q+459tw4t3490ß´5´3w459t srt üßodfasdfäasefsadfaüdfzjhzuk78987342
< mvclkdsfu93q45324äö53q4lötüpq34tasä#etr0 awe+s byf eart

[Immagina un sacco di altra merda non stampabile lì. Una delle sfide nel trasmettere la differenza tra testo e binario è che devi fare il trasporto nel testo :-)]

O in questo modo:

< HELLO server.example.com
> HELLO client.example.com
< GO
> GETFILE /foo.jpg
< Length: 3726
< Type: image/jpeg
< READY?
> GO
< ... server sends 3726 bytes of binary data ...
> ACK
> BYE

[L'ho appena inventato sul posto.]

Semplicemente non c'è molta ambiguità lì.

Un'altra definizione che a volte ho sentito è

un protocollo di testo è quello che puoi eseguire il debug utilizzando telnet

Forse sto mostrando la mia nerdità qui, ma in realtà ho scritto e letto e-mail tramite SMTP e POP3, letto articoli usenet tramite NNTP e visualizzato pagine Web tramite HTTP utilizzando telnet, per nessun altro motivo se non per vedere se avrebbe funzionato effettivamente.

In realtà, mentre scrivevo questo, ho preso di nuovo la febbre:

bash-4.0$ telnet smtp.googlemail.com 25
Trying 74.125.77.16...
Connected to googlemail-smtp.l.google.com.
Escape character is '^]'.
< 220 googlemail-smtp.l.google.com ESMTP Thu, 15 Apr 2010 19:19:39 +0200
> HELO
< 501 Syntactically invalid HELO argument(s)
> HELO client.example.com
< 250 googlemail-smtp.l.google.com Hello client.example.com [666.666.666.666]
> RCPT TO:Me <Me@Example.Com>
< 503 sender not yet given
> SENDER:Me <Me@Example.Com>
< 500 unrecognized command
> RCPT FROM:Me <Me@Example.Com>
< 500 unrecognized command
> FROM:Me <Me@Example.Com>
< 500-unrecognized command
> HELP
< 214-Commands supported:
< 214 AUTH HELO EHLO MAIL RCPT DATA NOOP QUIT RSET HELP ETRN
> MAIL FROM:Me <Me@Example.Com>
< 250 OK
> RCPT TO:You <You@SomewhereElse.Example.Com>
< 250 Accepted
> DATA
< 354 Enter message, ending with "." on a line by itself
> From: Me <Me@Example.Com>
> To: You <You@SomewhereElse.Example.Com>
> Subject: Testmail
>
> This is a test.
> .
< 250 OK id=1O2Sjq-0000c4-Qv
> QUIT
< 221 googlemail-smtp.l.google.com closing connection
Connection closed by foreign host.

Dannazione, è passato un po 'di tempo dall'ultima volta che l'ho fatto. Ci sono un bel po 'di errori :-)


7

Esempi di protocolli binari: RTP , TCP , IP .

Esempi di protocolli di testo: SMTP , HTTP , SIP .

Ciò dovrebbe consentire di generalizzare a una definizione ragionevole di protocolli binari e di testo.

Suggerimento: passa semplicemente alle sezioni di esempio o ai diagrammi. Servono per illustrare la risposta eccitante di Tyler .


1
Frank, grazie per i link ma quando avrò finito con le RFC sarà il 2099 :) Volevo alcune risposte da persone che le hanno già lette. Sto ancora riflettendo sulla risposta di Tyler McHenry però ...
der_grosse

Devo dire, grande condivisione.
Iqra.

5

Come molti di voi hanno suggerito, non possiamo distinguere se il protocollo è binario o testuale semplicemente guardando il contenuto in rete

AFIK

Protocollo binario: i bit sono limite L'ordine è molto critico

Ad esempio, RTP

I primi due bit sono la versione Il bit successivo è il bit MarkUp

Protocollo di testo - Delimitatori specifici del protocollo L'ordine dei campi non è importante

Ad esempio, SIP

Un altro è che, nel protocollo binario, possiamo dividere un byte, cioè un singolo bit potrebbe avere un significato individuale specifico; Mentre in un protocollo di testo l'unità minima significativa è BYTE. Non puoi dividere un byte.


2

Entrambi usano un set di caratteri diverso, quello testuale, usa un set di caratteri ridotto, il binario include tutto ciò che può, non solo "lettere" e "numeri", (ecco perché wikipedia dice "essere umano")

o essere più chiari, se ho un file jpg come verrebbe inviato tramite un protocollo binario e come> tramite uno di testo? in termini di bit / byte inviati in rete ovviamente.

dovresti leggere questo Base64

eventuali commenti sono apprezzati, sto cercando di arrivare all'essenza delle cose qui.

Penso che l'essenza per restringere il set di caratteri sia restringere la complessità e raggiungere la portabilità, la compatibilità. È più difficile organizzare e concordare con molti per rispettare un set di caratteri Wide, (o un ampio qualunque). L'alfabeto latino / romano e i numeri arabi sono conosciuti in tutto il mondo. (Ci sono ovviamente altre considerazioni per ridurre il codice, ma questa è la principale)

Diciamo che nei protocolli binari il "contratto" tra le parti riguarda i bit, il primo bit significa questo, il secondo quello, ecc. O anche i byte (ma con la libertà di usare il set di caratteri senza pensare alla portabilità) per esempio nel sistema chiuso privato o (vicino agli standard hardware), tuttavia se progetti un sistema aperto devi tenere conto di come i tuoi codici saranno rappresentati in un ampio insieme di situazioni, ad esempio come saranno rappresentati in una macchina dall'altra parte del mondo ?, quindi ecco che arrivano i protocolli di testo in cui il contratto sarà il più standard possibile. Ho progettato entrambi e questo era il motivo, binario per soluzioni molto personalizzate e testo per sistemi aperti e / e portatili.


Conosco base64 e cosa fa e questo è esattamente quello che avevo in mente quando ho postato la domanda. base64 è utile quando voglio inviare qualsiasi cosa nella sua rappresentazione ASCII (codifica) in modo che sia un protocollo di testo. tecnicamente divide l'ingresso di bit in coppie di 6, utilizza una tabella di ricerca e così via. qualcuno può fornire una spiegazione simile per come funziona un procol binario? Domanda supplementare: a quale livello OSI possiamo parlare di protocolli binari e di testo e qual è il significato esatto di questi mondi a quei livelli?
der_grosse

1
Esempi di binari sono protocolli di basso livello come la semplice comunicazione seriale ( en.wikipedia.org/wiki/Asynchronous_serial_communication ) o il modo in cui i dati vengono archiviati in memoria ( en.wikipedia.org/wiki/Data_structure_alignment ). A proposito di OSI ... beh perché i protocolli di testo e binari sono usati per rappresentare i dati (non solo per la comunicazione) non hanno bisogno di essere a nessun livello OSI, ha detto che, posso dire che il layer 1,2,3,4 ha "binary protocol "e" text protocol "possono essere su 5,6,7.
Hernán Eche

1

Come possiamo inviare un file immagine in SOAP: Clicca qui

Ciò mostra che i dati binari sono allegati come tali [ATTACHMENT] e il relativo riferimento viene salvato nel messaggio SOAP.

Quindi, il protocollo è basato su testo e i dati [Immagine] sono allegati binari la cui codifica non è rilevante

Quindi, SOAP è un protocollo di testo a causa del modo in cui specifichiamo le intestazioni Soap e non i dati effettivi codificati in esso.


0

Penso che tu abbia sbagliato. Non è il protocollo che determina l'aspetto dei dati sul "cavo", ma è il tipo di dati che determina quale protocollo utilizzare per trasmetterli. Prendiamo ad esempio il socket tcp, un file jpeg verrà inviato e ricevuto con un protocollo binario perché sono dati binari (non leggibili dall'uomo, byte compresi nell'intervallo 32-126 ascii), ma puoi inviare / ricevere un file di testo con entrambi i protocolli e non noteresti la differenza.


no, non credo di aver sbagliato. Sto ancora cercando una (buona) definizione di CHE COSA È un protocollo binario. l'esempio con il jpeg era per chiarire la mia domanda e nient'altro, non renderlo il centro della domanda. Dovrei dire che il protocollo determina come appaiono i dati quando vengono trasmessi sul filo, altrimenti perché è un protocollo ??
der_grosse

Ti ho dato una definizione precisa, devi solo leggere attentamente. "Un protocollo binario gestisce byte compresi nell'intervallo 32-126 ascii, chiamati anche caratteri non stampabili"
Simone Margaritelli

i protocolli di testo gestiscono quelli anche suddividendoli in quelli più piccoli che si adattano alla tabella ASCII. e così via. quindi nel migliore dei casi la tua definizione è vaga. ma grazie per il contributo.
der_grosse

0

Il protocollo di testo può essere autoesplicativo ed esteso. È autoesplicativo perché il messaggio include i nomi dei campi solo nel messaggio stesso. Non è possibile capire quale valore significhi nel messaggio del protocollo binario se non si fa riferimento alla specifica del protocollo.

È esteso significa che HTTP come protocollo di testo crea solo regole semplici ma puoi estendere la struttura dei dati aggiungendo liberamente nuove intestazioni o cambiando il tipo di contenuto per trasportare diversi payload. E le intestazioni sono i metadati e hanno la capacità di negoziazione e adattamento automatico.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.