protokoły binarne a protokoły tekstowe


97

czy ktoś ma dobrą definicję tego, co to jest protokół binarny? a czym właściwie jest protokół tekstowy? jak to się ma do siebie pod względem liczby bitów przesłanych w sieci?

oto co Wikipedia mówi o protokołach binarnych:

Protokół binarny to protokół, który jest przeznaczony lub oczekiwany do odczytu przez maszynę, a nie przez człowieka ( http://en.wikipedia.org/wiki/Binary_protocol )

Och przestań!

aby było jasne, jeśli mam plik jpg, w jaki sposób zostałby on przesłany przez protokół binarny, a jak przez tekstowy? oczywiście pod względem bitów / bajtów przesyłanych przewodem.

pod koniec dnia, jeśli spojrzysz na łańcuch, sam jest tablicą bajtów, więc rozróżnienie między dwoma protokołami powinno opierać się na tym, jakie rzeczywiste dane są wysyłane w sieci. innymi słowy, w jaki sposób dane początkowe (plik jpg) są kodowane przed wysłaniem.


Odpowiedzi:


174

Protokół binarny a protokół tekstowy nie dotyczy tak naprawdę kodowania binarnych obiektów blob. Różnica polega naprawdę na tym, czy protokół jest zorientowany na struktury danych, czy na ciągi tekstowe. Podam przykład: HTTP. HTTP jest protokołem tekstowym, nawet jeśli wysyła obraz jpeg, po prostu wysyła nieprzetworzone bajty, a nie kodowanie tekstu.

Ale to, co sprawia, że ​​HTTP jest protokołem tekstowym, to fakt, że wymiana w celu pobrania pliku jpg wygląda następująco:

Żądanie:

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

Odpowiedź:

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>

Zauważ, że można to bardzo łatwo upakować znacznie ściślej w strukturę, która wyglądałaby (w C) jakoś

Żądanie:

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;
};

Odpowiedź:

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[];
};

Gdzie nazwy pól w ogóle nie musiałyby być przesyłane i gdzie, na przykład, responseTypew strukturze odpowiedzi jest liczba całkowita o wartości 200 zamiast trzech znaków „2” 0 „0”. Tym właśnie jest protokół tekstowy: zaprojektowany tak, aby był przekazywany jako płaski strumień (zwykle czytelnych dla człowieka) wierszy tekstu, a nie jako ustrukturyzowane dane wielu różnych typów.


20
+1 dla definicji 1-liniowej „Różnica polega naprawdę na tym, czy protokół jest zorientowany na struktury danych, czy na ciągi tekstowe”.
Frank Shearar

2
Tyler, dzięki za odpowiedź, raczej głęboką, którą powinienem powiedzieć. Scenariusz dla maniaków, który opiera się na tym, na co wszyscy się zgadzamy, w podróży tylko zera i 1. powiedz mi proszę, czy to oddaje to, o czym myślisz. powiedz, że chcę wysłać numer 15 (dec) przez sieć (masz 2 identyczne komputery w sieci, bez dużego / małego chaosu indyjskiego itp.). jeśli mam zamiar używać protokołu binarnego (powiedzmy, że wyślę go przez gniazdo TCP), będzie to przesyłane jako 00001111, ale jeśli mam zamiar używać protokołu tekstowego, będzie to 00110001 (ASCII dla znaku 1) ORAZ 00110101 (ASCII dla znaku 5) prawda czy bzdury? :)
der_grosse

1
To jest poprawne. Zaletą robienia tego w sposób tekstowy jest nie tylko czytelność dla człowieka, ale także brak konieczności martwienia się o endianness, jeśli liczby są dłuższe niż jeden bajt.
Tyler McHenry

1
Nie zgadzam się z definicją 1-liniową ani z przykładem wysłania znaku 15, żeby zobaczyć różnice, jak umieściłem w mojej odpowiedzi, musisz znać cały zestaw znaków i ograniczniki / protokół, nie możesz powiedzieć na podstawie pojedynczego przykładu danych, jeśli protokół jest oparty na tekście lub w systemie binarnym. Możesz "patrzeć" na kabel i zobaczyć 65 (znak 'A'), a nadal nie możesz powiedzieć, że jest to protokół tekstowy lub binarny. Oba mogą mieć taką samą reprezentację dla jednego znaku lub nie, ale to nie jest fundamentalne.
Hernán Eche

25

Oto swoista definicja wykroczenia:

