ikili protokoller ve metin protokolleri


94

İkili protokolün ne olduğuna dair iyi bir tanımı olan var mı? ve aslında bir metin protokolü nedir? bunlar tele gönderilen bitler açısından birbirleriyle nasıl karşılaştırılır?

wikipedia ikili protokoller hakkında şunları söylüyor:

İkili protokol, bir insan yerine bir makine tarafından okunması amaçlanan veya beklenen bir protokoldür ( http://en.wikipedia.org/wiki/Binary_protocol )

Ah, hadi ama!

Daha açık olmak gerekirse, jpg dosyam varsa, bu bir ikili protokol aracılığıyla nasıl gönderilir ve nasıl bir metin yoluyla gönderilir? elbette tel üzerinden gönderilen bit / bayt cinsinden.

günün sonunda, eğer bir dizgeye bakarsanız, kendisi bir bayt dizisidir, bu nedenle 2 protokol arasındaki ayrım, kablo üzerinden gönderilen gerçek veriye dayanmalıdır. başka bir deyişle, ilk verilerin (jpg dosyası) gönderilmeden önce nasıl kodlandığı hakkında.


Yanıtlar:


169

İkili protokol ve metin protokolü aslında ikili blobların nasıl kodlandığı ile ilgili değildir. Fark, gerçekten de protokolün veri yapıları etrafında mı yoksa metin dizeleri etrafında mı yönlendirildiğidir. Bir örnek vereyim: HTTP. HTTP bir metin protokolüdür, bir jpeg görüntüsü gönderirken, yalnızca ham baytları gönderir, bunların metin kodlamasını değil.

Ama ne HTTP kılan bir metin protokol değişimi için olmasıdır olsun böyle jpg görünüyor:

İstek:

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

Tepki:

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>

Bunun (C'de) bir şeye benzeyen bir yapıya çok daha sıkı bir şekilde paketlenmiş olabileceğini unutmayın.

İstek:

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

Tepki:

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

Alan adlarının hiç iletilmesinin gerekmediği ve örneğin responseTypeyanıt yapısında üç karakter '2' '0' '0' yerine 200 değerine sahip bir int olduğu durumlarda. Metin tabanlı bir protokol budur: birçok farklı türde yapılandırılmış verilerden ziyade düz (genellikle insan tarafından okunabilir) metin satırları olarak iletilmek üzere tasarlanmış bir protokol.


19
1 satırlı tanım için +1 "Fark, gerçekten protokolün veri yapıları etrafında mı yoksa metin dizeleri etrafında mı yönlendirildiğidir."
Frank Shearar

2
Tyler, cevabın için teşekkürler, oldukça derin bir cevap söylemeliyim. sadece 0'lar ve 1'ler tel seyahatinde hepimizin hemfikir olduğumuz şeye dayanan inek senaryosu. lütfen söyle bana bu bahsettiğiniz şeyi yakalayıp yakalamıyor Diyelim ki ağ üzerinden 15 (dec) numarayı göndermek istiyorum (ağ üzerinde 2 aynı bilgisayarınız var, büyük / küçük Hint kaosu yok vb.). bir ikili protokol kullanacaksam (diyelim ki bunu bir TCP soketinden gönderiyorum) bu telde 00001111 olarak gidecek, ancak bir metin protokolü kullanacaksam 00110001 (char 1 için ASCII) olarak gidecek 00110101 (karakter 5 için ASCII) doğru mu yoksa saçma mı? :)
der_grosse

1
Bu doğru. Bunu metin yoluyla yapmanın avantajı, yalnızca insan tarafından okunabilirlik değil, aynı zamanda sayılarınız bir bayttan uzunsa, bitmek bilmemek için endişelenmenize gerek olmamasıdır.
Tyler McHenry

1
1 satırlık tanıma ne de char 15 gönderme örneğine katılmıyorum, farklılıkları görmek için, cevabıma koyduğum gibi, tüm karakter kümesini ve sınırlayıcıları / protokolü bilmeniz gerekir, söyleyemezsiniz Protokolün metin tabanlı mı yoksa ikili tabanlı mı olduğu tek bir veri örneğine göre. Kabloya "bakıyor" olabilir ve bir 65 (karakter "A") görebilirsiniz ve yine de bunun metin tabanlı veya ikili bir protokol olduğunu söyleyemezsiniz. Her ikisi de tek bir karakter için aynı temsile sahip olabilir veya olmayabilir, ancak bu temel değildir.
Hernán Eche

25

İşte bir tür kaçınma tanımı:

Onu gördüğünüzde anlayacaksınız.

Bu, tüm köşe durumlarını kapsayan kısa bir tanım bulmanın çok zor olduğu durumlardan biridir. Ama aynı zamanda, köşe vakalarının tamamen alakasız olduğu durumlardan biridir, çünkü bunlar gerçek hayatta meydana gelmez.

Gerçek hayatta karşılaşacağınız hemen hemen tüm protokoller ya şöyle görünecektir:

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

[Orada bir ton basılamaz saçmalık düşünün. Metin ve ikili metin arasındaki farkı iletmedeki zorluklardan biri, iletimi metinde yapmanız gerekmesidir :-)]

