giao thức nhị phân v. giao thức văn bản


94

có ai có định nghĩa tốt cho giao thức nhị phân là gì không? và giao thức văn bản thực sự là gì? làm thế nào để những thứ này so sánh với nhau về số bit được gửi trên dây?

đây là những gì wikipedia nói về giao thức nhị phân:

Giao thức nhị phân là một giao thức được thiết kế hoặc dự kiến ​​sẽ được đọc bởi máy chứ không phải con người ( http://en.wikipedia.org/wiki/Binary_protocol )

ồ thôi!

để rõ ràng hơn, nếu tôi có tệp jpg thì nó sẽ được gửi như thế nào qua giao thức nhị phân và làm thế nào thông qua một văn bản? tất nhiên là về bit / byte được gửi trên dây.

Vào cuối ngày, nếu bạn nhìn vào một chuỗi, bản thân nó là một mảng byte, do đó, sự phân biệt giữa 2 giao thức sẽ phụ thuộc vào dữ liệu thực tế nào đang được gửi trên dây. nói cách khác, về cách dữ liệu ban đầu (tệp jpg) được mã hóa trước khi được gửi đi.


có thể trùng lặp của nhị phân vs giao thức văn bản
dkinzer

Câu trả lời:


169

Giao thức nhị phân so với giao thức văn bản không thực sự là về cách các đốm màu nhị phân được mã hóa. Sự khác biệt thực sự là giao thức được định hướng xung quanh cấu trúc dữ liệu hay xung quanh chuỗi văn bản. Hãy để tôi đưa ra một ví dụ: HTTP. HTTP là một giao thức văn bản, mặc dù khi nó gửi một ảnh jpeg, nó chỉ gửi các byte thô chứ không phải mã hóa văn bản của chúng.

Nhưng điều làm cho HTTP trở thành một giao thức văn bản là việc trao đổi để lấy jpg trông giống như sau:

Yêu cầu:

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

Phản ứng:

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>

Lưu ý rằng điều này có thể rất dễ dàng đã được đóng gói chặt chẽ hơn nhiều vào một cấu trúc trông (trong C) giống như

Yêu cầu:

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

Phản ứng:

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

Trường hợp các tên trường sẽ không phải được truyền ở đâu, và ví dụ, responseTypeở đâu, trong cấu trúc phản hồi là một int với giá trị 200 thay vì ba ký tự '2' '0' '0'. Giao thức dựa trên văn bản là như vậy: một giao thức được thiết kế để giao tiếp dưới dạng một dòng văn bản phẳng (thường là con người có thể đọc được), chứ không phải là dữ liệu có cấu trúc thuộc nhiều loại khác nhau.


19
+1 cho định nghĩa 1 chữ lót "Sự khác biệt thực sự là giao thức được định hướng xung quanh cấu trúc dữ liệu hay xung quanh chuỗi văn bản."
Frank Shearar

2
Tyler, cảm ơn vì câu trả lời, một câu trả lời khá sâu sắc mà tôi nên nói. kịch bản lập dị dựa trên những gì tất cả chúng ta đồng ý, trên đường đi chỉ có 0 và 1. Xin vui lòng cho tôi biết liệu điều này có nắm bắt được những gì bạn đề cập. nói rằng tôi muốn gửi số 15 (tháng mười hai) qua mạng (bạn có 2 máy tính giống nhau qua mạng, không có sự hỗn loạn lớn / nhỏ của Ấn Độ, v.v.). nếu tôi định sử dụng giao thức nhị phân (giả sử tôi gửi nó qua ổ cắm TCP), điều này sẽ đi qua dây là 00001111 nhưng nếu tôi định sử dụng giao thức văn bản, nó sẽ là 00110001 (ASCII cho ký tự 1) VÀ 00110101 (ASCII cho char 5) true hay crap? :)
der_grosse

1
Đúng rồi. Lợi thế của việc làm theo cách văn bản không chỉ là khả năng đọc của con người mà còn không phải lo lắng về độ bền nếu các số của bạn dài hơn một byte.
Tyler McHenry

1
Tôi không đồng ý với định nghĩa 1 dòng cũng như với ví dụ về gửi ký tự 15, để thấy sự khác biệt, như tôi đã đưa ra trong câu trả lời của mình, bạn phải biết toàn bộ ký tự và các dấu phân cách / giao thức, bạn không thể nói dựa trên một ví dụ dữ liệu duy nhất nếu giao thức dựa trên văn bản hoặc dựa trên nhị phân. Bạn có thể đang "nhìn" vào cáp và thấy 65 (ký tự 'A') và bạn vẫn không thể nói đó là văn bản dựa trên giao thức nhị phân hay. Cả hai đều có thể có cùng một đại diện cho một ký tự đơn lẻ hoặc không, nhưng điều đó không cơ bản.
Hernán Eche

25

Đây là một định nghĩa kiểu cop-out:

Bạn sẽ biết nó khi bạn nhìn thấy nó.

