ไบนารีโปรโตคอล v. โปรโตคอลข้อความ


94

ใครมีคำจำกัดความที่ดีว่าโปรโตคอลไบนารีคืออะไร? แล้วโปรโตคอลข้อความคืออะไร? สิ่งเหล่านี้เปรียบเทียบกันอย่างไรในแง่ของบิตที่ส่งบนสาย?

นี่คือสิ่งที่วิกิพีเดียพูดเกี่ยวกับโปรโตคอลไบนารี:

ไบนารีโปรโตคอลคือโปรโตคอลที่ตั้งใจหรือคาดว่าจะอ่านได้โดยเครื่องไม่ใช่มนุษย์ ( http://en.wikipedia.org/wiki/Binary_protocol )

เข้ามา!

เพื่อให้ชัดเจนยิ่งขึ้นถ้าฉันมีไฟล์ jpg จะส่งผ่านโปรโตคอลไบนารีได้อย่างไรและจะส่งผ่านข้อความได้อย่างไร ในแง่ของบิต / ไบต์ที่ส่งบนสายแน่นอน

ในตอนท้ายของวันถ้าคุณดูที่สตริงมันเป็นอาร์เรย์ของไบต์ดังนั้นความแตกต่างระหว่าง 2 โปรโตคอลควรอยู่ที่ข้อมูลจริงที่ถูกส่งบนสาย กล่าวอีกนัยหนึ่งคือวิธีการเข้ารหัสข้อมูลเริ่มต้น (ไฟล์ jpg) ก่อนที่จะส่ง


เป็นไปได้ที่จะทำสำเนาไบนารีกับโปรโตคอลข้อความ
dkinzer

คำตอบ:


169

โปรโตคอลไบนารีกับโปรโตคอลข้อความไม่ได้เกี่ยวกับการเข้ารหัส binary blobs ความแตกต่างก็คือว่าโปรโตคอลนั้นมุ่งเน้นไปที่โครงสร้างข้อมูลหรือรอบสตริงข้อความ ฉันขอยกตัวอย่าง HTTP HTTP เป็นโปรโตคอลข้อความแม้ว่าจะส่งภาพ jpeg แต่ก็ส่งไบต์ดิบเท่านั้นไม่ใช่การเข้ารหัสข้อความ

แต่สิ่งที่ทำให้ HTTP เป็นโปรโตคอลข้อความคือการแลกเปลี่ยนเพื่อรับ jpg มีลักษณะดังนี้:

คำขอ:

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

การตอบสนอง:

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>

โปรดทราบว่าสิ่งนี้สามารถบรรจุได้อย่างแน่นหนามากขึ้นในโครงสร้างที่จะมีลักษณะ (ใน C) เช่น

คำขอ:

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

การตอบสนอง:

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

โดยที่ชื่อเขตข้อมูลจะไม่ต้องถูกส่งเลยและตัวอย่างเช่นresponseTypeในโครงสร้างการตอบกลับเป็น int ที่มีค่า 200 แทนที่จะเป็นอักขระสามตัว '2' '0' '0' นั่นคือสิ่งที่โปรโตคอลที่ใช้ข้อความคือสิ่งที่ออกแบบมาเพื่อสื่อสารเป็นสตรีมแบบแบนของบรรทัดข้อความ (โดยปกติมนุษย์อ่านได้) แทนที่จะเป็นข้อมูลที่มีโครงสร้างในประเภทต่างๆ


19
+1 สำหรับคำจำกัดความ 1 ซับ "ความแตกต่างอยู่ที่ว่าโปรโตคอลจะมุ่งเน้นไปที่โครงสร้างข้อมูลหรือรอบสตริงข้อความ"
Frank Shearar

2
ไทเลอร์ขอบคุณสำหรับคำตอบที่ค่อนข้างลึกที่ฉันควรพูด สถานการณ์เกินบรรยายที่อยู่บนสิ่งที่เราทุกคนเห็นพ้องต้องกันบนสายเดินทางเพียง 0 และ 1 โปรดบอกฉันว่าสิ่งนี้จับสิ่งที่คุณพูดถึง บอกว่าฉันต้องการส่งหมายเลข 15 (ธันวาคม) ผ่านเครือข่าย (คุณมีคอมพิวเตอร์ 2 เครื่องที่เหมือนกันบนเครือข่ายไม่มีความวุ่นวายแบบอินเดียขนาดใหญ่ / เล็ก ๆ น้อย ๆ ฯลฯ ) ถ้าฉันจะใช้โปรโตคอลไบนารี (บอกว่าฉันส่งผ่านซ็อกเก็ต TCP) สิ่งนี้จะไปต่อสายเป็น 00001111 แต่ถ้าฉันจะใช้โปรโตคอลข้อความมันจะเป็น 00110001 (ASCII สำหรับถ่าน 1) และ 00110101 (ASCII สำหรับถ่าน 5) จริงหรืออึ? :)
der_grosse