Veya bunun gibi:

< 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

[Bunu yerinde uydurdum.]

Orada o kadar da belirsizlik yok.

Bazen duyduğum başka bir tanım da

bir metin protokolü, kullanarak hata ayıklayabileceğiniz bir telnet

Belki burada benim nerdiness gösteriyorum ama var aslında yazılı ve SMTP ve POP3 aracılığıyla e-posta okumak kullanarak HTTP üzerinden NNTP ile usenet makaleleri ve görüntülenen web sayfalarını okumak telneto iş aslında olur olmadığını görmek için daha başka bir nedenle.

Aslında bunu yazarken ateşi yine yakaladım:

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.

Kahretsin, bunu yapmayalı epey zaman oldu. Orada epeyce hata var :-)


7

İkili protokol örnekleri: RTP , TCP , IP .

Metin protokollerine örnekler: SMTP , HTTP , SIP .

Bu, ikili protokollere karşı metin protokollerinin makul bir tanımına genelleme yapmanıza izin vermelidir.

İpucu: Örnek bölümlere veya diyagramlara atlayın. Tyler'ın müthiş cevabını göstermeye hizmet ediyorlar .


1
Frank, bağlantılar için teşekkürler ama RFC'lerle işim bittiğinde 2099 olacak :) Bunları okumuş insanlardan bazı cevaplar istedim. Yine de Tyler McHenry'nin cevabı üzerine
kafa yoruyorum

Söylemeliyiz, Harika paylaşım.
Iqra.

5

Çoğunuzun önerdiği gibi, sadece teldeki içeriğe bakarak protokolün İkili mi yoksa metin mi olduğunu ayırt edemeyiz.

AFIK

İkili protokol - Bitler sınırdır Sıra çok kritiktir

Ör. RTP

İlk iki bit sürümdür Sonraki bit Biçimlendirme bitidir

Metin protokolü - Protokole özel sınırlayıcılar Alanların sırası önemli değildir

Ör. SIP

Bir tane daha, ikili protokolde, bir baytı bölebiliriz, yani tek bir bitin belirli bir bireysel anlamı olabilir; Bir metin protokolünde minimum anlamlı birim BYTE'dir. Bir baytı bölemezsiniz.


2

Her ikisi de farklı karakter kümesini kullanır, metin bir, indirgenmiş bir karakter kümesi kullanır, ikili, yalnızca "harfleri" ve "sayıları" değil, yapabildiği her şeyi içerir (bu yüzden wikipedia "insan" der)

o daha açık olmak gerekirse, eğer jpg dosyam varsa, bu bir ikili protokol yoluyla nasıl gönderilir ve nasıl> bir metin yoluyla gönderilir? elbette tel üzerinden gönderilen bit / bayt cinsinden.

bu Base64'ü okumalısın

herhangi bir yorum uygunsa, buradaki şeylerin özüne ulaşmaya çalışıyorum.

Bence karakter kümesini daraltmanın özü, karmaşıklığı daraltmak ve taşınabilirliğe, uyumluluğa ulaşmaktır. Geniş bir karakter grubuna (veya geniş bir şeye) saygı duymak için düzenlemek ve birçok kişiyle anlaşmak daha zordur. Latin / Roma alfabesi ve Arap rakamları dünya çapında bilinmektedir. (Kodu azaltmak için elbette başka hususlar da vardır, ancak bu esas olanıdır)