Đây là một trong những trường hợp rất khó để tìm ra một định nghĩa ngắn gọn bao hàm tất cả các trường hợp góc. Nhưng nó cũng là một trong những trường hợp mà các trường hợp góc hoàn toàn không liên quan, bởi vì chúng chỉ đơn giản là không xảy ra trong cuộc sống thực.

Khá nhiều giao thức mà bạn gặp trong cuộc sống thực sẽ giống như sau:

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

[Hãy tưởng tượng ở đó có rất nhiều thứ tào lao không thể in được khác. Một trong những thách thức trong việc truyền tải sự khác biệt giữa văn bản và hệ nhị phân là bạn phải truyền tải trong văn bản :-)]

Hoặc như thế này:

< 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

[Tôi chỉ làm điều này ngay tại chỗ.]

Đơn giản là không có nhiều sự mơ hồ ở đó.

Một định nghĩa khác mà đôi khi tôi đã nghe là

giao thức văn bản là một giao thức mà bạn có thể gỡ lỗi bằng cách sử dụng telnet

Có thể tôi đang thể hiện sự ngớ ngẩn của mình ở đây, nhưng tôi đã thực sự viết và đọc e-mail qua SMTP và POP3, đọc các bài báo usenet qua NNTP và xem các trang web qua HTTP bằng cách sử dụng telnet, không vì lý do gì khác hơn là để xem liệu nó có thực sự hoạt động hay không.

Trên thực tế, trong khi viết bài này, tôi đã gây sốt một lần nữa:

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.

Chết tiệt, đã lâu rồi tôi chưa làm việc này. Có khá nhiều lỗi trong đó :-)


7

Ví dụ về giao thức nhị phân: RTP , TCP , IP .

Ví dụ về giao thức văn bản: SMTP , HTTP , SIP .

Điều này sẽ cho phép bạn khái quát thành một định nghĩa hợp lý về giao thức nhị phân và văn bản.

Gợi ý: chỉ cần chuyển đến các phần ví dụ hoặc sơ đồ. Chúng minh họa cho câu trả lời gây chấn động của Tyler .


1
Frank, cảm ơn vì các liên kết nhưng khi tôi làm xong với RFC thì sẽ là năm 2099 :) Tôi muốn một số câu trả lời từ những người đã đọc chúng. Tôi vẫn đang cân nhắc về câu trả lời Tyler McHenry của mặc dù ...
der_grosse

Phải nói, Chia sẻ tuyệt vời.
Iqra.

5

Như hầu hết các bạn đã đề xuất, chúng tôi không thể phân biệt giao thức là Binary hay text đơn giản bằng cách xem nội dung trên dây

AFIK

Giao thức nhị phân - Bit là ranh giới Thứ tự rất quan trọng

Ví dụ: RTP

Hai bit đầu tiên là phiên bản Bit tiếp theo là bit MarkUp

Giao thức văn bản - Dấu phân cách cụ thể cho giao thức Thứ tự của các trường không quan trọng

Ví dụ: SIP

Một điều nữa là, trong giao thức nhị phân, chúng ta có thể chia một byte, tức là, một bit đơn lẻ có thể có một ý nghĩa riêng lẻ cụ thể; Trong khi trong một giao thức văn bản, đơn vị có ý nghĩa tối thiểu là BYTE. Bạn không thể chia một byte.


2

Cả hai đều sử dụng tập ký tự khác nhau, văn bản, sử dụng tập hợp ký tự rút gọn, nhị phân bao gồm tất cả những gì có thể, không chỉ "chữ cái" và "số", (đó là lý do tại sao wikipedia nói "con người")

o nói rõ hơn, nếu tôi có tệp jpg thì làm thế nào mà tệp đó sẽ được gửi qua giao thức nhị phân và làm thế nào> thông qua một văn bản? tất nhiên là về bit / byte được gửi trên dây.

bạn nên đọc Base64 này

bất kỳ coments nào đều được ứng dụng, tôi đang cố gắng đi đến bản chất của mọi thứ ở đây.

Tôi nghĩ rằng bản chất để thu hẹp bộ ký tự là thu hẹp độ phức tạp và đạt được tính di động, tương thích. Thật khó để sắp xếp và đồng ý với nhiều người để tôn trọng một bộ ký tự Rộng, (hoặc một bộ ký tự rộng). Bảng chữ cái Latinh / La Mã và các chữ số Ả Rập được biết đến trên toàn thế giới. (Tất nhiên có những cân nhắc khác để giảm mã, nhưng đó là một trong những điều chính)

Giả sử trong các giao thức nhị phân, "hợp đồng" giữa các phần là về bit, bit đầu tiên có nghĩa là này, thứ hai là, v.v. hoặc thậm chí là byte (nhưng với quyền tự do sử dụng bộ ký tự mà không cần suy nghĩ về tính di động) ví dụ như trong hệ thống đóng đặc biệt hoặc (gần giá đỡ phần cứng), tuy nhiên, nếu bạn thiết kế một hệ thống mở, bạn phải tính đến cách mã của bạn sẽ được biểu diễn trong một loạt các tình huống, ví dụ như cách nó sẽ được biểu diễn trong một máy ở phía bên kia thế giới ?, vậy ở đây có các giao thức văn bản, nơi hợp đồng sẽ càng độc lập càng tốt. Tôi đã thiết kế cả hai và đó là lý do, nhị phân cho các giải pháp và văn bản rất tùy chỉnh cho các hệ thống mở hoặc / và di động.