1
ถูกต้อง. ข้อดีของการทำแบบข้อความไม่ใช่แค่ความสามารถในการอ่านของมนุษย์เท่านั้น แต่ยังไม่ต้องกังวลเกี่ยวกับ endianness หากตัวเลขของคุณมีความยาวมากกว่าหนึ่งไบต์
Tyler McHenry

1
ฉันไม่เห็นด้วยกับคำจำกัดความ 1 บรรทัดทั้งกับตัวอย่างของการส่งถ่าน 15 เพื่อดูความแตกต่างตามที่ฉันใส่ไว้ในคำตอบคุณต้องรู้ชุดอักขระทั้งหมดและตัวคั่น / โปรโตคอลคุณไม่สามารถพูดได้ ขึ้นอยู่กับตัวอย่างข้อมูลเดียวหากโปรโตคอลเป็นแบบข้อความหรือไบนารี คุณอาจกำลัง "มอง" ที่สายเคเบิลและเห็น 65 (ถ่าน 'A') และคุณยังไม่สามารถบอกได้ว่าเป็นข้อความหรือโปรโตคอลไบนารี ทั้งสองอาจมีการแทนค่าเดียวกันสำหรับอักขระตัวเดียวหรือไม่ก็ได้ แต่นั่นไม่ใช่พื้นฐาน
Hernán Eche

25

นี่คือคำจำกัดความของ cop-out:

คุณจะรู้เมื่อเห็น

นี่เป็นหนึ่งในกรณีเหล่านั้นที่ยากมากที่จะหาคำจำกัดความที่กระชับครอบคลุมทุกกรณี แต่ก็เป็นหนึ่งในกรณีเหล่านั้นเช่นกันที่กรณีมุมนั้นไม่เกี่ยวข้องโดยสิ้นเชิงเพราะไม่ได้เกิดขึ้นในชีวิตจริง

โปรโตคอลทั้งหมดที่คุณจะพบในชีวิตจริงจะมีลักษณะดังนี้:

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

[ลองนึกภาพอึที่พิมพ์ไม่ได้อีกมากมายที่นั่น ความท้าทายอย่างหนึ่งในการถ่ายทอดความแตกต่างระหว่างข้อความและไบนารีคือคุณต้องทำการถ่ายทอดเป็นข้อความ :-)]

หรือเช่นนี้:

< 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

[ฉันเพิ่งทำตรงนี้]

ไม่มีความคลุมเครือมากนักที่นั่น

คำจำกัดความอีกอย่างที่บางครั้งฉันเคยได้ยินก็คือ

โปรโตคอลข้อความเป็นโปรโตคอลที่คุณสามารถแก้ไขข้อบกพร่องได้ telnet

บางทีฉันอาจแสดงความขี้เบื่อของฉันที่นี่ แต่ฉันได้เขียนและอ่านอีเมลผ่าน SMTP และ POP3 อ่านบทความ usenet ผ่าน NNTP และดูหน้าเว็บผ่าน HTTP โดยtelnetไม่มีเหตุผลอื่นใดนอกจากเพื่อดูว่าจะใช้งานได้จริงหรือไม่

อันที่จริงในขณะที่เขียนสิ่งนี้ฉันก็เป็นไข้อีกครั้ง:

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.

ประณามฉันทำสิ่งนี้มานานพอสมควรแล้ว มีข้อผิดพลาดค่อนข้างน้อย :-)


7

ตัวอย่างของโปรโตคอลไบนารี: RTP , TCP , IP

ตัวอย่างของโปรโตคอลข้อความ: SMTP , HTTP , SIP

สิ่งนี้จะช่วยให้คุณเข้าใจคำจำกัดความที่สมเหตุสมผลของโปรโตคอลไบนารีกับข้อความ

คำแนะนำ: เพียงข้ามไปที่ส่วนตัวอย่างหรือแผนภาพ พวกเขาทำหน้าที่เพื่อแสดงให้เห็นคำตอบโยกของไทเลอร์


1
Frank ขอบคุณสำหรับลิงค์ แต่เมื่อฉันจะทำกับ RFC มันจะเป็นปี 2099 :) ฉันต้องการคำตอบจากคนที่อ่านมาแล้ว ฉันยังคงครุ่นคิดถึงคำตอบของ Tyler McHenry อยู่แม้ว่า ...
der_grosse

ต้องบอกว่าการแบ่งปันที่ยอดเยี่ยม
อิกร้า.

5

ตามที่คุณส่วนใหญ่แนะนำเราไม่สามารถแยกความแตกต่างได้ว่าโปรโตคอลเป็นไบนารีหรือข้อความเพียงแค่ดูที่เนื้อหาบนสาย