Diyelim ki, ikili protokollerde parçalar arasındaki "sözleşme" bitlerle ilgilidir, ilk bit bunu ifade eder, ikincisi şu, vb. Veya hatta baytlar (ancak taşınabilirliği düşünmeden karakter kümesini kullanma özgürlüğü ile) örneğin özel kapalı sistemde veya (donanım standartlarının yanında), ancak açık bir sistem tasarlarsanız, kodlarınızın geniş bir dizi durumda nasıl temsil edileceğini, örneğin dünyanın diğer tarafındaki bir makinede nasıl temsil edileceğini hesaba katmalısınız. işte sözleşmenin mümkün olduğu kadar standart olacağı metin protokolleri geliyor. Her ikisini de tasarladım ve nedenleri, çok özel çözümler için ikili ve açık ve / veya taşınabilir sistemler için metin.


Base64'ü ve ne işe yaradığını biliyorum ve bu, soruyu gönderirken aklımdaki tam olarak ne oldu. Base64, ASCII gösteriminde (kodlama) bir metin protokolü olması için herhangi bir şey göndermek istediğimde iyidir. teknik olarak, bit girişini 6'lı çiftlere böler, bir arama tablosu kullanır vb. ikili bir prokolün nasıl çalıştığına dair benzer bir açıklama sağlayabilir mi? tamamlayıcı soru: hangi OSI düzeyinde ikili ve metin protokollerinden bahsedebiliriz ve bu düzeylerde bu dünyaların tam anlamı nedir?
der_grosse

1
İkili Örnek basit bir seri iletişim (gibi düşük düzey protokolleridir en.wikipedia.org/wiki/Asynchronous_serial_communication bellek (depolanır) ya da ne kadar veri en.wikipedia.org/wiki/Data_structure_alignment ). OSI hakkında..well metin ve ikili protokoller verileri temsil etmek için kullanıldığından (yalnızca iletişim için değil), herhangi bir OSI düzeyinde olmaları gerekmiyor. 1,2,3,4 katmanında "ikili protokol "ve" metin protokolü "5,6,7'de olabilir.
Hernan Eche

1

SOAP'ta bir resim dosyasını nasıl gönderebiliriz: Buraya tıklayın

Bu, ikili verilerin bu şekilde eklendiğini ve referansının SOAP mesajına kaydedildiğini gösterir.

Dolayısıyla, protokol metin tabanlıdır ve veri [Resim], kodlaması alakalı olmayan ikili bir ektir

Bu nedenle, SABUN, Sabun başlıklarını belirtme şeklimizden dolayı metin protokolüdür ve içinde kodlanmış gerçek veriler değildir.


0

Sanırım yanlış anladın. Verinin "kablo" üzerinde nasıl görüneceğini belirleyen protokol değil, onu iletmek için hangi protokolün kullanılacağını belirleyen veri türüdür. Örneğin tcp soketini ele alalım, ikili bir protokol ile bir jpeg dosyası gönderilecek ve alınacaktır, çünkü ikili veri (insan tarafından okunabilir değil, 32-126 ascii aralığı arasında giden baytlar), ancak bir metin dosyası gönderebilir / alabilirsiniz. hem protokoller hem de farkı fark etmezsiniz.


hayır, yanlış anladığımı sanmıyorum. Hala bir ikili protokol NEDİR'in (iyi) bir tanımını arıyorum. jpeg ile ilgili örnek sorumu açıklığa kavuşturmaktı ve başka hiçbir şey, onu sorunun merkezi haline getirme. Protokolün, verinin kablo üzerinden iletildiğinde nasıl göründüğünü belirlediğini söylemeliyim, aksi halde bu neden bir protokol?
der_grosse

Size kesin bir tanım verdim, sadece dikkatlice okumalısınız. "Bir ikili protokol, 32-126 ascii aralığı arasında giden baytları yönetir, yazdırılamayan karakterler olarak da adlandırılır"
Simone Margaritelli

metin protokolleri bunları ASCII tablosuna uyacak daha küçük olanlara bölerek de işler. ve bunun gibi. en iyi durumda tanımınız belirsizdir. ama katkı için teşekkürler.
der_grosse

0

Metin protokolü kendinden açıklamalı ve kapsamlı olabilir. Kendini açıklayıcıdır çünkü mesaj alan adlarını mesajın kendisinde içerir. Protokol spesifikasyonuna başvurmazsanız ikili protokol mesajında ​​hangi değerin anlamını anlayamazsınız.

Kapsamlıdır, metin protokolü olarak HTTP'nin yalnızca basit kurallar koyduğu anlamına gelir, ancak veri yapısını özgürce yeni başlıklar ekleyerek veya farklı yükleri taşımak için içerik türünü değiştirerek genişletebilirsiniz. Üstbilgiler meta verilerdir ve müzakere ve otomatik olarak uyarlama yeteneğine sahiptir.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.