二进制协议v.文本协议

der*_*sse 82 binary text protocols

有没有人对二进制协议有什么好的定义?实际上什么是文本协议?这些在线上发送的比特如何相互比较?

这是维基百科关于二进制协议的说法:

二进制协议是一种旨在或预期由机器而不是人类读取的协议(http://en.wikipedia.org/wiki/Binary_protocol)

哦加油!

更清楚的是,如果我有jpg文件将如何通过二进制协议发送,如何通过文本?当然,就线路上发送的比特/字节而言.

在一天结束时,如果你看一个字符串,它本身就是一个字节数组,所以2个协议之间的区别应该取决于在线上发送的实际数据.换句话说,关于如何在发送之前编码初始数据(jpg文件).

Tyl*_*nry 146

二进制协议与文本协议实际上并不是关于如何编码二进制blob.区别在于协议是围绕数据结构还是围绕文本字符串.让我举个例子: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
Run Code Online (Sandbox Code Playgroud)

响应:

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>
Run Code Online (Sandbox Code Playgroud)

请注意,这可以非常容易地打包到一个看起来像(在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;
};
Run Code Online (Sandbox Code Playgroud)

响应:

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[];
};
Run Code Online (Sandbox Code Playgroud)

在根本不必传输字段名称的情况下,例如,responseType响应结构中的int是值为200而不是三个字符'2''''0'的int.这就是基于文本的协议:一种旨在作为(通常是人类可读的)文本行的平面流传递的协议,而不是许多不同类型的结构化数据.

  • 1-liner定义的+1"不同之处在于协议是围绕数据结构还是围绕文本字符串." (16认同)
  • 泰勒,谢谢你的答案,我应该说一个相当深刻的答案.我们都同意的极客场景,在线路上只有0和1的旅行.请告诉我这是否能抓住你的想法.说我想通过网络发送15号(十二月)(你在网络上有两台相同的电脑,没有大/小的印度混乱等).如果我打算使用二进制协议(比方说我通过TCP套接字发送它),这将作为00001111传输,但如果我要使用文本协议,它将作为00110001(char 1的ASCII)和00110101(char 5的ASCII)真或废话?:) (2认同)
  • 没错。以文本方式执行此操作的优点不仅是人类可读性,而且如果您的数字长度超过一个字节,则不必担心字节序。 (2认同)
  • 我不同意 1 行定义,也不同意发送 char 15 的示例,要查看差异,正如我在答案中所说,您必须知道整个字符集和分隔符/协议,您不能说如果协议是基于文本或基于二进制的,则基于单个数据示例。您可能“查看”电缆并看到 65(字符“A”),但您仍然不能说它是基于文本的协议或二进制协议。两者对于单个字符可以有相同的表示,也可以不同,但​​这不是根本。 (2认同)

Jör*_*tag 24

这是一种警察定义:

当你看到它时,你会知道它.

这是很难找到涵盖所有极端情况的简明定义的情况之一.但它也是角落案件完全不相关的案例之一,因为它们根本不会发生在现实生活中.

几乎所有在现实生活中遇到的协议都将如下所示:

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

[想象一下那里有大量其他不可打印的垃圾.传达文本和二进制之间差异的挑战之一是你必须在文本中传达:-)]

或者像这样:

< 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
Run Code Online (Sandbox Code Playgroud)

[我刚刚在现场做了这个.]

那里根本没有那么多含糊不清.

我有时听到的另一个定义是

文本协议是您可以使用的协议 telnet

也许我显示我nerdiness这里,但我已经实际写入和读通过SMTP和POP3电子邮件,读通过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.
Run Code Online (Sandbox Code Playgroud)

该死的,自从我做完这件事已经有一段时间了.那里有很多错误:-)


Fra*_*rar 6

二进制协议的示例:RTPTCPIP

文本协议示例:SMTPHTTPSIP

这应该使您可以概括为二进制协议和文本协议的合理定义。

提示:只需跳至示例部分或图表。它们说明了泰勒的摇摆不定


小智 5

正如你们大多数人所建议的,我们仅通过查看网络上的内容就无法区分协议是二进制还是文本

AFIK

二进制协议-位是边界顺序非常关键

例如,RTP

前两位是版本,下一位是标记位

文本协议-特定于协议的分隔符字段顺序不重要

例如,SIP

还有一个是,在二进制协议中,我们可以拆分一个字节,即,单个位可能具有特定的个别含义;在文本协议中,最小有效单位是BYTE。您不能分割一个字节。