AFIK

ไบนารีโปรโตคอล - Bits คือขอบเขตลำดับมีความสำคัญมาก

เช่น RTP

สองบิตแรกคือเวอร์ชันบิตถัดไปคือบิตมาร์กอัป

โปรโตคอลข้อความ - ตัวคั่นเฉพาะสำหรับโปรโตคอลลำดับของฟิลด์ไม่สำคัญ

เช่น SIP

อีกประการหนึ่งคือในโปรโตคอลไบนารีเราสามารถแบ่งไบต์ได้กล่าวคือบิตเดียวอาจมีความหมายเฉพาะเจาะจง ในขณะที่อยู่ในหน่วยความหมายขั้นต่ำของโปรโตคอลข้อความคือ BYTE คุณไม่สามารถแบ่งไบต์ได้


2

ทั้งสองใช้ชุดอักขระที่แตกต่างกันข้อความที่หนึ่งใช้ชุดอักขระที่ลดลงไบนารีรวมทุกอย่างที่ทำได้ไม่เพียง แต่ "ตัวอักษร" และ "ตัวเลข" (นั่นคือเหตุผลที่วิกิพีเดียพูดว่า "มนุษย์")

จะชัดเจนยิ่งขึ้นถ้าฉันมีไฟล์ jpg จะส่งผ่านโปรโตคอลไบนารีได้อย่างไรและ> ผ่านข้อความได้อย่างไร ในแง่ของบิต / ไบต์ที่ส่งบนสายแน่นอน

คุณควรอ่านBase64นี้

ผู้แสดงความคิดเห็นทุกคนชื่นชมฉันพยายามเข้าถึงสาระสำคัญของสิ่งต่างๆที่นี่

ฉันคิดว่าสาระสำคัญสำหรับการ จำกัด ชุดอักขระให้แคบลงคือการ จำกัด ความซับซ้อนให้แคบลง ยากที่จะจัดเรียงและเห็นด้วยกับหลาย ๆ คนที่จะเคารพชุดอักขระแบบกว้าง (หรือแบบกว้าง ๆ ) อักษรละติน / โรมันและตัวเลขอารบิกเป็นที่รู้จักกันทั่วโลก (แน่นอนว่ามีข้อควรพิจารณาอื่น ๆ ในการลดโค้ด แต่นั่นเป็นข้อพิจารณาหลัก)

สมมติว่าในโปรโตคอลไบนารี "สัญญา" ระหว่างชิ้นส่วนนั้นเกี่ยวกับบิตบิตแรกหมายถึงสิ่งนี้วินาทีนั้น ฯลฯ .. หรือแม้แต่ไบต์ (แต่มีอิสระในการใช้ชุดอักขระโดยไม่ต้องคิดในการพกพา) เช่นในระบบปิดส่วนตัว หรือ (ใกล้กับมาตรฐานฮาร์ดแวร์) อย่างไรก็ตามหากคุณออกแบบระบบเปิดคุณต้องพิจารณาว่ารหัสของคุณจะแสดงในสถานการณ์ต่างๆอย่างไรเช่นจะแสดงในเครื่องที่อีกด้านหนึ่งของโลกอย่างไรดังนั้น นี่คือโปรโตคอลข้อความที่สัญญาจะเป็นมาตรฐานตามที่เป็นไปได้ ฉันได้ออกแบบทั้งสองอย่างและนั่นคือเหตุผลไบนารีสำหรับโซลูชันและข้อความที่กำหนดเองสำหรับระบบเปิดหรือ / และแบบพกพา


ฉันรู้เกี่ยวกับ base64 และมันทำอะไรและนี่คือสิ่งที่ฉันคิดไว้เมื่อฉันโพสต์คำถาม base64 เป็นสิ่งที่ดีเมื่อฉันต้องการส่งอะไรก็ตามในการแสดง ASCII (การเข้ารหัส) เพื่อให้เป็นโปรโตคอลข้อความ ทางเทคนิคจะแยกบิตอินพุตออกเป็นคู่ 6 ใช้ตารางค้นหาและอื่น ๆ ใครสามารถให้คำอธิบายที่คล้ายกันเกี่ยวกับการทำงานของไบนารีโปรคอลได้บ้าง คำถามเสริม: OSI ระดับใดที่เราสามารถพูดคุยเกี่ยวกับโปรโตคอลไบนารีและข้อความและอะไรคือความหมายที่แท้จริงของโลกเหล่านี้ในระดับเหล่านั้น?
der_grosse