Tôi biết về base64 và những gì nó hoạt động và đây chính xác là điều tôi đã nghĩ đến khi đăng câu hỏi. base64 rất tốt khi tôi muốn gửi bất kỳ thứ gì trong biểu diễn ASCII (mã hóa) của nó để đó sẽ là một giao thức văn bản. về mặt kỹ thuật, nó chia bit đầu vào thành các cặp 6, sử dụng bảng tra cứu, v.v. bất cứ ai có thể cung cấp một số giải thích tương tự cho cách một procol nhị phân hoạt động? câu hỏi bổ sung: chúng ta có thể nói về giao thức nhị phân và văn bản ở cấp độ OSI nào và ý nghĩa chính xác của những thế giới này ở các cấp độ đó là gì?
der_grosse

1
Ví dụ về nhị phân là các giao thức cấp thấp như giao tiếp nối tiếp đơn giản ( en.wikipedia.org/wiki/Asynchronous_serial_communication ) hoặc cách dữ liệu được lưu trữ trong bộ nhớ ( en.wikipedia.org/wiki/Data_osystem_alignment ). Về OSI.. cũng được vì văn bản và các giao thức nhị phân được sử dụng để biểu diễn dữ liệu (không chỉ cho giao tiếp) chúng không cần phải ở bất kỳ cấp OSI nào, nói rằng, tôi có thể nói với lớp 1,2,3,4 có "nhị phân giao thức "và" giao thức văn bản "có thể nằm trên 5,6,7.
Hernán Eche

1

Làm thế nào chúng tôi có thể gửi một tệp hình ảnh trong SOAP: Nhấp vào đây

Điều này cho thấy rằng dữ liệu nhị phân được đính kèm như [ATTACHMENT] và tham chiếu của nó được lưu trong thông báo SOAP.

Vì vậy, giao thức dựa trên văn bản và dữ liệu [Hình ảnh] là tệp đính kèm nhị phân có mã hóa không liên quan

Do đó, SOAP là giao thức văn bản do cách chúng ta chỉ định tiêu đề Soap chứ không phải dữ liệu thực tế được mã hóa trong đó.


0

Tôi nghĩ bạn đã nhầm. Nó không phải là giao thức xác định cách dữ liệu trông như thế nào trên "dây", nhưng nó là kiểu dữ liệu xác định giao thức sẽ sử dụng để truyền tải nó. Lấy ví dụ như tcp socket, một tệp jpeg sẽ được gửi và nhận bằng giao thức nhị phân vì đó là dữ liệu nhị phân (không phải con người có thể đọc được, các byte nằm trong phạm vi 32-126 ascii), nhưng bạn có thể gửi / gửi lại tệp văn bản bằng cả hai giao thức và bạn sẽ không nhận thấy sự khác biệt.


không, tôi không nghĩ rằng tôi đã sai. Tôi vẫn đang tìm kiếm một định nghĩa (tốt) về giao thức nhị phân LÀ GÌ. ví dụ với jpeg là để làm rõ câu hỏi của tôi và không có gì khác, đừng biến nó thành trung tâm của câu hỏi. Tôi nên nói rằng giao thức xác định dữ liệu trông như thế nào khi được truyền trên dây khác tại sao lại là giao thức ??
der_grosse

Tôi đã cung cấp cho bạn một định nghĩa chính xác, bạn chỉ cần đọc cẩn thận. "Một giao thức nhị phân quản lý byte mà đi trong phạm vi 32-126 ascii, hay còn gọi là các ký tự không in"
Simone Margaritelli

các giao thức văn bản cũng xử lý chúng bằng cách chia chúng thành các giao thức nhỏ hơn sẽ phù hợp với bảng ASCII. và như thế. vì vậy trong trường hợp tốt nhất là định nghĩa của bạn mơ hồ. nhưng cảm ơn vì sự đóng góp.
der_grosse

0

Giao thức văn bản có thể tự giải thích và mở rộng. Nó tự giải thích vì thông báo bao gồm các tên trường ngay trong chính thông báo. Bạn không thể hiểu giá trị nào có nghĩa trong thông điệp của giao thức nhị phân nếu bạn không tham khảo đặc tả giao thức.

Nó mở rộng có nghĩa là HTTP như một giao thức văn bản chỉ cần thực hiện các quy tắc đơn giản nhưng bạn có thể mở rộng cấu trúc dữ liệu bằng cách tự do thêm các tiêu đề mới hoặc bằng cách thay đổi loại nội dung để vận chuyển các trọng tải khác nhau. Và tiêu đề là dữ liệu meta và có khả năng thương lượng và tự động điều chỉnh.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.