Dowiesz się, kiedy to zobaczysz.

Jest to jeden z tych przypadków, w których bardzo trudno jest znaleźć zwięzłą definicję obejmującą wszystkie przypadki narożne. Ale jest to również jeden z tych przypadków, w których przypadki narożne są całkowicie nieistotne, ponieważ po prostu nie występują w prawdziwym życiu.

Prawie wszystkie protokoły, które napotkasz w prawdziwym życiu, będą wyglądać tak:

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

[Wyobraź sobie mnóstwo innych niedrukowalnych bzdur. Jednym z wyzwań związanych z przekazaniem różnicy między tekstem a binarnymi jest to, że musisz przekazać tekst :-)]

Lub tak:

< 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

[Właśnie wymyśliłem to na miejscu.]

Po prostu nie ma tam zbyt wielu niejasności.

Inną definicją, którą czasami słyszałem, jest

protokół tekstowy to taki, który można debugować za pomocą telnet

Może ja pokazuję moje nerdiness tutaj, ale nie faktycznie napisany i czytać wiadomości e-mail za pośrednictwem protokołu SMTP i POP3, czytać artykuły usenet przez NNTP i przeglądać strony internetowe za pośrednictwem protokołu HTTP przy użyciu telnet, dla żadnego innego powodu niż żeby zobaczyć, czy to rzeczywiście dzieło.

Właściwie pisząc to, znowu złapałem gorączkę:

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.

Cholera, minęło sporo czasu, odkąd to zrobiłem. Sporo błędów tam :-)


7

Przykłady protokołów binarnych: RTP , TCP , IP .

Przykłady protokołów tekstowych: SMTP , HTTP , SIP .

Powinno to pozwolić na uogólnienie na rozsądną definicję protokołów binarnych i tekstowych.

Wskazówka: po prostu przejdź do przykładowych sekcji lub diagramów. Służą do zilustrowania kołyszącej odpowiedzi Tylera .


1
Frank, dzięki za linki, ale kiedy skończę z RFC, będzie 2099 :) Chciałem odpowiedzi od ludzi, którzy już je przeczytali. Nadal zastanawiam się nad odpowiedzią Tylera McHenry'ego ...
der_grosse

Muszę powiedzieć, świetne udostępnianie.
Iqra.

5

Jak większość z was sugerowała, nie możemy rozróżnić, czy protokół jest binarny, czy tekstowy, po prostu patrząc na zawartość w sieci

AFIK

Protokół binarny - bity to granica Kolejność jest bardzo ważna

Np. RTP

Pierwsze dwa bity to wersja. Następny bit to bit MarkUp

Protokół tekstu - ograniczniki specyficzne dla protokołu Kolejność pól nie jest ważna

Np. SIP

Co więcej, w protokole binarnym możemy podzielić bajt, tj. Pojedynczy bit może mieć określone indywidualne znaczenie; W protokole tekstowym minimalną znaczącą jednostką jest BYTE. Nie możesz podzielić bajtu.


2

Oba używają innego zestawu znaków, tekstowego, używają zredukowanego zestawu znaków, binarny zawiera wszystko, co może, nie tylko „litery” i „cyfry” (dlatego wikipedia mówi „istota ludzka”)

o będzie bardziej jasne, jeśli mam plik jpg, w jaki sposób zostałby on przesłany za pomocą protokołu binarnego i jak> poprzez protokół tekstowy? oczywiście pod względem bitów / bajtów przesyłanych przewodem.

powinieneś przeczytać ten Base64

wszelkie uwagi są mile widziane, staram się dotrzeć do istoty rzeczy.

Myślę, że istotą zawężenia zestawu znaków jest zawężenie złożoności i osiągnięcie przenośności, kompatybilności. Trudniej jest ułożyć i zgodzić się z wieloma, aby uszanować szeroki zestaw znaków (lub szeroki cokolwiek). Alfabet łaciński / łaciński i cyfry arabskie są znane na całym świecie. (Oczywiście istnieją inne kwestie związane z redukcją kodu, ale to jest główny)