1
ตัวอย่างของไบนารีคือโปรโตคอลระดับต่ำเช่นการสื่อสารแบบอนุกรมธรรมดา ( en.wikipedia.org/wiki/Asynchronous_serial_communication ) หรือวิธีจัดเก็บข้อมูลในหน่วยความจำ ( en.wikipedia.org/wiki/Data_structure_alignment ) เกี่ยวกับ OSI .. ดีเพราะข้อความและโปรโตคอลไบนารีถูกใช้เพื่อแสดงข้อมูล (ไม่เพียง แต่สำหรับการสื่อสารเท่านั้น) พวกเขาไม่จำเป็นต้องอยู่ในระดับ OSI ใด ๆ กล่าวว่าฉันสามารถบอกได้ว่าเลเยอร์ 1,2,3,4 มี "ไบนารี protocol "และ" text protocol "ได้บน 5,6,7
Hernán Eche

1

เราจะส่งไฟล์ภาพใน SOAP ได้อย่างไร: คลิกที่นี่

สิ่งนี้แสดงให้เห็นว่ามีการแนบข้อมูลไบนารีเป็น [ATTACHMENT] และการอ้างอิงจะถูกบันทึกไว้ในข้อความ SOAP

ดังนั้นโปรโตคอลจึงเป็นแบบข้อความและข้อมูล [รูปภาพ] เป็นไฟล์แนบไบนารีซึ่งการเข้ารหัสไม่เกี่ยวข้อง

ดังนั้น SOAP จึงเป็นโปรโตคอลข้อความเนื่องจากวิธีที่เราระบุส่วนหัวของ Soap และไม่ใช่ข้อมูลจริงที่เข้ารหัสไว้


0

ฉันคิดว่าคุณเข้าใจผิด ไม่ใช่โปรโตคอลที่กำหนดลักษณะข้อมูลบน "สาย" แต่เป็นประเภทข้อมูลที่กำหนดว่าจะใช้โปรโตคอลใดในการส่งข้อมูล ยกตัวอย่างเช่นใช้ซ็อกเก็ต tcp ไฟล์ jpeg จะถูกส่งและรับด้วยโปรโตคอลไบนารีเนื่องจากเป็นข้อมูลไบนารี (ไม่ใช่ข้อมูลที่มนุษย์สามารถอ่านได้ไบต์ที่อยู่ในช่วง 32-126 ascii) แต่คุณสามารถส่ง / รับไฟล์ข้อความด้วย ทั้งสองโปรโตคอลและคุณจะไม่สังเกตเห็นความแตกต่าง


ไม่ฉันไม่คิดว่าฉันเข้าใจผิด ฉันยังคงมองหาคำจำกัดความ (ที่ดี) ของโปรโตคอลไบนารีคืออะไร ตัวอย่างที่มี jpeg คือการชี้แจงคำถามของฉันและไม่มีอะไรอื่นอย่าทำให้เป็นศูนย์กลางของคำถาม ฉันควรจะบอกว่าโปรโตคอลเป็นตัวกำหนดว่าข้อมูลมีลักษณะอย่างไรเมื่อส่งบนสายอื่น ๆ ทำไมโปรโตคอลนั้น
der_grosse

ฉันให้คำจำกัดความที่ชัดเจนคุณต้องอ่านอย่างละเอียด "โปรโตคอลไบนารีจัดการไบต์ที่อยู่ในช่วง 32-126 ascii หรือเรียกอีกอย่างว่าอักขระที่ไม่สามารถพิมพ์ได้"
Simone Margaritelli

โปรโตคอลข้อความจะจัดการกับสิ่งเหล่านี้ด้วยโดยการแบ่งออกเป็นโปรโตคอลที่เล็กลงซึ่งจะพอดีกับตาราง ASCII และอื่น ๆ ดังนั้นในกรณีที่ดีที่สุดคือคำจำกัดความของคุณคลุมเครือ แต่ขอบคุณสำหรับการมีส่วนร่วม
der_grosse

0

โปรโตคอลข้อความสามารถอธิบายได้ด้วยตนเองและครอบคลุม เป็นคำอธิบายในตัวเองเนื่องจากข้อความมีชื่อเขตข้อมูลอยู่ในข้อความเท่านั้น คุณไม่สามารถเข้าใจว่าค่าใดหมายถึงในข้อความของโปรโตคอลไบนารีหากคุณไม่อ้างถึงข้อกำหนดของโปรโตคอล

HTTP เป็นโปรโตคอลข้อความที่กว้างขวางเพียงแค่สร้างกฎง่ายๆ แต่คุณสามารถขยายโครงสร้างข้อมูลได้โดยการเพิ่มส่วนหัวใหม่อย่างอิสระหรือโดยการเปลี่ยนประเภทเนื้อหาเพื่อขนส่งข้อมูลที่แตกต่างกัน และส่วนหัวเป็นข้อมูลเมตาและมีความสามารถในการเจรจาและปรับเปลี่ยนโดยอัตโนมัติ

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.