Powiedzmy, że w protokołach binarnych "kontrakt" między częściami dotyczy bitów, pierwszy bit oznacza to, drugie tamto itd. Lub nawet bajty (ale z możliwością swobodnego używania zestawu znaków bez myślenia o przenośności), na przykład w zamkniętym systemie lub (blisko standardów sprzętowych), jednak jeśli projektujesz system otwarty, musisz wziąć pod uwagę, w jaki sposób twoje kody będą reprezentowane w szerokim zestawie sytuacji, na przykład jak będą reprezentowane w maszynie po drugiej stronie świata ?, więc oto protokoły tekstowe, w których umowa będzie tak standardowa, jak to tylko możliwe. Zaprojektowałem oba i to były powody, binarne dla bardzo niestandardowych rozwiązań oraz tekst dla systemów otwartych i / lub przenośnych.


Wiem o base64 io tym, co robi i dokładnie to miałem na myśli, kiedy pisałem to pytanie. base64 jest dobry, gdy chcę wysłać cokolwiek w jego reprezentacji ASCII (kodowaniu), aby był to protokół tekstowy. technicznie dzieli wejście bitowe na pary po 6, wykorzystuje tablicę przeglądową i tak dalej. Czy ktoś może podać podobne wyjaśnienie, jak działa binarny procol? pytanie dodatkowe: na jakim poziomie OSI możemy mówić o protokołach binarnych i tekstowych i jakie jest dokładne znaczenie tych światów na tych poziomach?
der_grosse

1
Przykładami plików binarnych są protokoły niskiego poziomu, takie jak prosta komunikacja szeregowa ( en.wikipedia.org/wiki/Asynchronous_serial_communication ) lub sposób przechowywania danych w pamięci ( en.wikipedia.org/wiki/Data_structure_alignment ). O OSI… cóż, ponieważ protokoły tekstowe i binarne są używane do reprezentowania danych (nie tylko do komunikacji), nie muszą być na żadnym poziomie OSI, powiedział, że mogę powiedzieć, że warstwy 1, 2, 3, 4 mają „binarne protokół "i" protokół tekstowy "mogą być ustawione na 5,6,7.
Hernán Eche

1

Jak możemy wysłać plik obrazu w SOAP: Kliknij tutaj

Pokazuje to, że dane binarne są dołączone jako takie [ZAŁĄCZNIK], a ich odniesienie jest zapisywane w komunikacie SOAP.

Tak więc protokół jest oparty na tekście, a dane [Obraz] to załącznik binarny, którego kodowanie nie jest istotne

Tak więc SOAP jest protokołem tekstowym ze względu na sposób, w jaki określamy nagłówki Soap, a nie faktyczne zakodowane w nim dane.


0

Myślę, że źle to zrozumiałeś. To nie protokół określa, jak dane wyglądają na „przewodzie”, ale typ danych określa, którego protokołu należy użyć do ich transmisji. Weźmy na przykład gniazdo tcp, plik jpeg zostanie wysłany i odebrany za pomocą protokołu binarnego, ponieważ są to dane binarne (nieczytelne dla człowieka, bajty mieszczące się w zakresie 32-126 ascii), ale możesz wysłać / odzyskać plik tekstowy z oba protokoły i nie zauważysz różnicy.


nie, nie sądzę, nie sądzę, że to źle Nadal szukam (dobrej) definicji tego, CZYM JEST protokół binarny. przykład z jpeg miał na celu wyjaśnienie mojego pytania i nic więcej, nie czyń go w centrum pytania. Powinienem powiedzieć, że protokół określa, jak wyglądają dane przesyłane przewodem, w przeciwnym razie dlaczego jest to protokół?
der_grosse

Podałem ci dokładną definicję, musisz tylko uważnie przeczytać. „Protokół binarny zarządza bajtami z zakresu 32-126 ascii, zwanymi również znakami niedrukowalnymi”
Simone Margaritelli

protokoły tekstowe obsługują te również, dzieląc je na mniejsze, które będą pasować do tabeli ASCII. i tak dalej. więc w najlepszym przypadku twoja definicja jest niejasna. ale dzięki za wkład.
der_grosse

0

Protokół tekstowy może być zrozumiały i obszerny. Jest to oczywiste, ponieważ wiadomość zawiera nazwy pól tylko w samej wiadomości. Nie możesz zrozumieć, która wartość oznacza w komunikacie protokołu binarnego, jeśli nie odniesiesz się do specyfikacji protokołu.

Jest obszerny, co oznacza, że ​​HTTP jako protokół tekstowy po prostu tworzy proste reguły, ale możesz rozszerzyć strukturę danych, swobodnie dodając nowe nagłówki lub zmieniając typ zawartości, aby transportować różne ładunki. Nagłówki są metadanymi i mają możliwość negocjacji i automatycznej adaptacji.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.